{
  "groups": [
    {
      "id": "drawing",
      "name": "Drawing structures",
      "blurb": "The everyday tools for getting a molecule on the page."
    },
    {
      "id": "reactions",
      "name": "Reactions and mechanisms",
      "blurb": "Arrows, schemes and machine-readable reactions."
    },
    {
      "id": "figures",
      "name": "Figures and layout",
      "blurb": "What turns a structure into a journal-ready figure."
    },
    {
      "id": "chemistry",
      "name": "Chemistry intelligence",
      "blurb": "Whether the tool understands the chemistry, not just the lines."
    },
    {
      "id": "files",
      "name": "Files and exchange",
      "blurb": "Getting work in and out, especially from ChemDraw."
    },
    {
      "id": "automation",
      "name": "APIs and automation",
      "blurb": "Driving the tool from code, scripts and AI agents."
    },
    {
      "id": "embedding",
      "name": "Embedding and extension",
      "blurb": "Putting the editor inside other software, and extending it."
    }
  ],
  "features": [
    {
      "id": "bonds-core",
      "group": "drawing",
      "name": "Single, double and triple bonds",
      "test": "Can a user draw and change these bond orders by hand?"
    },
    {
      "id": "stereo-bonds",
      "group": "drawing",
      "name": "Wedge, hash and wavy bonds",
      "test": "Solid wedge, hashed wedge and wavy bonds are drawable."
    },
    {
      "id": "special-bonds",
      "group": "drawing",
      "name": "Dative, hydrogen and quadruple bonds",
      "test": "At least dative plus one other specialist bond type is drawable."
    },
    {
      "id": "double-bond-side",
      "group": "drawing",
      "name": "Choose double-bond side",
      "test": "User can set a double bond to left, right or centered."
    },
    {
      "id": "rings",
      "group": "drawing",
      "name": "Ring tools",
      "test": "Dedicated tools for common ring sizes, including aromatic rings."
    },
    {
      "id": "conformers",
      "group": "drawing",
      "name": "Chair and Haworth rings",
      "test": "Dedicated chair or Haworth projection tools or templates."
    },
    {
      "id": "chains",
      "group": "drawing",
      "name": "Chain tool",
      "test": "Drag to create a zig-zag chain of chosen length."
    },
    {
      "id": "templates",
      "group": "drawing",
      "name": "Template library",
      "test": "Built-in structure templates beyond simple rings."
    },
    {
      "id": "custom-templates",
      "group": "drawing",
      "name": "Save your own templates",
      "test": "User can save a drawing as a reusable template."
    },
    {
      "id": "abbreviations",
      "group": "drawing",
      "name": "Group abbreviations",
      "test": "Labels such as Ph, Boc or OMe are chemically understood or expandable."
    },
    {
      "id": "atom-labels",
      "group": "drawing",
      "name": "Charges, isotopes and atom labels",
      "test": "Charges, isotopes and arbitrary element labels can be set on atoms."
    },
    {
      "id": "radicals",
      "group": "drawing",
      "name": "Radicals and lone pairs",
      "test": "Radical dots or lone pairs can be placed on atoms."
    },
    {
      "id": "keyboard-drawing",
      "group": "drawing",
      "name": "Keyboard drawing",
      "test": "Hover or point at an atom or bond and press a key to change it."
    },
    {
      "id": "selection-tools",
      "group": "drawing",
      "name": "Lasso select and transforms",
      "test": "Lasso or free selection plus rotate, flip and resize."
    },
    {
      "id": "perspective",
      "group": "drawing",
      "name": "Tilt drawings in perspective",
      "test": "A 2D drawing can be rotated in 3D or shown in perspective on the canvas."
    },
    {
      "id": "reaction-arrows",
      "group": "reactions",
      "name": "Reaction arrows",
      "test": "Forward plus at least equilibrium, retrosynthetic or resonance arrows."
    },
    {
      "id": "mechanism-arrows",
      "group": "reactions",
      "name": "Curved mechanism arrows",
      "test": "Editable curved electron-pushing arrows, full or half head."
    },
    {
      "id": "reaction-data",
      "group": "reactions",
      "name": "Machine-readable reactions",
      "test": "Reactants and products are stored as chemistry, such as RXN or reaction SMILES."
    },
    {
      "id": "atom-mapping",
      "group": "reactions",
      "name": "Atom mapping",
      "test": "Reaction atoms can be mapped manually or automatically."
    },
    {
      "id": "orbitals",
      "group": "reactions",
      "name": "Orbitals and symbols",
      "test": "Orbital shapes or a library of chemical symbols."
    },
    {
      "id": "rich-text",
      "group": "figures",
      "name": "Rich text captions",
      "test": "Fonts, subscripts and superscripts in free text on the canvas."
    },
    {
      "id": "shapes",
      "group": "figures",
      "name": "Shapes, brackets and curves",
      "test": "Editable shapes plus brackets or free curves."
    },
    {
      "id": "align",
      "group": "figures",
      "name": "Align and distribute",
      "test": "Selected objects can be aligned or evenly spaced."
    },
    {
      "id": "groups",
      "group": "figures",
      "name": "Group and ungroup",
      "test": "Objects can be grouped and moved together."
    },
    {
      "id": "cleanup",
      "group": "figures",
      "name": "2D structure cleanup",
      "test": "A command tidies bond lengths and angles of a drawn structure."
    },
    {
      "id": "journal-styles",
      "group": "figures",
      "name": "Journal drawing styles",
      "test": "Built-in presets such as ACS, JACS, RSC or Nature."
    },
    {
      "id": "custom-styles",
      "group": "figures",
      "name": "Reusable custom styles",
      "test": "Bond and font settings can be saved and reused."
    },
    {
      "id": "color",
      "group": "figures",
      "name": "Color control",
      "test": "Atoms, bonds or objects can be colored individually."
    },
    {
      "id": "color-highlight",
      "group": "figures",
      "name": "Color highlighting",
      "test": "Colored backgrounds or halos can highlight atoms, bonds or part of a structure."
    },
    {
      "id": "pages",
      "group": "figures",
      "name": "Page layout and multipage",
      "test": "Page size control and more than one page in a document."
    },
    {
      "id": "pictures",
      "group": "figures",
      "name": "Imported pictures",
      "test": "Raster images can be placed in the drawing."
    },
    {
      "id": "tlc-tables",
      "group": "figures",
      "name": "TLC plates and tables",
      "test": "Dedicated TLC or gel objects, or editable tables."
    },
    {
      "id": "valence-check",
      "group": "chemistry",
      "name": "Structure checking",
      "test": "Valence or structure problems are flagged."
    },
    {
      "id": "stereo-perception",
      "group": "chemistry",
      "name": "R/S and E/Z labels",
      "test": "Stereo descriptors are computed from the drawing."
    },
    {
      "id": "formula-mass",
      "group": "chemistry",
      "name": "Formula and mass",
      "test": "Molecular formula and mass are computed."
    },
    {
      "id": "properties",
      "group": "chemistry",
      "name": "Property estimates",
      "test": "At least logP or TPSA is computed."
    },
    {
      "id": "name-to-structure",
      "group": "chemistry",
      "name": "Name to structure",
      "test": "Typing a chemical name produces a structure."
    },
    {
      "id": "structure-to-name",
      "group": "chemistry",
      "name": "Structure to name",
      "test": "A drawn structure produces a systematic name."
    },
    {
      "id": "nmr-prediction",
      "group": "chemistry",
      "name": "NMR prediction",
      "test": "1H or 13C shifts are predicted from a structure."
    },
    {
      "id": "markush",
      "group": "chemistry",
      "name": "R-groups and query structures",
      "test": "R-groups, atom lists or Markush structures."
    },
    {
      "id": "polymers",
      "group": "chemistry",
      "name": "Polymers and repeat units",
      "test": "Repeat units are represented, beyond a plain bracket drawing."
    },
    {
      "id": "biomolecules",
      "group": "chemistry",
      "name": "Peptides and nucleic acids",
      "test": "Sequence, HELM or monomer-based biomolecule tools."
    },
    {
      "id": "image-to-structure",
      "group": "chemistry",
      "name": "Image to structure",
      "test": "A picture of a structure can be turned into an editable structure."
    },
    {
      "id": "database-lookup",
      "group": "chemistry",
      "name": "Online structure lookup",
      "test": "Structures can be fetched from PubChem or a similar database."
    },
    {
      "id": "model-3d",
      "group": "chemistry",
      "name": "3D model view",
      "test": "A structure can be viewed as a rotatable 3D model."
    },
    {
      "id": "crystals",
      "group": "chemistry",
      "name": "Crystal structures",
      "test": "CIF or crystal structures can be opened or drawn."
    },
    {
      "id": "cdxml",
      "group": "files",
      "name": "CDXML import and export",
      "test": "ChemDraw's XML format can be read and written."
    },
    {
      "id": "cdx",
      "group": "files",
      "name": "CDX import and export",
      "test": "ChemDraw's binary format can be read and written."
    },
    {
      "id": "mol-sdf",
      "group": "files",
      "name": "MOL and SDF",
      "test": "MOL files can be read and written; note if SDF is missing."
    },
    {
      "id": "smiles",
      "group": "files",
      "name": "SMILES",
      "test": "SMILES can be read and written."
    },
    {
      "id": "inchi",
      "group": "files",
      "name": "InChI",
      "test": "InChI can be read or written."
    },
    {
      "id": "rxn",
      "group": "files",
      "name": "RXN files",
      "test": "MDL RXN files can be read or written."
    },
    {
      "id": "svg-export",
      "group": "files",
      "name": "SVG export",
      "test": "Vector SVG export."
    },
    {
      "id": "pdf-export",
      "group": "files",
      "name": "PDF export",
      "test": "Vector PDF export."
    },
    {
      "id": "png-export",
      "group": "files",
      "name": "High-resolution PNG",
      "test": "PNG export at print resolution, 300 dpi or better."
    },
    {
      "id": "clipboard-chemdraw",
      "group": "files",
      "name": "Paste to and from ChemDraw",
      "test": "Structures stay editable when copied between this tool and ChemDraw."
    },
    {
      "id": "office",
      "group": "files",
      "name": "Editable in Word or PowerPoint",
      "test": "A structure placed in Office can be re-edited."
    },
    {
      "id": "office-ole",
      "group": "files",
      "name": "Windows Office OLE",
      "test": "On Windows, a structure pasted into Word or PowerPoint can be double-clicked to edit it in the tool."
    },
    {
      "id": "python-api",
      "group": "automation",
      "name": "Python API",
      "test": "A documented Python package or binding drives the tool."
    },
    {
      "id": "ts-api",
      "group": "automation",
      "name": "JavaScript or TypeScript API",
      "test": "A documented JS or TS API drives the tool from code. Embedding the editor is counted separately."
    },
    {
      "id": "cli",
      "group": "automation",
      "name": "Command-line tool",
      "test": "A CLI can convert or render without the GUI."
    },
    {
      "id": "mcp-agents",
      "group": "automation",
      "name": "AI agent control",
      "test": "An MCP server or documented agent interface."
    },
    {
      "id": "plugins",
      "group": "embedding",
      "name": "Plugins",
      "test": "A documented extension mechanism."
    },
    {
      "id": "embed",
      "group": "embedding",
      "name": "Embed in your own app",
      "test": "A documented way to place the working editor inside another application or page. Office OLE is listed separately."
    },
    {
      "id": "ai-assistant",
      "group": "automation",
      "name": "Built-in AI assistant",
      "test": "An assistant inside the product can propose or edit drawings."
    }
  ],
  "tools": [
    {
      "id": "p01",
      "slug": "chemdraw",
      "name": "ChemDraw",
      "rank": 1,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://revvitysignals.com/chemdraw-turns-40",
        "note": "Ships RDKit 2024.09.6; Revvity does not document what it does."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [
        {
          "name": "ChemDraw Prime",
          "level": "paid",
          "price": "US$700/user/year (2026-11-06)"
        },
        {
          "name": "ChemDraw Professional",
          "level": "paid",
          "price": "US$1,355/user/year (2026-11-06)"
        },
        {
          "name": "Signals ChemDraw",
          "level": "paid",
          "price": "US$1,415/user/year (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "ChemDraw drawing engine",
        "language": null,
        "source": "https://revvitysignals.com/chemdraw-turns-40"
      },
      "enginesChecked": true,
      "languageNote": null,
      "drawingStyle": "ACS Document 1996",
      "video": {
        "provider": "link",
        "url": "https://vimeo.com/915296350",
        "embed": null,
        "title": "Introduction to ChemDraw Plus",
        "author": "Revvity Signals",
        "linkedFrom": "https://revvitysignals.com/products/research/chemdraw-archive",
        "poster": null
      },
      "embedding": {
        "methods": [
          "npm package",
          "script tag"
        ],
        "package": "@revvity-signals/chemdraw-js",
        "limit": "Separate ChemDraw JS subscription; vendor-supplied tarball required",
        "how": "Load chemdrawweb.js, then call RevvitySignals.ChemDrawJS.attach({license, editor:{element}})."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Its desktop editions create publication-ready 2D chemical drawing documents with reactions, text, page layout and drawing styles.",
      "summary": "Chemical drawing software for publication-ready molecular structures, reactions, mechanisms and scientific figures.",
      "website": "https://revvitysignals.com/products/research/chemdraw",
      "repo": null,
      "docs": "https://support.revvitysignals.com/hc/en-us/sections/360010804431-ChemDraw-ChemOffice-Products",
      "vendor": "Revvity Signals Software, Inc.",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary paid software with separately licensed editions.",
        "source": "https://support.revvitysignals.com/hc/en-us/article_attachments/35629914245652"
      },
      "price": {
        "text": "Prime: US$700 per user annually (2026-11-05).",
        "source": "https://shop.revvitysignals.com/product/chemdraw-prime-named-user-subscription-includes-support-and-maintenance/01tHs000009rOuFIAU"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "26.1",
        "date": null,
        "source": "https://revvitysignals.com/whats-new/Signals%20ChemDraw"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:3-Drawing_10.htm",
          "note": "Drew single, double and triple bonds in scratch document.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:3-Drawing_10.htm",
          "note": "Drew wedge, hashed wedge and wavy bonds."
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:3-Drawing_10.htm",
          "note": "Dative, hydrogen and quadruple bond tools."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:3-Drawing_10.htm",
          "note": "Above, below or centered double bonds."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:Rings.htm",
          "note": "Drew cyclohexane and benzene with dedicated tools.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Rings.htm",
          "note": "Two cyclohexane chair tools."
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Chains.htm",
          "note": "Drag acyclic chains; atom count appears while drawing."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:Tutorial 7_ Templates.htm",
          "note": "Inserted anthracene from built-in Aromatics palette.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Templates.htm",
          "note": "Create and save custom template palettes."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Defining Nicknames.htm",
          "note": "Nicknames represent expandable chemical substructures.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:A-Chemistry.htm",
          "note": "Element labels, isotope numbers and chemically interpreted charges.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Chemical Annotations.htm",
          "note": "Attach radical dots and lone pairs to atoms.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://revvitysignals.com/sites/default/files/2024-02/rs-e-book-chemdraw-tips-and-tricks-eBook-02132024.pdf",
          "note": "Hotkeys change hovered atoms and bonds.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Objects.htm",
          "note": "Freehand lasso, rotation, flips and resizing."
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://assets.revvitysignals.com/asset/0b9656e8-339d-47ab-9834-6c08beb6abee/Full-Dot-Chart-ChemDraw-Suite-of-Products.pdf#page=5",
          "note": "Perspective in Prime; 3D cleanup requires Professional or Signals.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:Objects.htm",
          "note": "Drew forward and equilibrium arrows.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:Drawing Reactions.htm",
          "note": "Drew curved full-head and fishhook arrows."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://assets.revvitysignals.com/asset/0b9656e8-339d-47ab-9834-6c08beb6abee/Full-Dot-Chart-ChemDraw-Suite-of-Products.pdf#page=10",
          "note": "Reads and writes chemically interpreted RXN reactions; all editions.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Atom-to-Atom Mapping.htm",
          "note": "Automatic mapping command and manual atom-map tool.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Chemical Annotations.htm",
          "note": "Orbital palette includes s, p, d and hybrid orbitals.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Analysis and Properties.htm",
          "note": "Caption fonts, subscripts and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Objects.htm",
          "note": "Editable shapes, brackets and freehand curves.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Objects.htm",
          "note": "Horizontal/vertical alignment and equal-distance distribution.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Objects.htm",
          "note": "Group and ungroup; grouped objects move together."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Clean Up Structure.htm",
          "note": "Standardizes molecular bond lengths and angles.",
          "engine": {
            "library": "In-house (ChemDraw 2D structure-generation and cleanup algorithms, local)",
            "source": "https://chemistry.beloit.edu/classes/programs/ChemDraw_25_manual.pdf#page=302"
          },
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Document Settings.htm",
          "note": "Built-in ACS Document 1996 and RSC styles.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Document Settings.htm",
          "note": "Save drawing and text settings as reusable stationery.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Working with Color.htm",
          "note": "Basic colors in Prime; highlights/ring fills require Professional or Signals.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "pages": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:8-Presentation.htm",
          "note": "Set page size and multiple document pages."
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Importing.htm",
          "note": "Embeds imported raster images, including PNG and TIFF."
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:TLC.htm",
          "note": "Dedicated editable TLC plates; all desktop editions.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "valence-check": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:Check Structure.htm",
          "note": "Check Structure on caffeine returned No errors found.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Stereochemistry indicators.htm",
          "note": "Computed R/S and E/Z indicators update with drawing changes.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:6a-Chem.htm",
          "note": "Caffeine: C8H10N4O2; molecular weight 194.19; exact mass 194.08.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:Property predictions in ChemDraw.htm",
          "note": "Caffeine Chemical Properties displayed Log P -1.03 and tPSA 61.82.",
          "engine": {
            "library": "Molecular Networks MOSES.logP (bundled calculator module); BioByte CLogP/CMR (bundled algorithms)",
            "source": "https://chemistry.beloit.edu/classes/programs/ChemDraw_25_manual.pdf"
          },
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://shop.revvitysignals.com/product/chemdraw-professional-named-user-subscription-includes-support-and-maintenance/01tHs000009rOzeIAE",
          "note": "Professional and Signals; unavailable in Prime.",
          "engine": {
            "library": "In-house (ChemStruct=Name, bundled naming algorithms)",
            "source": "https://manualzilla.com/doc/5731433/chemdraw-user-s-manual"
          },
          "plan": "ChemDraw Professional",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://shop.revvitysignals.com/product/chemdraw-professional-named-user-subscription-includes-support-and-maintenance/01tHs000009rOzeIAE",
          "note": "Professional and Signals; unavailable in Prime.",
          "engine": {
            "library": "In-house (ChemStruct=Name, bundled naming algorithms)",
            "source": "https://manualzilla.com/doc/5731433/chemdraw-user-s-manual"
          },
          "plan": "ChemDraw Professional",
          "planLevel": "paid"
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:ChemNMR.htm",
          "note": "Proton and carbon-13 predictions; Professional and Signals only.",
          "engine": {
            "library": "ChemNMR (bundled prediction module, originally licensed from Upstream Solutions)",
            "source": "https://www.upstream.ch/partners/index.html"
          },
          "plan": "ChemDraw Professional",
          "planLevel": "paid"
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:5-Query.htm",
          "note": "R positions, variable bond orders and atom lists.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Polymers.htm",
          "note": "Semantic repeat units, copolymer types, counts and connectivity.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://shop.revvitysignals.com/product/chemdraw-professional-named-user-subscription-includes-support-and-maintenance/01tHs000009rOzeIAE",
          "note": "HELM peptide and oligonucleotide tools; Professional and Signals only.",
          "plan": "ChemDraw Professional",
          "planLevel": "paid"
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Current availability of historical pic2mol add-in unverified."
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:ChemACX.com Structure from CAS RN.htm",
          "note": "Fetch structures by CAS number; Professional and Signals.",
          "engine": {
            "library": "ChemACX.com (remote database through ChemACX Explorer add-in)",
            "source": "https://revvitysignals.com/sites/default/files/2024-05/rs-e-book-chemdraw-signals-chemdraw-tips-and-tricks-eBook.pdf"
          },
          "plan": "ChemDraw Professional",
          "planLevel": "paid"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:3D Clean Up.htm",
          "note": "Rotatable generated 3D coordinates; Professional/Signals, maximum 500 atoms.",
          "plan": "ChemDraw Professional",
          "planLevel": "paid"
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:Importing.htm",
          "note": "Imports CIF/mmCIF; mmCIF displays designated ligand groups only.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://assets.revvitysignals.com/asset/0b9656e8-339d-47ab-9834-6c08beb6abee/Full-Dot-Chart-ChemDraw-Suite-of-Products.pdf#page=10",
          "note": "Saved CDXML and reopened caffeine as editable structure.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://assets.revvitysignals.com/asset/0b9656e8-339d-47ab-9834-6c08beb6abee/Full-Dot-Chart-ChemDraw-Suite-of-Products.pdf#page=10",
          "note": "Reads and writes native binary CDX; all editions.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://assets.revvitysignals.com/asset/0b9656e8-339d-47ab-9834-6c08beb6abee/Full-Dot-Chart-ChemDraw-Suite-of-Products.pdf#page=10",
          "note": "MOL roundtrip worked; V3000 output; SDF save formats listed.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:9-Sharing_Info.htm",
          "note": "Pasted fixture SMILES; copied caffeine back as SMILES.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "help:9-Sharing_Info.htm",
          "note": "Copy and paste InChI; InChIKey export also available.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://assets.revvitysignals.com/asset/0b9656e8-339d-47ab-9834-6c08beb6abee/Full-Dot-Chart-ChemDraw-Suite-of-Products.pdf#page=10",
          "note": "Reads and writes RXN V2000/V3000; all editions.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://assets.revvitysignals.com/asset/0b9656e8-339d-47ab-9834-6c08beb6abee/Full-Dot-Chart-ChemDraw-Suite-of-Products.pdf#page=10",
          "note": "Saved vector SVGs for caffeine and paclitaxel.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Saved vector PDF; one Letter page, no raster images."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:9-Sharing_Info.htm",
          "note": "Default PNG: 552 by 532 pixels, approximately 301 dpi."
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "tested",
          "source": "help:Transferring Objects.htm",
          "note": "Native copy/paste between own ChemDraw documents retained caffeine chemistry.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://assets.revvitysignals.com/asset/0b9656e8-339d-47ab-9834-6c08beb6abee/Full-Dot-Chart-ChemDraw-Suite-of-Products.pdf#page=10",
          "note": "Windows editable OLE objects; all desktop editions.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "python-api": {
          "status": "partial",
          "evidence": "docs",
          "source": "help:ChemScript1.htm",
          "note": "Not in Prime. ChemScript SDK in Professional and Signals, Windows only.",
          "plan": "ChemDraw Professional",
          "planLevel": "paid"
        },
        "ts-api": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/Revvity/ChemDraw-AddIns/blob/119dcb011d6c57edf773b1733539709ef6ba99b2/Documentation/ChemDraw%20JavaScript%20API%20Reference%20Guide.pdf",
          "note": "Not in Prime. Desktop add-in API in Signals only, not a JavaScript library.",
          "plan": "Signals ChemDraw",
          "planLevel": "paid"
        },
        "cli": {
          "status": "no",
          "evidence": "docs",
          "source": "help:How_ChemScript_works.htm",
          "note": "No command-line tool. ChemScript scripts can automate work in Professional and Signals."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://support.revvitysignals.com/hc/en-us/articles/36096524952980-ChemDraw-Add-In-Where-can-I-find-the-Add-in-Developer-Guide-for-ChemDraw",
          "note": "Not in Prime. Add-ins SDK in Signals only.",
          "plan": "Signals ChemDraw",
          "planLevel": "paid"
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/Revvity/ChemDraw-JS-Public-Examples/blob/main/vanilla-javascript-demo/index.html",
          "note": "Separate ChemDraw JS subscription; vendor-supplied tarball required"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemistry.beloit.edu/classes/programs/ChemDraw_25_manual.pdf#page=355",
          "note": "Windows OLE server supports double-click editing of embedded Word structures.",
          "plan": "ChemDraw Prime",
          "planLevel": "paid"
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://assets.revvitysignals.com/asset/0b9656e8-339d-47ab-9834-6c08beb6abee/Full-Dot-Chart-ChemDraw-Suite-of-Products.pdf#page=5",
          "note": "Atom/bond highlighting and ring fills; unavailable in Prime.",
          "plan": "ChemDraw Professional",
          "planLevel": "paid"
        }
      },
      "caveats": [
        "Features differ between ChemDraw Prime, Professional and Signals ChemDraw. We tested Prime.",
        "Ships RDKit 2024.09.6 as a bundled library in the macOS 26.0 and Windows 26.1 installs. Revvity does not document what it does, so this does not mean ChemDraw draws with RDKit."
      ],
      "github": null,
      "hands": {
        "testedVersion": "26.0.0.6599",
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": {
          "idleMb": 254.14,
          "paclitaxelMb": 291.46,
          "baselineMb": null,
          "rssIdleMb": 477.38,
          "rssPaclitaxelMb": 581.69,
          "runs": 3,
          "processes": 10,
          "method": "Median physical footprint MiB; process descendants plus lsappinfo coalition helpers; 10-second waits.",
          "note": "Idle 181.96–285.99 MiB; paclitaxel 222.35–294.21 MiB; protected user instance excluded."
        },
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "/Applications/ChemDraw.app",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": 334413824,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemdraw/simple.svg",
            "note": "ACS Document 1996; automatic SMILES layout; formula verified; SVG and Molfile saved.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemdraw/complex.svg",
            "note": "ACS Document 1996; automatic SMILES layout; crowded labels retained; formula verified.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": null,
            "image": null,
            "note": "ACS Document 1996 run; Prime has no 3D view; skipped.",
            "structure": null
          }
        ],
        "observations": [
          "Paclitaxel received wedge and hashed stereobonds automatically.",
          "SVG exports were tightly cropped with transparent backgrounds.",
          "Default PDF export used a full Letter page.",
          "Prime exposed no naming, NMR prediction or 3D view commands.",
          "Drawn in the ACS Document 1996 style."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 1951,
        "idleMb": 434,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": null,
      "references": [
        "https://revvitysignals.com/products/research/signals-chemdraw",
        "https://shop.revvitysignals.com/product/signals-chemdraw-named-user-includes-chemdraw-desktop-chemdraw-chemdraw-collections-helm-curation-chemdraw-applications-signals-std-tenant-subscription-includes-support-maintenance/01tQk000003YPzxIAG"
      ]
    },
    {
      "id": "p02",
      "slug": "reshiki",
      "name": "ReShiki",
      "rank": 2,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "COSMolKit (Rust port of RDKit)"
        ],
        "ported": [
          "RDKit",
          "OPSIN",
          "openclatura",
          "InChI",
          "Centres"
        ],
        "source": "https://github.com/Ameyanagi/ReShiki/blob/main/NOTICE",
        "note": "Own Rust canvas. All chemistry is Rust: code ported with custom changes, plus a pinned fork of COSMolKit, a Rust port of RDKit."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "ReShiki vector scene",
        "language": "Rust",
        "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/crates/model/src/scene.rs"
      },
      "enginesChecked": true,
      "languageNote": "Python and TypeScript are for bindings and tests.",
      "video": {
        "provider": "file",
        "url": "https://reshiki.com/media/reshiki-promo.mp4?v=0.13.1",
        "embed": null,
        "title": "ReShiki full tour",
        "author": null,
        "linkedFrom": "https://reshiki.com/",
        "poster": "https://reshiki.com/media/reshiki-promo-poster.png?v=0.13.1"
      },
      "embedding": {
        "methods": [
          "npm package",
          "web component",
          "iframe",
          "script tag"
        ],
        "package": "@ameyanagi/reshiki",
        "limit": "Browser preview. One editor per page, or use iframes. Printing, assistant and Office need the desktop app.",
        "how": "Call mount(element); alternatively use <reshiki-editor> or embed() iframe."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "Bindings"
        },
        {
          "language": "JavaScript",
          "role": "Browser bindings and Office add-in"
        }
      ],
      "thirdParty": {
        "summary": "MIT or Apache compatible code. Bundled NMR data is share-alike, ChEBI aliases are CC BY 4.0, and fonts are OFL-1.1 and Bitstream Vera.",
        "source": "https://github.com/Ameyanagi/ReShiki/blob/main/NOTICE",
        "notice": "https://github.com/Ameyanagi/ReShiki/blob/main/NOTICE",
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "COSMolKit",
            "license": "MIT",
            "source": "https://github.com/cosmol-studio/COSMolKit/blob/main/LICENSE"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          },
          {
            "name": "OpenClatura",
            "license": "MIT",
            "source": "https://github.com/lamalab-org/openclatura/blob/main/LICENSE"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          },
          {
            "name": "Centres",
            "license": "BSD-2-Clause",
            "source": "https://github.com/SiMolecule/centres/blob/develop/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its standalone editor combines chemical drawing, captions, layout and publication-scale vector exports.",
      "summary": "A chemical drawing editor for molecules, reaction schemes and publication figures.",
      "website": "https://reshiki.com/",
      "repo": "https://github.com/Ameyanagi/ReShiki",
      "docs": "https://reshiki.com/guide/first-molecule/",
      "vendor": "Ameyanagi",
      "license": {
        "kind": "open-source",
        "spdx": "MIT OR Apache-2.0",
        "text": "Original code is MIT or Apache-2.0; third-party components retain their licenses.",
        "source": "https://reshiki.com/guide/install/#1-download-and-open"
      },
      "price": {
        "text": "Free",
        "source": "https://reshiki.com/guide/install/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.14.0",
        "date": "2026-11-08",
        "source": "https://github.com/Ameyanagi/ReShiki/releases/tag/v0.14.0"
      },
      "engine": {
        "rendering": "Iced Canvas and a shared vector scene for SVG, vector PDF and raster PNG",
        "chemistry": "In-house Rust engine with native InChI and a Rust OPSIN port",
        "ui": "Iced 0.14",
        "source": "https://reshiki.com/developer/architecture/"
      },
      "languages": [
        "Rust"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/guide/first-molecule/#change-a-bond",
          "note": "Drew three bond orders; changed an existing bond and undid it.",
          "shot": {
            "image": "evidence/reshiki/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/bond-tools/",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/reshiki/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/bond-tools/",
          "note": "Dative, hydrogen and quadruple bonds; molecular interchange has limits."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/bond-tools/#workflow",
          "note": "Automatic, centered, left and right placement.",
          "shot": {
            "image": "evidence/reshiki/f-double-bond-side.webp",
            "caption": "Double-bond placement menu with automatic, centered, left and right options."
          }
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/ring-presets/#ring-workflow",
          "note": "Inserted pentagon and benzene using ring tools.",
          "shot": {
            "image": "evidence/reshiki/f-rings.webp",
            "caption": "Pentagon and benzene rings beside the template library."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/ring-presets/#ring-workflow",
          "note": "Inserted Chair A from the ring menu.",
          "shot": {
            "image": "evidence/reshiki/f-conformers.webp",
            "caption": "A chair ring on the canvas and the template categories."
          }
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/chain-tools/#drawing-workflow",
          "note": "Drag zigzag chains with atom-count previews and exact length control."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/guide/templates/#macrocycles-and-ligands",
          "note": "Placed built-in L-alanine template on canvas.",
          "shot": {
            "image": "evidence/reshiki/f-templates.webp",
            "caption": "L-alanine template selected on the canvas and in the library."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/templates/#keep-a-fragment-for-later",
          "note": "Save selected drawing objects as reusable local templates.",
          "shot": {
            "image": "evidence/reshiki/f-custom-templates.webp",
            "caption": "The template library includes Save selection as template."
          }
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/labels/#shorten-a-group",
          "note": "Ph, Boc and OMe retain expandable graphs; attachment restrictions apply."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/labels/#number-atoms",
          "note": "Charges, isotopes, elements and literal atom labels."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/scientific-symbols/#add-a-mark-to-an-atom",
          "note": "Atom-owned radical dots and positioned lone pairs."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/shortcuts/#at-a-bond",
          "note": "Hover targets support atom labels and bond-order shortcuts."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/editing/#select-what-to-change",
          "note": "Lasso selection, rotation, flips and resizing.",
          "shot": {
            "image": "evidence/reshiki/f-selection-tools.webp",
            "caption": "Selected L-alanine with resize and rotation handles beside the selection tools."
          }
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/editing/#tilt-a-drawing",
          "note": "X/Y tilt retains depth without changing chemical stereochemistry.",
          "shot": {
            "image": "evidence/reshiki/f-perspective.webp",
            "caption": "Structure preview with tilt, roll and depth controls."
          }
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/arrows/#draw-an-arrow",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/reshiki/f-reaction-arrows.webp",
            "caption": "Equilibrium and forward reaction arrows on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/arrows/#bend-and-aim-an-arrow",
          "note": "Drew full and half-head curves; dragged bend handle.",
          "shot": {
            "image": "evidence/reshiki/f-mechanism-arrows.webp",
            "caption": "Selected curved electron arrow with bend handles and its properties."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/reactions/#import-and-export",
          "note": "Explicit participant roles persist through native files, RXN and reaction SMILES.",
          "shot": {
            "image": "evidence/reshiki/f-reaction-data.webp",
            "caption": "Reaction roles panel with RXN V3000 and reaction SMILES options."
          }
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/reactions/#use-atom-maps",
          "note": "Manual maps and bounded, reviewed automatic mapping.",
          "shot": {
            "image": "evidence/reshiki/f-atom-mapping.webp",
            "caption": "Atom maps panel with manual and automatic mapping controls."
          }
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/scientific-symbols/#draw-an-orbital",
          "note": "Editable orbital shapes and chemical symbols."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/labels/#write-a-caption",
          "note": "Fonts and scripts supported; complex caret layout uses separate preview.",
          "shot": {
            "image": "evidence/reshiki/f-rich-text.webp",
            "caption": "Text formatting controls and an ethanol caption on the canvas."
          }
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/graphics/#draw-a-shape",
          "note": "Editable shapes, brackets, Bézier curves and pen paths.",
          "shot": {
            "image": "evidence/reshiki/f-shapes.webp",
            "caption": "Drawing toolbar includes rectangle, ellipse and bracket tools."
          }
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/selection-and-groups/#workflow",
          "note": "Align edges or centers; distribute groups and connected components."
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/selection-and-groups/#workflow",
          "note": "Nested groups retain complete molecules and captions.",
          "shot": {
            "image": "evidence/reshiki/f-groups.webp",
            "caption": "Group command above a selected structure."
          }
        },
        "cleanup": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/selection-cleanup/",
          "note": "Selection cleanup leaves attachment-containing complexes unchanged; whole-scheme cleanup is missing.",
          "engine": {
            "library": "Ported from RDKit RDDepictor (Rust); In-house (Rust layout refinements)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/crates/io/src/engine/native_cleanup.rs#L89"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/figures/",
          "note": "JACS/ACS, Nature and RSC drawing presets; complete stationery remains unsupported.",
          "shot": {
            "image": "evidence/reshiki/f-journal-styles.webp",
            "caption": "Drawing style panel shows the JACS / ACS preset."
          }
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/drawing-styles/#reuse-a-style",
          "note": "Save and load reusable bond and font settings."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/typography/#editing-workflow",
          "note": "Color selected labels, bonds, captions, arrows and graphics independently.",
          "shot": {
            "image": "evidence/reshiki/f-color.webp",
            "caption": "Bond properties include a color field and Apply button."
          }
        },
        "pages": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/publication-pages/",
          "note": "Standard/custom paper and page grids; uniform sizes, no automatic pagination.",
          "shot": {
            "image": "evidence/reshiki/f-pages.webp",
            "caption": "Publication page settings show A4 dimensions, margins and page grid."
          }
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/pictures/",
          "note": "Embedded PNG, JPEG, TIFF and WebP pictures; no cropping.",
          "shot": {
            "image": "evidence/reshiki/f-pictures.webp",
            "caption": "Structure import panel offers Choose file and Paste picture."
          }
        },
        "tlc-tables": {
          "status": "no",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/feature-status/#arrows-graphics-and-document-composition",
          "note": "No TLC, gel or editable table objects."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/feature-status/#chemistry-reactions-and-specialist-workflows",
          "note": "Chemistry errors appear in Properties/Labels; no per-atom warning overlays.",
          "engine": {
            "library": "Ported from RDKit (Rust)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/crates/chemistry/src/graph.rs#L1"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/atom-labels/",
          "note": "Computes tetrahedral R/S and ordinary alkene E/Z descriptors.",
          "engine": {
            "library": "Ported from RDKit CIPLabeler and SiMolecule centres (Rust)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/licenses/rdkit/NOTICE"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/feature-status/#chemistry-reactions-and-specialist-workflows",
          "note": "Caffeine: C8H10N4O2, 194.194 g/mol.",
          "shot": {
            "image": "evidence/reshiki/f-formula-mass.webp",
            "caption": "Molecular properties show C27H46O and 386.664 g/mol."
          },
          "engine": {
            "library": "Ported from RDKit (Rust)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/crates/chemistry/src/lib.rs#L1"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/feature-status/#chemistry-reactions-and-specialist-workflows",
          "note": "Ethanol: cLogP -0.00; TPSA 20.23 square angstroms.",
          "engine": {
            "library": "Ported from RDKit (Rust descriptors)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/crates/chemistry/src/descriptors.rs#L1"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/guide/names/#what-is-supported",
          "note": "Ethanol name inserted an editable structure and default caption.",
          "shot": {
            "image": "evidence/reshiki/f-name-to-structure.webp",
            "caption": "Ethanol name import and the resulting structure on the canvas."
          },
          "engine": {
            "library": "Ported from OPSIN (Rust); PubChem web service (optional remote lookup)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/docs/chemical-naming-rust.md"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/guide/names/#what-is-supported",
          "note": "Alanine generated (2S)-2-aminopropanoic acid using local subset rules.",
          "shot": {
            "image": "evidence/reshiki/f-structure-to-name.webp",
            "caption": "Selected L-alanine and its generated name, marked Preferred IUPAC name."
          },
          "engine": {
            "library": "Ported from openclatura (Rust)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/src/naming/openclatura/mod.rs#L1"
          }
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/guide/nmr/#what-the-numbers-mean",
          "note": "Ethanol methyl: 1.050 ppm; two other sites withheld.",
          "shot": {
            "image": "evidence/reshiki/f-nmr-prediction.webp",
            "caption": "Ethanol structure and its predicted proton NMR shifts."
          },
          "engine": {
            "library": "In-house (Rust HOSE predictor; bundled nmrshiftdb2 data)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/crates/io/src/nmr.rs#L249"
          }
        },
        "markush": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/generic-structures/#limits",
          "note": "Finite element/group alternatives; general query predicates and R-logic remain unsupported."
        },
        "polymers": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/generic-structures/#limits",
          "note": "Typed repeat units; only finite ordinary head-to-tail chemistry expands."
        },
        "biomolecules": {
          "status": "no",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/feature-status/#chemistry-reactions-and-specialist-workflows",
          "note": "Biological sequence and monomer assembly workflows are missing."
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/assistant/#draw-from-an-image",
          "note": "Desktop Codex assistant reconstructs images into editable previews; requires internet.",
          "shot": {
            "image": "evidence/reshiki/f-image-to-structure.webp",
            "caption": "Assistant prompt accepts a description or a pasted image."
          },
          "engine": {
            "library": "OpenAI Codex (remote model via local app-server); In-house (Rust drawing reconstruction)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/src/assistant/codex.rs#L527"
          }
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ameyanagi/ReShiki/releases/tag/v0.14.0",
          "note": "Look up online… returned caffeine, PubChem CID 2519, after the query was confirmed.",
          "shot": {
            "image": "evidence/reshiki/f-database-lookup.webp",
            "caption": "PubChem lookup returned caffeine, CID 2519, for the name caffeine."
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/guide/editing/#show-a-molecule-as-a-3d-model",
          "note": "Built cholesterol from SMILES; rotated ball-and-stick model by dragging.",
          "shot": {
            "image": "evidence/reshiki/f-model-3d.webp",
            "caption": "Ball-and-stick 3D model of cholesterol on the canvas."
          },
          "engine": {
            "library": "In-house (Rust viewer); COSMolKit (Rust conformer generation)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/docs/geometry-backend.md"
          }
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/crystal-structures/#open-a-structure",
          "note": "Opens CIF structures with unit cells and atom sites."
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/feature-status/#files-clipboard-automation-and-application-behavior",
          "note": "Exported cholesterol CDXML and reopened the drawing.",
          "shot": {
            "image": "evidence/reshiki/f-cdxml.webp",
            "caption": "Structure export menu offers a CDXML drawing."
          },
          "engine": {
            "library": "Ported from RDKit External/ChemDraw and Glysade/chemdraw (Rust reader); In-house (Rust writer)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/crates/io/src/chemistry/cdxml.rs#L1"
          }
        },
        "cdx": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/clipboard/#boundaries",
          "note": "Bounded subset: Open and Copy as offer CDX; structure export does not.",
          "shot": {
            "image": "evidence/reshiki/f-cdx.webp",
            "caption": "Copy as menu includes CDXML and CDX."
          },
          "engine": {
            "library": "In-house (Rust CDX codec); Ported from RDKit External/ChemDraw and Glysade/chemdraw (Rust molecular reader)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/crates/io/src/engine/native_import.rs#L228"
          }
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://reshiki.com/guide/sharing/#choose-an-export",
          "note": "MOL import/export worked; opening SDF reported Invalid SMILES at byte 1.",
          "shot": {
            "image": "evidence/reshiki/f-mol-sdf.webp",
            "caption": "Structure export panel has MOL selected."
          },
          "engine": {
            "library": "Ported from RDKit (Rust MOL reader/writer; no SDF)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/crates/io/src/chemistry/molfile.rs#L1"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/guide/sharing/#choose-an-export",
          "note": "Imported fixture SMILES; exported cholesterol SMILES text.",
          "shot": {
            "image": "evidence/reshiki/f-smiles.webp",
            "caption": "Structure export menu offers SMILES text."
          },
          "engine": {
            "library": "Ported from RDKit (Rust parser and writer)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/licenses/rdkit/NOTICE"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/sharing/#what-paste-uses",
          "note": "InChI paste/import and explicit identifier copying.",
          "shot": {
            "image": "evidence/reshiki/f-inchi.webp",
            "caption": "Structure export menu offers an InChI identifier."
          },
          "engine": {
            "library": "Ported from InChI and RDKit (Rust, cosmolkit-inchi)",
            "source": "https://github.com/Ameyanagi/ReShiki/blob/39a21e7d9c99e3cab8bbd71d42a3a47ad72203b0/crates/chemistry/src/inchi/kernel.rs#L1"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/reactions/#import-and-export",
          "note": "RXN import/export uses explicitly defined reaction roles.",
          "shot": {
            "image": "evidence/reshiki/f-rxn.webp",
            "caption": "Reaction roles panel includes an RXN V3000 export option."
          }
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/figure-export/",
          "note": "Exported all fixtures as SVG; files contain vector paths.",
          "shot": {
            "image": "evidence/reshiki/f-svg-export.webp",
            "caption": "Figure export panel offers vector SVG export."
          }
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/figure-export/",
          "note": "Default figure format PDF; exported caffeine and paclitaxel.",
          "shot": {
            "image": "evidence/reshiki/f-pdf-export.webp",
            "caption": "Figure export panel offers vector PDF export."
          }
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://reshiki.com/developer/figure-export/#large-png-drawings",
          "note": "Default model PNG: 2973×1198 pixels, 1200 dpi metadata.",
          "shot": {
            "image": "evidence/reshiki/f-png-export.webp",
            "caption": "Figure export set to PNG, up to 1200 dpi."
          }
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/clipboard/#boundaries",
          "note": "Editable desktop subset; unsupported objects may become pictures or simplified copies.",
          "shot": {
            "image": "evidence/reshiki/f-clipboard-chemdraw.webp",
            "caption": "Copy as menu includes CDXML and CDX."
          }
        },
        "office": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/clipboard/#office-and-macos",
          "note": "Windows desktop Office OLE editing; Mac Office lacks this workflow."
        },
        "python-api": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://pypi.org/project/reshiki/",
          "note": "reshiki 0.14.0 from PyPI drew, converted and analysed caffeine."
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/changes-0.13/#the-editor-in-a-web-browser",
          "note": "Published npm API supports loading, saving, rendering and change callbacks."
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/agent-cli/",
          "note": "Experimental headless conversion, rendering, composition and analysis."
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/agent-api/",
          "note": "Experimental stdio MCP; structure-level editing, no live GUI attachment."
        },
        "plugins": {
          "status": "no",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/feature-status/#files-clipboard-automation-and-application-behavior",
          "note": "No stable extension interface."
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Ameyanagi/ReShiki/blob/v0.14.0/packages/editor/README.md",
          "note": "Call mount(element); alternatively use <reshiki-editor> or embed() iframe."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/assistant/",
          "note": "Desktop only; requires local Codex sign-in and internet.",
          "shot": {
            "image": "evidence/reshiki/f-ai-assistant.webp",
            "caption": "Assistant panel with a prompt field and a Codex sign-in card."
          }
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/developer/windows/#edit-a-drawing-in-office",
          "note": "Windows OLE; double-click edits, Ctrl+S updates Word and PowerPoint."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://reshiki.com/guide/color-palettes/#how-the-palette-works",
          "note": "Selected atoms and bonds receive tint highlights beneath visible ink."
        }
      },
      "caveats": [
        "CDX/CDXML interchange covers a subset; CDX can be opened and copied, but not exported as a file.",
        "Editable Office objects require Windows; the browser omits Office integration, printing and the assistant.",
        "Some drawings saved by 0.14.0, such as ones with a 3D model made in 0.14.0, cannot be opened in 0.13.1."
      ],
      "github": {
        "url": "https://github.com/Ameyanagi/ReShiki",
        "stars": 146,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-09-16",
        "commits": 2831,
        "contributors": 3,
        "pushedAt": "2026-11-05T16:23:53Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.14.0",
        "canvas": "evidence/reshiki/canvas.webp",
        "canvasLight": "evidence/reshiki/canvas-light.webp",
        "canvasDark": "evidence/reshiki/canvas-dark.webp",
        "memory": {
          "idleMb": 206.42,
          "paclitaxelMb": 225.91,
          "baselineMb": null,
          "rssIdleMb": 193.88,
          "rssPaclitaxelMb": 255.72,
          "runs": 3,
          "processes": 5,
          "method": "Median summed per-process phys_footprint; descendants plus lsappinfo coalition; fresh HOME; MiB.",
          "note": "Paclitaxel on the canvas with the Import panel closed; 225 MB with it open."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Original light appearance restored before quitting."
        },
        "testedOn": "2026-11-08",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "reshiki-0.14.0-macos-arm64.dmg",
        "ran": true,
        "failure": null,
        "downloadBytes": 40166267,
        "installedBytes": 100282368,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/reshiki/simple.svg",
            "note": "Current Kekule SMILES; automatic layout retained; fitted without cleanup.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/reshiki/complex.svg",
            "note": "Current Kekule SMILES; automatic stereochemical layout retained; fitted without cleanup.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/reshiki/threed.png",
            "note": "SMILES-built ball-and-stick model; depth rotation verified; viewport crop shows default orientation.",
            "structure": "match"
          }
        ],
        "observations": [
          "Default JACS/ACS style: Arial 10 pt, 14.4 pt bonds, 0.6 pt lines.",
          "Caffeine and paclitaxel received automatic SMILES layouts without cleanup.",
          "Paclitaxel’s default layout included wedge and hashed bonds, and explicit H on two ring-fusion carbons.",
          "Cholesterol built a rotatable ball-and-stick model from SMILES.",
          "Default figure format was PDF; PNG export is listed as up to 1200 dpi."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 380,
        "idleMb": 147,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 40166267,
      "references": [
        "https://github.com/Ameyanagi/ReShiki",
        "https://reshiki.com/developer/clipboard/"
      ]
    },
    {
      "id": "p14",
      "slug": "moldraw",
      "name": "MolDraw",
      "rank": 3,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "Indigo",
          "OpenChemLib"
        ],
        "source": "https://www.moldraw.com/tools/free-chem-tools/smiles-to-image-converter.html",
        "note": "Custom canvas; Indigo optionally supplies 2D layout; OpenChemLib handles structure processing."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [
        {
          "name": "Free",
          "level": "free",
          "price": "US$0 (2026-11-06)"
        },
        {
          "name": "Free account",
          "level": "account",
          "price": "US$0 (2026-11-06)"
        },
        {
          "name": "Pro",
          "level": "paid",
          "price": "US$12/month or US$99/year, tax included (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "In-house Canvas 2D molecule renderer",
        "language": "JavaScript",
        "source": "https://www.moldraw.com/assets/paintStructure-DEKP-Ssy.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "file",
        "url": "https://www.moldraw.com/docs/media/draw-phenol-full-walkthrough.mp4",
        "embed": null,
        "title": "Draw your first structure: full walkthrough",
        "author": null,
        "linkedFrom": "https://www.moldraw.com/docs/get-started/how-to-draw-your-first-chemical-structure-in-moldraw/",
        "poster": "https://www.moldraw.com/docs/media/draw-phenol-full-walkthrough-poster.webp"
      },
      "embedding": {
        "methods": [
          "iframe"
        ],
        "package": null,
        "limit": "Only /embed supports cross-site framing.",
        "how": "Embed https://www.moldraw.com/embed in an iframe; no account required."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "Indigo WebAssembly chemistry"
        },
        {
          "language": "Java",
          "role": "OpenChemLib transpiled 3D chemistry"
        },
        {
          "language": "GLSL",
          "role": "3D WebGL2 shaders"
        }
      ],
      "thirdParty": {
        "summary": "Includes Apache-2.0 (Indigo), BSD-3-Clause (OpenChemLib), and OFL-1.1 fonts (Libre Franklin; font derivatives retain OFL).",
        "source": "https://github.com/google/fonts/blob/main/ofl/librefranklin/OFL.txt",
        "notice": null,
        "libraries": [
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its standalone editor produces styled 2D structures, reaction schemes, and publication-size SVG and PNG figures.",
      "summary": "MolDraw is a browser editor for chemical structures, reaction schemes, mechanisms, and publication figures.",
      "website": "https://www.moldraw.com/",
      "repo": null,
      "docs": "https://www.moldraw.com/docs/",
      "vendor": "Scidart Academy (Rafeeque Mavoor)",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Free core drawing with paid Pro features; not open source.",
        "source": "https://www.moldraw.com/blog/moldraw-vs-ketcher.html"
      },
      "price": {
        "text": "Free tier; Pro US$99/year including tax (2026-11-05; country pricing varies).",
        "source": "https://www.moldraw.com/pricing"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": true,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://www.moldraw.com/pages/updates.html"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-single-double-triple-and-wedge-bonds/",
          "note": "Drew single, double, and triple bonds.",
          "shot": {
            "image": "evidence/moldraw/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the drawing canvas."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-single-double-triple-and-wedge-bonds/",
          "note": "Drew wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/moldraw/f-stereo-bonds.webp",
            "caption": "Wedge, hashed wedge, and wavy bonds on the canvas."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/special-bond-types-dative-hydrogen-bold-wavy-and-query/",
          "note": "Dative, hydrogen, centroid, and query bonds are drawable.",
          "shot": {
            "image": "evidence/moldraw/f-special-bonds.webp",
            "caption": "Bond menu listing dative and hydrogen bonds."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-faster-with-hover-shortcuts/",
          "note": "Repeated clicks or 2 cycle centered, right, and left.",
          "plan": "Free",
          "planLevel": "free"
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-benzene-cyclohexane-and-fused-rings/",
          "note": "Placed benzene and cyclopentane rings.",
          "shot": {
            "image": "evidence/moldraw/f-rings.webp",
            "caption": "Benzene and cyclopentane rings on the canvas."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-benzene-cyclohexane-and-fused-rings/",
          "note": "Cyclohexane menu offers chair and boat projections.",
          "shot": {
            "image": "evidence/moldraw/f-conformers.webp",
            "caption": "Cyclohexane menu with chair and boat options."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-carbon-chains-and-functional-group-abbreviations/",
          "note": "Drag a zigzag chain; numbered atoms show its length.",
          "plan": "Free",
          "planLevel": "free"
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/library/how-to-use-the-structure-library-and-templates/",
          "note": "Placed alanine from structure library.",
          "shot": {
            "image": "evidence/moldraw/f-templates.webp",
            "caption": "Structure library showing amino acid templates."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-carbon-chains-and-functional-group-abbreviations/",
          "note": "Ph, Boc, OMe, and other groups expand into atoms.",
          "plan": "Free",
          "planLevel": "free"
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-atoms-and-change-elements/",
          "note": "Atom editing sets elements, isotopes, charges, and labels.",
          "shot": {
            "image": "evidence/moldraw/f-atom-labels.webp",
            "caption": "Structure with element labels and charged atoms."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-add-lone-pairs-radicals-and-formal-charges/",
          "note": "Atom-attached lone pairs and radical dots.",
          "shot": {
            "image": "evidence/moldraw/f-radicals.webp",
            "caption": "Lone-pair dots appear on oxygen and nitrogen atoms."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-faster-with-hover-shortcuts/",
          "note": "Hover keys change bond order, stereo, atom labels, and charges.",
          "plan": "Free",
          "planLevel": "free"
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-select-move-copy-and-align-structures/",
          "note": "Lasso selection, rotation handles, flips, and resizing.",
          "plan": "Free",
          "planLevel": "free"
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-clean-up-2d-and-3d-structure-drawings/",
          "note": "Structure Perspective rotates a 3D pose on the drawing canvas.",
          "plan": "Free",
          "planLevel": "free"
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/reactions/how-to-draw-reaction-arrows-with-reagents/",
          "note": "Drew straight and equilibrium arrows.",
          "shot": {
            "image": "evidence/moldraw/f-reaction-arrows.webp",
            "caption": "Arrow menu listing straight, equilibrium, and retrosynthetic arrows."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/reactions/how-to-draw-curved-arrow-mechanisms-and-fishhook-arrows/",
          "note": "Drew electron-flow and fishhook curves.",
          "shot": {
            "image": "evidence/moldraw/f-mechanism-arrows.webp",
            "caption": "Equilibrium and curved electron-flow arrows on the canvas."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/reactions/how-to-make-a-chemical-reaction-scheme/",
          "note": "Reaction SMILES input and RXN export preserve reaction chemistry.",
          "shot": {
            "image": "evidence/moldraw/f-reaction-data.webp",
            "caption": "SMILES paste field shows an example reaction SMILES."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/reactions/how-to-map-atoms-in-a-reaction-with-automap/",
          "note": "Automap assigns matching atom numbers across reactants and products.",
          "plan": "Free",
          "planLevel": "free"
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-atomic-orbitals-s-p-and-d/",
          "note": "Rotatable s, p, d, and hybrid orbital objects.",
          "plan": "Free",
          "planLevel": "free"
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Canvas text documented; complete rich formatting unverified."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/get-started/moldraw-editor-interface-toolbar-and-panels-explained/",
          "note": "Drawing tools include shapes, freehand pencil, and brackets.",
          "plan": "Free",
          "planLevel": "free"
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-select-move-copy-and-align-structures/",
          "note": "Align edges or centers; distribute horizontally or vertically.",
          "plan": "Free",
          "planLevel": "free"
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-select-move-copy-and-align-structures/",
          "note": "Group and Ungroup combine molecules for movement.",
          "plan": "Free",
          "planLevel": "free"
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-clean-up-2d-and-3d-structure-drawings/",
          "note": "Cleanup evens bond lengths, angles, and ring shapes.",
          "engine": {
            "library": "In-house browser JavaScript cleanup; optional Indigo 1.46.0 indigo-ketcher-norender browser WebAssembly layout/clean2d",
            "source": "https://www.moldraw.com/assets/moleculeEngineWorker-KcmTBWf9.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/import-export/how-to-make-publication-ready-figures-dpi-size-and-journal-styles/",
          "note": "ACS, RSC, Nature Portfolio, and Nature Chemistry presets.",
          "plan": "Free",
          "planLevel": "free"
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-change-structure-style-colors-and-display/",
          "note": "Settings can save style presets for reuse.",
          "plan": "Free",
          "planLevel": "free"
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-change-structure-style-colors-and-display/",
          "note": "Color selected atoms or other drawing content.",
          "plan": "Free",
          "planLevel": "free"
        },
        "pages": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Page setup and separate slide list visible."
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-add-text-shapes-images-and-lab-glassware/",
          "note": "Place PNG, JPEG, WebP, GIF, and SVG images.",
          "plan": "Free",
          "planLevel": "free"
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/tools/free-chem-tools/tlc-diagram-tool.html",
          "note": "Separate TLC tool edits lanes, spots, solvent front, and labels.",
          "plan": "Free",
          "planLevel": "free"
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/analyze/how-to-check-a-structure-for-valence-errors/",
          "note": "Flags excessive valence, unusual charge, and stereo problems.",
          "engine": {
            "library": "In-house browser JavaScript valence, charge and stereo checks",
            "source": "https://www.moldraw.com/assets/moleculeEngineWorker-KcmTBWf9.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-stereochemistry-wedge-hash-and-r-s-labels/",
          "note": "Computed CIP labels include R, S, E, and Z.",
          "engine": {
            "library": "In-house browser JavaScript CIP/E-Z perception; Indigo 1.46.0 browser WebAssembly fallback",
            "source": "https://www.moldraw.com/assets/moleculeEngineWorker-KcmTBWf9.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/analyze/how-to-find-iupac-name-molecular-formula-and-weight/",
          "note": "Caffeine: C8H10N4O2 and 194.19 g/mol.",
          "shot": {
            "image": "evidence/moldraw/f-formula-mass.webp",
            "caption": "Caffeine molecule details show formula and molecular weight."
          },
          "engine": {
            "library": "In-house browser JavaScript formula/mass calculation; Indigo 1.46.0 browser WebAssembly calculations",
            "source": "https://www.moldraw.com/assets/index-CEgdk3Xo.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/analyze/how-to-find-iupac-name-molecular-formula-and-weight/",
          "note": "Paclitaxel details displayed logP 3.736.",
          "shot": {
            "image": "evidence/moldraw/f-properties.webp",
            "caption": "Molecule details show calculated logP and other properties."
          },
          "engine": {
            "library": "Indigo 1.46.0 indigo-ketcher-norender (browser WebAssembly; logP, pKa, molar refractivity)",
            "source": "https://www.moldraw.com/assets/moleculeEngineWorker-KcmTBWf9.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/import-export/how-to-search-pubchem-by-name-or-cas-number/",
          "note": "PubChem search for caffeine placed a structure.",
          "engine": {
            "library": "PubChem PUG REST (remote HTTP API)",
            "source": "https://www.moldraw.com/assets/pubchemNameResolve-DUbYDozL.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/analyze/how-to-find-iupac-name-molecular-formula-and-weight/",
          "note": "Caffeine details displayed 1,3,7-trimethylpurine-2,6-dione.",
          "shot": {
            "image": "evidence/moldraw/f-structure-to-name.webp",
            "caption": "Caffeine molecule details show its IUPAC name."
          },
          "engine": {
            "library": "PubChem PUG REST (remote SMILES-to-IUPACName lookup)",
            "source": "https://www.moldraw.com/assets/index-CEgdk3Xo.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/plugins/nmr-analyser-plugin-predict-1h-13c-and-2d-nmr-spectra/",
          "note": "Free-account NMR plugin predicts 1H and 13C shifts.",
          "engine": {
            "library": "Zakodium NMR Prediction service (remote HTTP; Spinus/HOSE 1H, HOSE 13C)",
            "source": "https://www.moldraw.com/assets/api-BuRJ5fx_.js"
          },
          "plan": "Free account",
          "planLevel": "account"
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-add-atom-labels-and-r-groups/",
          "note": "Supports R, R1, and R2 atom labels.",
          "plan": "Free",
          "planLevel": "free"
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/how-to-draw-polymer-repeat-unit-brackets/",
          "note": "Repeat-unit brackets attach to selected atoms; n/m labels editable.",
          "plan": "Free",
          "planLevel": "free"
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/tools/free-chem-tools/peptide-dna-sequence-to-structure.html",
          "note": "Companion sequence tool builds peptide, DNA, and RNA structures.",
          "plan": "Free",
          "planLevel": "free"
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/pricing",
          "note": "Pro only; image recognition includes 300 scans per month.",
          "engine": {
            "library": "Mathpix (remote OCR service through MolDraw /api/snip/convert)",
            "source": "https://www.moldraw.com/assets/index-CEgdk3Xo.js"
          },
          "plan": "Pro",
          "planLevel": "paid"
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/import-export/how-to-search-pubchem-by-name-or-cas-number/",
          "note": "Caffeine PubChem search placed a structure.",
          "engine": {
            "library": "PubChem PUG REST (remote name/CAS/CID lookup)",
            "source": "https://www.moldraw.com/assets/pubchemNameResolve-DUbYDozL.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "model-3d": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/analyze/how-to-view-molecules-in-3d/",
          "note": "Rotates, but cholesterol bonds appeared severely elongated in headless Chromium.",
          "shot": {
            "image": "evidence/moldraw/f-model-3d.webp",
            "caption": "Cholesterol drawing beside its three-dimensional model."
          },
          "engine": {
            "library": "In-house browser JavaScript/WebGL2 molecule viewer and GLSL shaders",
            "source": "https://www.moldraw.com/assets/viewer-1nlcEDri.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/blog/crystal-view-plugin-cif-unit-cell-3d.html",
          "note": "Free-account Crystal View plugin opens CIF and editable crystal drawings.",
          "plan": "Free account",
          "planLevel": "account"
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/import-export/how-to-export-png-svg-pdf-mol-and-cdxml-files/",
          "note": "CDXML download prompted for an account; import unverified.",
          "shot": {
            "image": "evidence/moldraw/f-cdxml.webp",
            "caption": "Download menu lists CDXML among chemistry formats."
          },
          "engine": {
            "library": "In-house browser JavaScript CDXML parser/writer",
            "source": "https://www.moldraw.com/assets/index-CEgdk3Xo.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/import-export/how-to-export-png-svg-pdf-mol-and-cdxml-files/",
          "note": "Binary CDX import and export.",
          "shot": {
            "image": "evidence/moldraw/f-cdx.webp",
            "caption": "Download menu lists CDX among chemistry formats."
          },
          "engine": {
            "library": "In-house browser JavaScript binary CDX import; Indigo 1.46.0 browser WebAssembly export and fallback import",
            "source": "https://www.moldraw.com/assets/index-CEgdk3Xo.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/import-export/how-to-export-png-svg-pdf-mol-and-cdxml-files/",
          "note": "MOL and SDF opened; MOL download requires account.",
          "shot": {
            "image": "evidence/moldraw/f-mol-sdf.webp",
            "caption": "Download menu lists the MOL chemistry format."
          },
          "engine": {
            "library": "In-house browser JavaScript MOL parser/writer and SDF record reader",
            "source": "https://www.moldraw.com/assets/index-CEgdk3Xo.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/import-export/how-to-copy-and-paste-smiles-inchi-and-mol/",
          "note": "Import works; complex output changes stereochemistry; copying requires account.",
          "shot": {
            "image": "evidence/moldraw/f-smiles.webp",
            "caption": "Caffeine molecule details display a SMILES string."
          },
          "engine": {
            "library": "In-house browser JavaScript SMILES parser/writer; optional Indigo 1.46.0 browser WebAssembly layout",
            "source": "https://www.moldraw.com/assets/moleculeEngineWorker-KcmTBWf9.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "inchi": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/import-export/how-to-copy-and-paste-smiles-inchi-and-mol/",
          "note": "Caffeine details displayed an InChI.",
          "shot": {
            "image": "evidence/moldraw/f-inchi.webp",
            "caption": "Caffeine molecule details display an InChI string."
          },
          "engine": {
            "library": "Indigo 1.46.0 indigo-ketcher-norender (browser WebAssembly conversion)",
            "source": "https://www.moldraw.com/assets/moleculeEngineWorker-KcmTBWf9.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/import-export/how-to-export-png-svg-pdf-mol-and-cdxml-files/",
          "note": "MDL RXN reaction export.",
          "shot": {
            "image": "evidence/moldraw/f-rxn.webp",
            "caption": "Download menu lists RXN among chemistry formats."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "svg-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/import-export/how-to-export-png-svg-pdf-mol-and-cdxml-files/",
          "note": "SVG download prompted for an account.",
          "shot": {
            "image": "evidence/moldraw/f-svg-export.webp",
            "caption": "Download menu lists SVG among image formats."
          },
          "plan": "Free account",
          "planLevel": "account"
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "PDF download prompted for an account.",
          "shot": {
            "image": "evidence/moldraw/f-pdf-export.webp",
            "caption": "Download menu lists PDF among image formats."
          }
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://www.moldraw.com/docs/import-export/how-to-make-publication-ready-figures-dpi-size-and-journal-styles/",
          "note": "PNG download prompted for an account; resolution unverified.",
          "plan": "Free account",
          "planLevel": "account"
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "ChemDraw clipboard roundtrip unverified; file exchange is documented."
        },
        "office": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/import-export/how-to-use-moldraw-structures-in-word-and-powerpoint/",
          "note": "Reopen exported pictures in MolDraw; Office add-ins unavailable.",
          "plan": "Free",
          "planLevel": "free"
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.moldraw.com/blog/molscript-reaction-mechanism-language.html",
          "note": "MolScript CLI complete; public package publication pending."
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/developers/connect-ai-agents-to-moldraw-with-mcp/",
          "note": "Hosted MCP creates, edits, converts, and exports; free account required.",
          "plan": "Free account",
          "planLevel": "account"
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/plugins/moldraw-plugins-overview-and-how-to-install/",
          "note": "Installable plugins; most require a free account.",
          "plan": "Free account",
          "planLevel": "account"
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/developers/how-to-embed-moldraw-and-interactive-demos/",
          "note": "Embed https://www.moldraw.com/embed in an iframe; no account required.",
          "plan": "Free",
          "planLevel": "free"
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/ai/how-to-use-the-ai-chemistry-assistant/",
          "note": "Pro only; assistant draws and edits using a monthly allowance.",
          "plan": "Pro",
          "planLevel": "paid"
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/import-export/how-to-use-moldraw-structures-in-word-and-powerpoint/",
          "note": "PNG/SVG pictures preserve drawing metadata; editing requires manual reopening and replacement."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/developers/molscript-language-for-reactions-and-mechanisms/",
          "note": "MolScript supports atom and bond highlighter fills.",
          "plan": "Free",
          "planLevel": "free"
        }
      },
      "caveats": [
        "Saving or exporting drawings containing Templates content or lab apparatus requires Pro.",
        "Office editing requires reopening the exported picture in MolDraw and replacing it.",
        "Free users are asked to credit MolDraw; Pro removes this request.",
        "Result depends on how SMILES goes in. Pasting on the canvas gave a clean paclitaxel with no wedge or hash bonds shown. The Paste SMILES button kept wedges, but the layout overlapped."
      ],
      "github": null,
      "hands": {
        "testedVersion": "4.0",
        "canvas": "evidence/moldraw/canvas.webp",
        "canvasLight": "evidence/moldraw/canvas-light.webp",
        "canvasDark": "evidence/moldraw/canvas-dark.webp",
        "memory": {
          "idleMb": 825.9,
          "paclitaxelMb": 787.28,
          "baselineMb": 350.65,
          "rssIdleMb": 1892.12,
          "rssPaclitaxelMb": 1930.35,
          "runs": 3,
          "processes": 11,
          "method": "Headed Chrome process-tree physical footprint; canvas Cmd+V; medians of three.",
          "note": "Transient Chrome updater processes were included in idle measurements."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://www.moldraw.com/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/moldraw/simple.png",
            "note": "Canvas paste; clean layout. Downloads require an account.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/moldraw/complex.png",
            "note": "Canvas paste; clean, no wedge/hash bonds. Stereochemistry retention unverified.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/moldraw/threed.png",
            "note": "Rotatable 3D model; zoomed out to fit. Downloads require an account.",
            "structure": null
          }
        ],
        "observations": [
          "Caffeine appeared with aromatic circles in the default SMILES layout.",
          "Paclitaxel default 2D layout contained overlapping bonds.",
          "Paclitaxel displayed SMILES differed from input at one stereocenter; connectivity matched.",
          "Cholesterol 3D bonds appeared elongated in headless Chromium, including after SDF import.",
          "Downloads and Copy SMILES prompted for an account; molecule details displayed SMILES.",
          "Current paclitaxel SMILES layout overlapped; MOL import displayed a clear drawing.",
          "A later cholesterol SMILES import produced a normally proportioned, rotatable 3D model.",
          "Publisher homepage application metadata declares softwareVersion 4.0.",
          "Paclitaxel remained stretched at 5, 30, 60 and 120 seconds; UFF stayed 24338.7 kcal/mol.",
          "Headed Chrome also showed stretched paclitaxel with UFF 24338.7 kcal/mol.",
          "Cholesterol headless model stayed normally proportioned at 5, 30, 60 and 120 seconds; UFF stayed 63.3 kcal/mol.",
          "Headed Chrome cholesterol model remained stretched, with UFF 115.2 kcal/mol unchanged over the comparison.",
          "Original paclitaxel SMILES overlapped through toolbar but drew cleanly through canvas paste.",
          "Canvas and command-palette imports displayed no stereochemical wedges for paclitaxel.",
          "Stereo-free paclitaxel produced a clean toolbar layout."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 1098,
        "transferBytes": 3524896
      },
      "downloadBytes": null,
      "references": [
        "https://www.moldraw.com/pricing",
        "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing"
      ]
    },
    {
      "id": "p46",
      "slug": "penzene",
      "name": "Penzene",
      "rank": 4,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit",
          "ChemDraw file library",
          "InChI"
        ],
        "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/CMakeLists.txt#L32",
        "note": "Custom canvas; Ketcher inspired its interface. ChemDraw library handles files."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Penzene renderer (Qt QPainter)",
        "language": "C++",
        "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Render.cpp#L870-L1009"
      },
      "enginesChecked": true,
      "languageNote": "Excludes Python bindings, tests, documentation and packaging/build scripts.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-3.0-or-later copyleft",
        "how": "Python renders static SVG; no embeddable editor widget documented."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "Public package wrapping native engine"
        },
        {
          "language": "C",
          "role": "InChI identifier library"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-3.0-only Qt, MPL-2.0 Eigen, GPL-3.0 GCC runtimes with GCC-exception-3.1 (Linux wheels), and ODbL-derived NMR data (share-alike; dependent software must be OSI-licensed).",
        "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/THIRD_PARTY_LICENSES.md",
        "notice": "https://github.com/JamesOBrien2/penzene/blob/main/THIRD_PARTY_LICENSES.md",
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "ChemDraw file library",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Glysade/chemdraw/blob/main/chemdraw/license.txt"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its desktop editor produces publication figures with reaction schemes, journal styles, page layout and vector exports.",
      "summary": "A native desktop editor for chemical structures, reaction schemes and publication figures.",
      "website": "https://github.com/JamesOBrien2/penzene",
      "repo": "https://github.com/JamesOBrien2/penzene",
      "docs": "https://penzene.readthedocs.io/",
      "vendor": "James O'Brien",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-3.0-or-later",
        "text": "GNU General Public License version 3 or later.",
        "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/README.md#license"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/install.md"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v2.0.0",
        "date": "2026-10-22",
        "source": "https://github.com/JamesOBrien2/penzene/releases/tag/v2.0.0"
      },
      "engine": {
        "rendering": "Custom Qt QPainter renderer; QSvgGenerator for SVG and QPdfWriter for PDF.",
        "chemistry": "RDKit",
        "ui": "Qt 6 Widgets",
        "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Render.cpp#L1355"
      },
      "languages": [
        "C++"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/keys.md#bond",
          "note": "Drew single bond; changed existing bond through double and triple.",
          "shot": {
            "image": "evidence/penzene/f-bonds-core.webp",
            "caption": "Bond palette with single, double and triple bond tools."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/keys.md#bond",
          "note": "Wedge and hashed bonds drawn; no wavy tool found.",
          "shot": {
            "image": "evidence/penzene/f-stereo-bonds.webp",
            "caption": "Solid wedge and hashed bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/keys.md#L60",
          "note": "Dative arrows and dotted hydrogen bonds."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#bonds",
          "note": "Keyboard controls place second lines left, centred or right."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#rings-and-templates",
          "note": "Drew benzene and five-membered ring using dedicated tools.",
          "shot": {
            "image": "evidence/penzene/f-rings.webp",
            "caption": "Five-membered and aromatic rings on the canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#rings-and-templates",
          "note": "Chair cyclohexane tools and Haworth projection templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Canvas.cpp#L953",
          "note": "Drag distance sets zig-zag chain length."
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#rings-and-templates",
          "note": "Library opens; placement blocked by accessibility automation errors.",
          "shot": {
            "image": "evidence/penzene/f-templates.webp",
            "caption": "Amino acid templates in the library panel."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#rings-and-templates",
          "note": "Save Selection as Template adds reusable user structures."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#atoms-and-labels",
          "note": "Recognizes Boc, OMe and others; expands abbreviations into structures."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#atoms-and-labels",
          "note": "Element labels, charges and isotope mass numbers."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#atoms-and-labels",
          "note": "Atom Properties sets radical electrons and drawn lone pairs."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#tools-and-the-hotspot",
          "note": "Hovering establishes hotspots; keys change atoms and bonds."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#selecting-and-arranging",
          "note": "Lasso selection, rotation, flip and scaling handles."
        },
        "perspective": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#selecting-and-arranging",
          "note": "Rotate in 3D changed cholesterol's canvas projection.",
          "shot": {
            "image": "evidence/penzene/f-perspective.webp",
            "caption": "A drawing rotated in 3D on the canvas."
          }
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#arrows-text-shapes-and-colour",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/penzene/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#arrows-text-shapes-and-colour",
          "note": "Drew curved electron-pair and single-electron fishhook arrows.",
          "shot": {
            "image": "evidence/penzene/f-mechanism-arrows.webp",
            "caption": "Curved arrows with full and fishhook arrowheads."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/figures.md#reaction-schemes",
          "note": "Reaction SMILES and RXN preserve reactants, agents and products."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md",
          "note": "Manually assigned atom-map numbers export in SMILES and MOL."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#arrows-text-shapes-and-colour",
          "note": "Editable s, p, lobe and hybrid orbital shapes."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#arrows-text-shapes-and-colour",
          "note": "Fonts, bold, italic, formula subscripts and charge superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#arrows-text-shapes-and-colour",
          "note": "Lines, boxes, ellipses and editable structure brackets."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#selecting-and-arranging",
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#selecting-and-arranging",
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md",
          "note": "Clean regenerates 2D layout while preserving stereochemistry and bond styles.",
          "engine": {
            "library": "RDKit RDDepictor (C++), with In-house (C++) coordination layout",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp#L825-L867"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/journal-styles.md",
          "note": "ACS, RSC, Nature, Angewandte and SYNLETT/SYNTHESIS presets.",
          "shot": {
            "image": "evidence/penzene/f-journal-styles.webp",
            "caption": "Drawing Styles lists ACS, RSC, Nature and other presets."
          }
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/journal-styles.md#customization-and-exchange",
          "note": "Save custom bond and font settings; exchange JSON styles.",
          "shot": {
            "image": "evidence/penzene/f-custom-styles.webp",
            "caption": "Drawing Styles dialog with duplicate, import, export and save controls."
          }
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#arrows-text-shapes-and-colour",
          "note": "Colors individual atoms, bonds, arrows and text."
        },
        "pages": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/figures.md#page-mode",
          "note": "Multiple pages in .penz; paper and journal page sizes."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#rings-and-templates",
          "note": "TLC template has movable spots, streaks, lanes and calculated Rf."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md",
          "note": "Flags excess valence and lists structural or stereo problems.",
          "engine": {
            "library": "RDKit (C++) valence and stereo perception; In-house (C++) structure checks",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp#L2899-L2979"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md",
          "note": "Computes CIP R/S and E/Z labels from drawings.",
          "engine": {
            "library": "RDKit CIPLabeler (C++)",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp#L2876-L2897"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md",
          "note": "Caffeine C8H10N4O2; MW 194.19; exact mass 194.0804.",
          "shot": {
            "image": "evidence/penzene/f-formula-mass.webp",
            "caption": "Properties panel showing molecular formula, molecular weight and exact mass."
          },
          "engine": {
            "library": "RDKit Descriptors (C++)",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp#L2441-L2448"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md",
          "note": "Cholesterol panel showed cLogP 7.39 and TPSA 20.2.",
          "shot": {
            "image": "evidence/penzene/f-properties.webp",
            "caption": "Properties panel showing cLogP, TPSA and other estimates."
          },
          "engine": {
            "library": "RDKit Descriptors (C++)",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp#L2450-L2462"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md",
          "note": "Import Name caffeine returned a structure through PubChem.",
          "engine": {
            "library": "PubChem PUG REST web service",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Online.cpp#L54-L89"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md",
          "note": "Caffeine returned 1,3,7-trimethylpurine-2,6-dione via Copy As IUPAC Name.",
          "shot": {
            "image": "evidence/penzene/f-structure-to-name.webp",
            "caption": "Copied name: 1,3,7-trimethylpurine-2,6-dione."
          },
          "engine": {
            "library": "PubChem PUG REST web service",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Online.cpp#L54-L89"
          }
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md#nmr-prediction",
          "note": "NMR panel displayed a predicted cholesterol carbon-13 stick spectrum.",
          "shot": {
            "image": "evidence/penzene/f-nmr-prediction.webp",
            "caption": "Predicted carbon-13 NMR stick spectrum."
          },
          "engine": {
            "library": "In-house (C++) HOSE-code matching over bundled nmrshiftdb2 data; RDKit (C++) molecular preprocessing",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp#L3111-L3400"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/drawing.md#atoms-and-labels",
          "note": "MDL R-groups, generic atoms and chemical query atom lists."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/cli.md#L26",
          "note": "Peptide sequences produce structures; supports D-residues and terminal caps."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md",
          "note": "Caffeine name lookup fetched its structure from PubChem.",
          "engine": {
            "library": "PubChem PUG REST web service",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Online.cpp#L54-L89"
          }
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp#L3027",
          "note": "Canvas projection rotates; no molecular 3D model view found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/files.md#L10",
          "note": "Saved caffeine CDXML and reopened it successfully.",
          "engine": {
            "library": "RDKit CDXMLParser (C++) molecule import; In-house (C++/Qt XML) graphics import and document export",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/files.md#L11",
          "note": "Binary CDX import and export on every desktop platform.",
          "engine": {
            "library": "Revvity ChemDraw file library (Glysade/chemdraw, vendored C++ private static library)",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/ChemDrawIO.cpp"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/files.md#L6",
          "note": "MOL and SDF saved and reopened; 3D SDF also opened.",
          "engine": {
            "library": "RDKit FileParsers and FileWriters (C++); In-house (C++) SDF framing",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/python-api.md#L193",
          "note": "Imported fixtures; copied caffeine SMILES and verified pasted text.",
          "engine": {
            "library": "RDKit SmilesParse and SmilesWrite (C++)",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/chemistry.md",
          "note": "Imports InChI; Copy As exports InChI and InChIKey.",
          "engine": {
            "library": "InChI (native library via RDKit RDInchiLib C++ API)",
            "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Chem.cpp#L2733-L2744"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/files.md#L8",
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/tutorials/office-latex.md#L23",
          "note": "Default SVG exports written for all three fixtures."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/tutorials/office-latex.md#L23",
          "note": "Caffeine PDF exported; vector content and attached structures verified."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/python-api.md#L189",
          "note": "Default caffeine PNG exported; pHYs metadata records 300 dpi."
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/MainWindow.cpp#L1841",
          "note": "Editable CDX clipboard transfer both ways on macOS."
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/tutorials/office-latex.md#4-keep-an-editable-drawing-object-on-windows",
          "note": "Windows installer enables editable Word and PowerPoint OLE drawing objects."
        },
        "python-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/python.md",
          "note": "Documented package edits, analyzes and renders drawings."
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/cli.md",
          "note": "Headless rendering and batch descriptor exports."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/JamesOBrien2/penzene/blob/main/docs/tutorials/jupyter.md",
          "note": "Python renders static SVG; no embeddable editor widget documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/docs/tutorials/office-latex.md#4-keep-an-editable-drawing-object-on-windows",
          "note": "Windows installer enables OLE objects with double-click editing and document updates."
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/src/Canvas.cpp#L726",
          "note": "Selection halos highlight atoms and bonds only in the editor."
        }
      },
      "caveats": [
        "Unsigned macOS and Windows installers can trigger operating-system security prompts.",
        "PubChem naming requires internet despite the manual's broader claim that Penzene never goes online.",
        "ChemDraw docs and save labels understate implemented support: orbital and Windows CDX imports, and non-molecule CDX exports."
      ],
      "github": {
        "url": "https://github.com/JamesOBrien2/penzene",
        "stars": 4,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-09-23",
        "commits": 584,
        "contributors": 1,
        "pushedAt": "2026-10-29T02:40:11Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "2.0.0",
        "canvas": "evidence/penzene/canvas.webp",
        "canvasLight": "evidence/penzene/canvas-light.webp",
        "canvasDark": "evidence/penzene/canvas-dark.webp",
        "memory": {
          "idleMb": 96.28,
          "paclitaxelMb": 128.42,
          "baselineMb": null,
          "rssIdleMb": 217.92,
          "rssPaclitaxelMb": 281.3,
          "runs": 3,
          "processes": 5,
          "method": "Three-run median; summed phys_footprint; ps tree plus lsappinfo coalition; 10-second settling.",
          "note": "MiB; native Qt; three idle processes, five loaded; published SMILES import."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "penzene-macos-arm64.dmg",
        "ran": true,
        "failure": null,
        "downloadBytes": 46165981,
        "installedBytes": 102776832,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/penzene/simple.svg",
            "note": "Current Kekule SMILES; automatic layout preserved without cleanup.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/penzene/complex.svg",
            "note": "Current Kekule SMILES; automatic layout preserved without cleanup.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": "match"
          }
        ],
        "observations": [
          "Default style was ACS 1996 with Arial 10 pt atom labels.",
          "The default canvas was dark with grid lines and light bonds.",
          "SMILES imports generated layouts without manual cleanup.",
          "Paclitaxel displayed wedge and hashed bonds.",
          "The 3D SDF fallback saved as MOL with explicit hydrogens and zero z coordinates."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 422,
        "idleMb": 156,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 46165981,
      "references": [
        "https://github.com/JamesOBrien2/penzene",
        "https://github.com/JamesOBrien2/penzene/blob/083d83a603e12cefb1d328d01dd9f05f10754bf9/README.md"
      ]
    },
    {
      "id": "p43",
      "slug": "octet-draw",
      "name": "Octet Draw",
      "rank": 5,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "Indigo",
          "OPSIN",
          "InChI"
        ],
        "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx#L7324",
        "note": "Custom SVG canvas; Indigo chemistry, OPSIN name conversion, and bundled InChI."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Octet ACS 1996 SVG renderer",
        "language": "TypeScript",
        "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/render.ts#L659"
      },
      "enginesChecked": true,
      "languageNote": "CSS styles UI; Java adapts OPSIN; JavaScript supports tooling/generated vendors.",
      "video": {
        "provider": "file",
        "url": "https://octet.software/media/octet-draw-demo.mp4",
        "embed": null,
        "title": "Octet Draw in use: drawing ibuprofen, choosing a shape, and the Actions panel.",
        "author": null,
        "linkedFrom": "https://octet.software/",
        "poster": "https://octet.software/media/octet-draw-demo.jpg"
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Standalone desktop editor; no supported embedding integration found."
      },
      "otherLanguages": [
        {
          "language": "Rust",
          "role": "Native shell, export and clipboard"
        },
        {
          "language": "JavaScript",
          "role": "OPSIN bundle and WebAssembly glue"
        },
        {
          "language": "C++",
          "role": "Indigo chemistry compiled to WebAssembly"
        },
        {
          "language": "C",
          "role": "InChI compiled into Indigo WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": "Includes MPL-2.0 crates, custom LGPL-2.1-based InChI, OFL-1.1 fonts, ODbL-derived share-alike NMR data (dependent software must be OSI-licensed), and proprietary WebView2 (Windows offline installer).",
        "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/THIRD_PARTY.md",
        "notice": "https://github.com/SamChemMan/Octet-Draw/blob/main/THIRD_PARTY.md",
        "libraries": [
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It creates styled 2D chemical documents with reactions, page layout, editable ChemDraw files and vector exports.",
      "summary": "Free desktop software for drawing chemical structures, reaction schemes and publication figures.",
      "website": "https://octet.software/",
      "repo": "https://github.com/SamChemMan/Octet-Draw",
      "docs": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/README.md",
      "vendor": "Sam Ellis",
      "license": {
        "kind": "open-source",
        "spdx": "Apache-2.0",
        "text": "Apache License 2.0; bundled NMR data has separate share-alike terms.",
        "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/README.md"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v1.1.0",
        "date": "2026-11-04",
        "source": "https://github.com/SamChemMan/Octet-Draw/releases/tag/v1.1.0"
      },
      "engine": {
        "rendering": "Custom TypeScript SVG renderer; svg2pdf for PDF and resvg/tiny-skia for raster export",
        "chemistry": "Indigo WebAssembly, OPSIN, and in-house naming, stereochemistry and property calculations",
        "ui": "React and TypeScript in Tauri 2",
        "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx"
      },
      "languages": [
        "TypeScript",
        "Rust"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/keys.ts",
          "note": "Drew single, double, triple; changed an existing bond to double.",
          "shot": {
            "image": "evidence/octet-draw/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/kinds.ts",
          "note": "Drew solid wedge, hashed wedge and wavy bonds.",
          "shot": {
            "image": "evidence/octet-draw/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds on the drawing canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/kinds.ts",
          "note": "Dative, hydrogen and quadruple bond tools."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Actions.tsx",
          "note": "Double bonds offer left, right, centered and automatic positions."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/tools.tsx",
          "note": "Placed benzene and cyclohexane using ring tools.",
          "shot": {
            "image": "evidence/octet-draw/f-rings.webp",
            "caption": "A benzene ring on the drawing canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0017-template-library-sets.md",
          "note": "Chair, Haworth, Newman and other conformer templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx",
          "note": "Drag a zig-zag chain; atom count follows its length."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0017-template-library-sets.md",
          "note": "Inserted the built-in alanine template."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx",
          "note": "Save selected drawings into reusable named template sets."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/labels.ts",
          "note": "Ph, Boc and condensed labels resolve into chemical structures."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx",
          "note": "Atom Properties sets element labels, charges and isotope mass numbers."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/tools.tsx",
          "note": "Atom symbol tools place radical dots and lone pairs."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Coach.tsx",
          "note": "Point at an atom or bond and use chemistry shortcut keys."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx",
          "note": "Lasso selection supports rotation, flipping and resizing."
        },
        "perspective": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0012-structures-in-perspective.md",
          "note": "Generated depth-shaded cholesterol and rotated it by dragging.",
          "shot": {
            "image": "evidence/octet-draw/f-perspective.webp",
            "caption": "Depth-shaded cholesterol drawing with overlapping atom labels."
          }
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/kinds.ts",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/octet-draw/f-reaction-arrows.webp",
            "caption": "A forward reaction arrow on the drawing canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx",
          "note": "Drew curved electron-pair and fishhook arrows.",
          "shot": {
            "image": "evidence/octet-draw/f-mechanism-arrows.webp",
            "caption": "Curved arrows on the drawing canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts",
          "note": "Chemistry-aware reactions export RXN, RDF and reaction SMILES."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts",
          "note": "Automatic reaction mapping preserves manually mapped atom pairs."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/elements.tsx",
          "note": "Orbital library includes s, p, hybrid and other shapes."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Actions.tsx",
          "note": "Canvas captions support fonts, subscripts, superscripts and styled text."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/edit.ts",
          "note": "Editable shapes, brackets and Bézier curves."
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Actions.tsx",
          "note": "Selected objects align by edges or centers and distribute evenly."
        },
        "groups": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx",
          "note": "Grouped structures and graphics select and move together."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts",
          "note": "Clean Up straightens bond lengths and angles.",
          "shot": {
            "image": "evidence/octet-draw/f-cleanup.webp",
            "caption": "Clean up structure command beside a selected molecule."
          },
          "engine": {
            "library": "Ported from Indigo MoleculeCleaner2d and BiconnectedDecomposer (TypeScript, modified)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/clean2d.ts#L1"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/README.md#what-it-does",
          "note": "ACS default with additional journal presets."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/docstyle.ts",
          "note": "Save named style templates containing bond and font settings."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx",
          "note": "Color individual atoms, bonds, captions and drawing objects.",
          "shot": {
            "image": "evidence/octet-draw/f-color.webp",
            "caption": "Colour controls beside a selected molecule."
          }
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/docstyle.ts",
          "note": "Page size controls and tiled printing; canvas lacks separate document pages."
        },
        "pictures": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/picture.ts",
          "note": "Place raster images as picture objects."
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/edit.ts",
          "note": "Dedicated TLC plates and editable tables."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/check.ts",
          "note": "Flags valence and other structure problems.",
          "engine": {
            "library": "In-house (TypeScript valence, charge and geometry checks); Indigo (WebAssembly stereochemistry checks)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/check.ts#L130"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0013-cip-labeller.md",
          "note": "Computes R/S/r/s and E/Z with its own CIP labeller.",
          "engine": {
            "library": "In-house (TypeScript CIP and axial stereochemistry labellers)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts#L471"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/README.md#what-it-does",
          "note": "Caffeine: C8H10N4O2, 194.19 g/mol; exact mass 194.0804.",
          "shot": {
            "image": "evidence/octet-draw/f-formula-mass.webp",
            "caption": "Caffeine formula, exact mass and molecular weight in Properties."
          },
          "engine": {
            "library": "Indigo (WebAssembly), with In-house (TypeScript fragment and polymer aggregation)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts#L695"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts",
          "note": "Caffeine properties panel showed logP 0.06 and tPSA 61.82.",
          "shot": {
            "image": "evidence/octet-draw/f-properties.webp",
            "caption": "Caffeine properties include logP and tPSA estimates."
          },
          "engine": {
            "library": "Indigo (WebAssembly, Wildman–Crippen logP and molar refractivity); In-house (TypeScript Ertl TPSA, Joback, ESOL and pKa calculators; thermo and Dimorphite-DL table values, PatWalters/solubility ESOL coefficients)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts#L695-L723"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0015-name-to-structure-reads-more.md",
          "note": "Converted caffeine to a 14-atom structure.",
          "engine": {
            "library": "OPSIN 2.8.0 (JavaScript compiled from Java with TeaVM); In-house (TypeScript dictionaries and name parsers); Indigo (WebAssembly layout); PubChem PUG REST (remote server fallback)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx#L1753"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/namer.ts",
          "note": "Generated caffeine systematic name as canvas text.",
          "shot": {
            "image": "evidence/octet-draw/f-structure-to-name.webp",
            "caption": "Caffeine structure and systematic name on the canvas."
          },
          "engine": {
            "library": "In-house (TypeScript IUPAC namer); OPSIN (JavaScript compiled from Java with TeaVM, round-trip validation); Indigo (WebAssembly InChI comparison)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx#L4538"
          }
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/README.md#what-it-does",
          "note": "Predicts proton and carbon-13 shifts.",
          "engine": {
            "library": "In-house (TypeScript HOSE-code predictor with bundled nmrshiftdb2 shift data)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/nmr.ts#L1"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/query.ts",
          "note": "Supports R-group definitions, atom lists and query properties."
        },
        "polymers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts",
          "note": "Semantic repeat units contribute to molecular formulae and masses."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0015-name-to-structure-reads-more.md",
          "note": "Reads three-letter peptide sequences with D/L residues and terminal caps."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0015-name-to-structure-reads-more.md#pubchem-online",
          "note": "Fetches PubChem structures when offline name conversion fails.",
          "engine": {
            "library": "PubChem PUG REST (remote server, accessed with Rust reqwest)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src-tauri/src/pubchem.rs#L1"
          }
        },
        "model-3d": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx",
          "note": "Builds and rotates; cholesterol export inverts three stereocenters.",
          "shot": {
            "image": "evidence/octet-draw/f-model-3d.webp",
            "caption": "Depth-shaded cholesterol drawing with overlapping atom labels."
          },
          "engine": {
            "library": "In-house (TypeScript 3D geometry and rotatable SVG perspective drawing)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/Editor.tsx#L1973"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0009-cdx-files.md",
          "note": "Exported and re-imported structures, reaction arrow and mechanism arrows.",
          "engine": {
            "library": "In-house (TypeScript CDXML reader and writer)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/cdxml.ts#L1"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0009-cdx-files.md",
          "note": "Native CDX reader and writer preserve drawing objects.",
          "engine": {
            "library": "In-house (TypeScript CDX binary reader and writer sharing the CDXML object tree)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/cdx.ts#L1"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/README.md#what-it-does",
          "note": "Imported MOL and SDF; exported both formats.",
          "shot": {
            "image": "evidence/octet-draw/f-mol-sdf.webp",
            "caption": "Export dialog with MOL selected as the format."
          },
          "engine": {
            "library": "Indigo (WebAssembly); In-house (TypeScript V3000 query/Markush reader and writer, SDF record handling)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts#L350"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/README.md#what-it-does",
          "note": "Pasted all three fixtures; exported caffeine SMILES.",
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts#L340"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/README.md#what-it-does",
          "note": "Imports and exports InChI.",
          "engine": {
            "library": "InChI 1.06 (compiled into Indigo WebAssembly, accessed through indigo-ketcher)",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts#L494-L506"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/chem.ts",
          "note": "Reads and writes V2000 and V3000 RXN reactions."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/export.ts",
          "note": "Exported all three fixtures; SVG files parse successfully."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src-tauri/src/export.rs",
          "note": "Exported caffeine using default PDF settings."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src/SettingsWindow.tsx",
          "note": "Exported at default 600 dpi with transparent background.",
          "shot": {
            "image": "evidence/octet-draw/f-png-export.webp",
            "caption": "PNG export dialog showing 600 dpi and transparent background."
          }
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src-tauri/src/clipboard.rs",
          "note": "Reads and writes ChemDraw CDX and CDXML clipboard formats."
        },
        "office": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src-tauri/src/clipboard.rs",
          "note": "Round-trip editing via macOS PDF and Windows EMF clipboard metadata."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/main/README.md",
          "note": "Standalone desktop editor; no supported embedding integration found."
        },
        "ai-assistant": {
          "status": "no",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/SamChemMan/Octet-Draw/main/docs/decisions/0006-nmr-properties-and-chemdraw-26.md",
          "note": "AI features explicitly remain outside current scope."
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/src-tauri/src/clipboard.rs#L9-L13",
          "note": "Windows Office receives EMF pictures with CDXML metadata, not OLE objects."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SamChemMan/Octet-Draw/blob/f11487e97ee3970c1dc5678a5adbcd610144c04e/src/Actions.tsx#L1038-L1047",
          "note": "Persistent colored atom/bond halos and ring fills, with custom colors."
        }
      },
      "caveats": [
        "Office round-trip editing depends on preserving embedded PDF or EMF chemistry metadata.",
        "SMILES layout is capped at 1,000 atoms; 3D cleanup at 500.",
        "Older notes predate implemented NMR, properties, queries, peptides, dictionaries, Windows EMF and PubChem fetching."
      ],
      "github": {
        "url": "https://github.com/SamChemMan/Octet-Draw",
        "stars": 78,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-10-14",
        "commits": 781,
        "contributors": 2,
        "pushedAt": "2026-11-04T14:13:50Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "1.1.0",
        "canvas": "evidence/octet-draw/canvas.webp",
        "canvasLight": "evidence/octet-draw/canvas-light.webp",
        "canvasDark": "evidence/octet-draw/canvas-dark.webp",
        "memory": {
          "idleMb": 524.83,
          "paclitaxelMb": 572.82,
          "baselineMb": null,
          "rssIdleMb": 858.72,
          "rssPaclitaxelMb": 932.27,
          "runs": 3,
          "processes": 9,
          "method": "Three fresh launches; summed phys_footprint via footprint; ps descendants plus lsappinfo coalition helpers.",
          "note": "2400×1600 pixels; SMILES paste; 10-second settling; 8–9 processes; medians in MiB."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Settings > Document > Page > Background: White or Dark."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "Octet.Draw_1.1.0_universal.dmg",
        "ran": true,
        "failure": null,
        "downloadBytes": 32510320,
        "installedBytes": 43970560,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/octet-draw/simple.svg",
            "note": "Current Kekule SMILES automatic layout retained; MOL matches fixture.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/octet-draw/complex.svg",
            "note": "Current Kekule SMILES automatic layout retained; central oxygen labels overlap.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/octet-draw/threed.png",
            "note": "Default depth-shaded 3D model; fresh MOL preserves all eight stereocenters.",
            "structure": "match"
          }
        ],
        "observations": [
          "Defaults: ACS Document 1996, Arial 10 pt, black on white.",
          "Caffeine aromatic rings display only single-line ring bonds.",
          "Paclitaxel automatic layout has overlapping central oxygen labels.",
          "Caffeine and paclitaxel MOL exports match fixture connectivity and stereochemistry.",
          "Cholesterol 3D labels overlap; exported coordinates invert three stereocenters.",
          "Redraw: current Kekule SMILES displays caffeine and paclitaxel alternating ring double bonds.",
          "Redraw: fresh cholesterol 3D export preserves all eight stereocenters; supersedes earlier inversion observation."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 373,
        "idleMb": 135,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 32510320,
      "references": [
        "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/README.md",
        "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0009-cdx-files.md",
        "https://github.com/SamChemMan/Octet-Draw/blob/d5ebf898de3a82bf7549680a171fc4909daae69f/docs/decisions/0011-clipboard-on-windows-and-linux.md"
      ]
    },
    {
      "id": "p42",
      "slug": "chemdraft",
      "name": "ChemDraft",
      "rank": 6,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit",
          "OpenChemLib",
          "IsoSpec",
          "OPSIN",
          "InChI",
          "Avogadro",
          "Indigo"
        ],
        "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/MainWindow.tsx",
        "note": "Own native SVG canvas. Includes an optional Ketcher sub-editor for one molecule; its click-to-open paths are off in this build."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "ChemDraft layout-engine SVG renderer",
        "language": "TypeScript",
        "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/packages/layout-engine/src/index.ts#L1701"
      },
      "enginesChecked": true,
      "languageNote": "Python handles optional adapters; other exclusions cover presentation, tooling and generated code.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "No documented embedding; editor-shell is an unpublished internal workspace package."
      },
      "otherLanguages": [
        {
          "language": "Rust",
          "role": "Tauri shell and native engine bridges"
        },
        {
          "language": "JavaScript",
          "role": "Frontend bundle and chemistry engines"
        },
        {
          "language": "C++",
          "role": "WASM chemistry and native 3D sidecar"
        },
        {
          "language": "Java",
          "role": "Bundled OPSIN and naming dependencies"
        },
        {
          "language": "Python",
          "role": "Optional naming and image recognition sidecars"
        },
        {
          "language": "C",
          "role": "InChI identifier library"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-2.1-or-later (jna-inchi), GPL-2.0 with Classpath exception (JRE), MPL-2.0 (Eigen/color picker) and OFL-1.1 fonts; pKa-data and RDKit-InChI terms partly unresolved.",
        "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/dependency-inventory.md",
        "notice": "https://github.com/jgassens/ChemDraft/blob/main/NOTICE",
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          },
          {
            "name": "IsoSpec",
            "license": "BSD-2-Clause",
            "source": "https://github.com/MatteoLacki/IsoSpec/blob/main/LICENCE"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          },
          {
            "name": "Avogadro",
            "license": "BSD-3-Clause",
            "source": "https://github.com/OpenChemistry/avogadroapp/blob/master/LICENSE"
          },
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its desktop page editor combines editable structures, reaction schemes, text and tables with vector SVG and PDF export.",
      "summary": "Desktop editor for chemical structures, reaction schemes, mechanisms, and publication figures.",
      "website": "https://chemdraft.ai/",
      "repo": "https://github.com/jgassens/ChemDraft",
      "docs": "https://github.com/jgassens/ChemDraft#readme",
      "vendor": "Jeremiah J. Gassensmith",
      "license": {
        "kind": "open-source",
        "spdx": "Apache-2.0",
        "text": "Apache License 2.0 for the core application.",
        "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/jgassens/ChemDraft#readme"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v1.1.0",
        "date": "2026-11-02",
        "source": "https://github.com/jgassens/ChemDraft/releases/tag/v1.1.0"
      },
      "engine": {
        "rendering": "Custom SVG page renderer; resvg raster export; svg2pdf.js and jsPDF vector PDF export",
        "chemistry": "RDKit WASM, OpenChemLib and OPSIN; IsoSpec for isotope envelopes",
        "ui": "React 19 in a Tauri 2 desktop shell",
        "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/dependency-inventory.md"
      },
      "languages": [
        "TypeScript",
        "Rust",
        "C++"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/manual-stress-checklist.md#L1035",
          "note": "Drew single bond; clicking cycled double and triple orders."
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/chem-core/src/schemas.ts#L390",
          "note": "Imported wedge/hash visible; hand-drawing blocked by missing palette."
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/shipped/README.md#L507",
          "note": "Dashed single bonds represent dative and hydrogen interactions."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/commands.ts#L931",
          "note": null
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/toolbar-command-map.md#L28",
          "note": "Rings palette reported open but never appeared; R produced no ring."
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/toolbar-command-map.md#L32",
          "note": "Two chair cyclohexane templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/toolbar-command-map.md#L27",
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/template-library/README.md#L46",
          "note": "Inserted 18-crown-6 from built-in template picker."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/template-library/README.md#L7",
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/manual-stress-checklist.md#L1042",
          "note": "Charges, element labels, D/T and imported isotope labels."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/shipped/README.md#L654",
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/shipped/chemdraw-keybinding-scheme.md#L41",
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/documentWorkflow.ts#L13262",
          "note": null
        },
        "perspective": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/documentWorkflow.ts#L3002",
          "note": "Interactive 3D workspace projected cholesterol onto the drawing.",
          "shot": {
            "image": "evidence/chemdraft/f-perspective.webp",
            "caption": "Cholesterol drawing shown in the rotation workspace."
          }
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/toolbar-command-map.md#L34",
          "note": "Arrows Toolbar reported open; no drawing controls appeared."
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/shipped/README.md#L665",
          "note": "Annotation Toolbar reported open; no drawing controls appeared."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/toolbar-command-map.md#L49",
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/manual-stress-checklist.md#L1105",
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/drawingTools.ts#L682",
          "note": null
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/toolbar-command-map.md#L57",
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/documentWorkflow.ts#L13644",
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/shipped/README.md#L637",
          "note": null,
          "engine": {
            "library": "In-house (TypeScript polygon/tree cleanup) + OpenChemLib (JavaScript re-layout) + RDKit MinimalLib (WebAssembly fallback)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/apps/desktop/src/MainWindow.tsx#L4790"
          }
        },
        "journal-styles": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/ROADMAP.md#L28",
          "note": "A journal-style preset is planned for v1.2."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/moleculeInspectorTemplates.ts#L34",
          "note": "Drawing settings export and import as reusable style templates."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/documentWorkflow.ts#L7090",
          "note": null
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/MainWindow.tsx#L3138",
          "note": "Page sizing exists; desktop editor displays only the first page."
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/chem-core/README.md#L7",
          "note": null
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/tables.md#L1",
          "note": "Editable tables."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/shipped/README.md#L535",
          "note": null,
          "engine": {
            "library": "In-house (TypeScript native valence rules) + RDKit MinimalLib (WebAssembly structure validation)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/packages/document-workflow-core/src/atoms.ts#L289"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/site/index.html#L162",
          "note": "Computed R/S and E/Z descriptors.",
          "engine": {
            "library": "RDKit MinimalLib (WebAssembly R/S and E/Z analysis) + OpenChemLib (JavaScript editor stereo perception)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/packages/rdkit-adapter/src/analysis.ts#L970"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/site/index.html#L163",
          "note": "Caffeine: C8H10N4O2; average mass 194.194 g/mol.",
          "shot": {
            "image": "evidence/chemdraft/f-formula-mass.webp",
            "caption": "Molecular Inspector displays caffeine formula and molecular masses."
          },
          "engine": {
            "library": "In-house (TypeScript live formula and mass) + RDKit MinimalLib (WebAssembly analysis)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/packages/document-workflow-core/src/atoms.ts#L955"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/site/index.html#L163",
          "note": "Includes logP and TPSA.",
          "engine": {
            "library": "RDKit MinimalLib (vendored WebAssembly; Crippen logP and TPSA)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/packages/rdkit-adapter/src/methods.ts#L203"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src-tauri/src/opsin.rs#L1",
          "note": "Ethanol converted after installing official OPSIN plugin v0.3.0.",
          "engine": {
            "library": "OPSIN 2.9.0 (bundled Java CLI JAR and JRE, invoked through Rust; optional OPSIN plugin)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/apps/desktop/src-tauri/src/opsin.rs"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/naming-engine.md#L1",
          "note": "Ethanol named after installing official Orthonym plugin v0.1.0.",
          "shot": {
            "image": "evidence/chemdraft/f-structure-to-name.webp",
            "caption": "Ethanol structure and generated name appear on the canvas."
          },
          "engine": {
            "library": "Orthonym 1.0.8 (optional local Python sidecar; RDKit Python and OPSIN/centres Java JARs via JPype)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/apps/desktop/src-tauri/resources/naming/orthonym_sidecar.py#L139"
          }
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/skills/chemdraft/references/nmr.md#L1",
          "note": "Separate NMR predictor plugin; 1H predictions are experimental.",
          "engine": {
            "library": "In-house (TypeScript HOSE predictor, optional JavaScript Web Worker plugin) + OpenChemLib (JavaScript) + NMRShiftDB2-derived local database",
            "source": "https://github.com/jgassens/ChemDraft-NMR-Plugin/blob/46db9cc8493f7bd7848e3d9a2cb55e5fbf407260/src/providers/ocl/OclHosePredictor.ts#L51"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/template-library/README.md#L40",
          "note": "R-group and generic placeholders; no formula contribution."
        },
        "polymers": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/ROADMAP.md#L24",
          "note": "Polymer repeat units are planned; current brackets are graphical."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/ocsr-engine.md#L1",
          "note": "Requires the optional MolScribe plugin and downloaded local engine.",
          "engine": {
            "library": "MolScribe (optional local Python/PyTorch CPU sidecar, accessed through the MolScribe plugin)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/apps/desktop/src-tauri/resources/ocsr/molscribe_sidecar.py#L734"
          }
        },
        "database-lookup": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/skills/chemdraft/scripts/ring-style.mjs#L1733",
          "note": "Agent helper fetches PubChem structures; desktop search is planned.",
          "engine": {
            "library": "PubChem PUG REST (remote HTTP API; Node.js agent helper only)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/skills/chemdraft/scripts/ring-style.mjs#L1733"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/site/index.html#L249",
          "note": "Cholesterol SMILES built 3D wireframe; interaction triggered UFF settling.",
          "shot": {
            "image": "evidence/chemdraft/f-model-3d.webp",
            "caption": "Cholesterol structure in the interactive 3D workspace."
          },
          "engine": {
            "library": "In-house (SVG 3D projection) + RDKit MinimalLib (WebAssembly embedding) + OpenChemLib (JavaScript fallback); Avogadro Core/Calc (native C++ UFF sidecar for atom tug)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/apps/desktop/src/MainWindow.tsx#L6051"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/architecture/save-open-and-file-format.md#L96",
          "note": "File export/reopen worked; clipboard paste explicitly unimplemented.",
          "shot": {
            "image": "evidence/chemdraft/f-cdxml.webp",
            "caption": "Caffeine structure opened from a CDXML file."
          },
          "engine": {
            "library": "In-house (TypeScript CDXML reader/writer) + fast-xml-parser (JavaScript XML parser)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/packages/cdx-compat/src/index.ts#L1"
          }
        },
        "cdx": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/cdx-compat/src/index.ts#L233",
          "note": "Binary CDX is explicitly rejected; use CDXML."
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/chemdraft-cli/README.md#L389",
          "note": "MOL paste and SDF export worked; Open rejected MOL file.",
          "engine": {
            "library": "In-house (TypeScript V2000/V3000 MOL parser/writer and SDF exporter)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/apps/desktop/src/structureListExport.ts#L68"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/shipped/README.md#L614",
          "note": "All three pasted and exported; isomeric SMILES matched fixtures.",
          "shot": {
            "image": "evidence/chemdraft/f-smiles.webp",
            "caption": "Molecular Inspector displays caffeine canonical SMILES."
          },
          "engine": {
            "library": "RDKit MinimalLib (WebAssembly parsing and canonical export) + OpenChemLib (JavaScript import fallback) + In-house (TypeScript graph writer fallback)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/packages/document-workflow-core/src/moleculeSmiles.ts#L61"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/commands.ts#L182",
          "note": "Molecular Inspector computed caffeine InChI and InChIKey.",
          "shot": {
            "image": "evidence/chemdraft/f-inchi.webp",
            "caption": "Molecular Inspector displays caffeine InChI and InChIKey."
          },
          "engine": {
            "library": "InChI (compiled into RDKit MinimalLib WebAssembly; identifier export)",
            "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/packages/rdkit-adapter/src/identifiers.ts#L82"
          }
        },
        "rxn": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/documentWorkflow.ts#L5357",
          "note": "RXN paste extracts molecules; reaction roles, arrows and layout are omitted."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/export-engine/src/formats.ts#L52",
          "note": "Default SVG exports saved for caffeine and cholesterol."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/export-engine/README.md#L26",
          "note": "Default vector PDF exported successfully."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/chemdraft-cli/README.md#L28",
          "note": "Default 1x PNG exported at 96 dpi; print resolution untested."
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/documentWorkflow.ts#L20008",
          "note": "MOL text bridge exists; native CDXML/CDX clipboard paste is unimplemented."
        },
        "office": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/8c27d4819df011c2e313b877f7f5796e045cfc1e/ROADMAP.md#L48",
          "note": "Editing structures inside Word and PowerPoint is planned for v2.0."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/plugin-architecture/AUTHORING.md#L1",
          "note": "TypeScript plugin SDK exposes document and chemistry operations."
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/chemdraft-cli/README.md#L1",
          "note": "Requires a source checkout."
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/packages/chemdraft-mcp/README.md#L1",
          "note": "Local stdio MCP server; requires a source checkout."
        },
        "plugins": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/plugin-architecture/AUTHORING.md#L1",
          "note": "Installed and ran official OPSIN and Orthonym plugins."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/jgassens/ChemDraft/blob/main/packages/editor-shell/package.json",
          "note": "No documented embedding; editor-shell is an unpublished internal workspace package."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/docs/plugin-architecture/AUTHORING.md#L7",
          "note": "Optional Assistant plugin; free, separately licensed proprietary code."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jgassens/ChemDraft/blob/c8de616521401c60404af2eed6e7659266c53425/apps/desktop/src/ToolPalette.tsx#L1706",
          "note": "Selected atom labels support custom colored background halos in exports."
        }
      },
      "caveats": [
        "v1.1.0 can lose later text edits after saving during text editing; click outside the box before continuing.",
        "CDX is unsupported; CDXML exchanges a supported subset and omits pictures.",
        "NMR, image recognition, structure naming and the assistant require separate plugins or engines."
      ],
      "github": {
        "url": "https://github.com/jgassens/ChemDraft",
        "stars": 64,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-05-29",
        "commits": 1020,
        "contributors": 6,
        "pushedAt": "2026-11-03T15:17:56Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "1.1.0",
        "canvas": "evidence/chemdraft/canvas.webp",
        "canvasLight": "evidence/chemdraft/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 1341.77,
          "paclitaxelMb": 1571.83,
          "baselineMb": null,
          "rssIdleMb": 2307.73,
          "rssPaclitaxelMb": 2153.84,
          "runs": 3,
          "processes": 21,
          "method": "Three fresh runs; median phys_footprint sums; ps trees plus lsappinfo coalition helpers; MiB.",
          "note": "Published SMILES paste; 10-second settling; one document; WebKit helpers included."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Light interface and white canvas persisted under both per-process appearance overrides."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "ChemDraft_1.1.0_aarch64.dmg",
        "ran": true,
        "failure": null,
        "downloadBytes": 80257570,
        "installedBytes": 122478592,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemdraft/simple.svg",
            "note": "Current Kekule SMILES; automatic layout and default SVG export retained.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemdraft/complex.svg",
            "note": "Current Kekule SMILES; automatic layout retained; exported chemistry matches all 11 stereocenters.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemdraft/threed.png",
            "note": "SMILES-built 3D wireframe rotated in depth; cropped viewport retains default ghost overlay.",
            "structure": "match"
          }
        ],
        "observations": [
          "SMILES paste automatically generated 2D layouts; no cleanup was applied.",
          "Default window displayed rulers, grid and crosshairs over structures.",
          "SVG and PNG exports covered an entire US Letter page.",
          "Exported SMILES retained all 11 paclitaxel and 8 cholesterol stereocenters.",
          "Default PNG was 816 by 1056 pixels at 1x scale.",
          "Workspace footer exposes Build 11.02.09.30-codex · 2026-11-02 09:59:39 c8de6165.",
          "Interactive 3D empty-space dragging rotates the model; atom dragging tugs atoms and triggers UFF settling."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 386,
        "idleMb": 598,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 80257570,
      "references": [
        "https://github.com/jgassens/ChemDraft/blob/644cadcde0c35e9b1f5e95e6c806cf63bfbd4194/ChemDraft_1.0.0_aarch64.md",
        "https://github.com/jgassens/ChemDraft/blob/644cadcde0c35e9b1f5e95e6c806cf63bfbd4194/packages/cdx-compat/src/index.ts#L213",
        "https://github.com/jgassens/ChemDraft/blob/644cadcde0c35e9b1f5e95e6c806cf63bfbd4194/packages/chemdraft-mcp/README.md"
      ]
    },
    {
      "id": "p44",
      "slug": "sketchiq",
      "name": "SketchIQ",
      "rank": 7,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "RDKit",
          "Indigo",
          "OPSIN",
          "Orthonym"
        ],
        "source": "https://proteiniq.io/app/molecule-drawer",
        "note": "Vendor confirms Ketcher canvas; identifier guide additionally confirms Indigo."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "SketchIQ (no account)",
          "level": "free",
          "price": "Free for noncommercial use (2026-11-06)"
        },
        {
          "name": "Free",
          "level": "account",
          "price": "Free; 200 sign-up credits, monthly refill to 100 (2026-11-06)"
        },
        {
          "name": "Plus",
          "level": "paid",
          "price": "US$23/user/month billed annually; academic use (2026-11-06)"
        },
        {
          "name": "Pro",
          "level": "paid",
          "price": "US$79/user/month billed annually; commercial use (2026-11-06)"
        },
        {
          "name": "Enterprise",
          "level": "paid",
          "price": "Custom quote; commercial use (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher/Raphael canvas; Indigo export renderer",
        "language": "TypeScript",
        "source": "https://proteiniq.io/_next/static/immutable/chunks/06hojo2rvu69i.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "X-Frame-Options DENY and CSP frame-ancestors 'none'; no editor SDK documented."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Browser host and Raphael graphics"
        },
        {
          "language": "C++",
          "role": "WebAssembly chemistry and Indigo export rendering"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          },
          {
            "name": "Orthonym",
            "license": "MIT",
            "source": "https://github.com/Steinbeck-Lab/Orthonym/blob/main/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "The standalone editor produces reaction schemes and mechanisms with ACS styling and vector exports for publication figures.",
      "summary": "Browser editor for chemical structures, reaction schemes, mechanisms, and publication figures.",
      "website": "https://proteiniq.io/app/molecule-drawer",
      "repo": null,
      "docs": "https://proteiniq.io/app/molecule-drawer#how-to-draw-a-molecule-and-get-its-smiles",
      "vendor": "ProteinIQ (Matic Broz s.p.)",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary hosted service; free drawing, credit-paid NMR; commercial use requires Pro or Enterprise.",
        "source": "https://proteiniq.io/legal/terms"
      },
      "price": {
        "text": "Free drawing and exports; NMR prediction: 10 credits/structure (2026-11-05).",
        "source": "https://proteiniq.io/app/molecule-drawer#predicted-nmr-shifts"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://proteiniq.io/app/molecule-drawer"
      },
      "engine": {
        "rendering": null,
        "chemistry": "RDKit; Indigo; OPSIN; Orthonym",
        "ui": "Ketcher web editor",
        "source": "https://proteiniq.io/app/molecule-drawer"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/guides/draw-chemical-structures-online#bonds-chains-and-charges",
          "note": "Drew single, double and triple bonds.",
          "shot": {
            "image": "evidence/sketchiq/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds drawn on the canvas."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/guides/stereochemistry-wedges-dashes#what-wedges-hashes-and-wavy-bonds-mean",
          "note": "Drew solid, hashed and wavy bonds.",
          "shot": {
            "image": "evidence/sketchiq/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Dative and hydrogen bond tools in palette."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/guides/draw-chemical-structures-online#templates-and-the-structure-library",
          "note": "Drew benzene; multiple ring sizes shown.",
          "shot": {
            "image": "evidence/sketchiq/f-rings.webp",
            "caption": "Benzene drawing with ring tools below the canvas."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/guides/draw-chemical-structures-online#bonds-chains-and-charges",
          "note": null,
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#structure-library",
          "note": "Library opens; attempted naphthalene placement did not succeed.",
          "shot": {
            "image": "evidence/sketchiq/f-templates.webp",
            "caption": "Template library displaying rings and fused-ring scaffolds."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#typing-atom-labels-and-formulas",
          "note": null,
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/guides/molecular-weight-exact-mass",
          "note": "Isotopes can be drawn or entered through SMILES.",
          "shot": {
            "image": "evidence/sketchiq/f-atom-labels.webp",
            "caption": "Element palette and charge buttons beside a caffeine drawing."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#drawing-mechanisms-and-projections",
          "note": null,
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/guides/draw-chemical-structures-online#keyboard-shortcuts-for-drawing-faster",
          "note": null,
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Rectangle selection and hand tools visible."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#drawing-reactions-and-schemes",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/sketchiq/f-reaction-arrows.webp",
            "caption": "An equilibrium arrow on the drawing canvas."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#drawing-mechanisms-and-projections",
          "note": "Curved and fishhook tools shown; attempted drag produced no clear arrow.",
          "shot": {
            "image": "evidence/sketchiq/f-mechanism-arrows.webp",
            "caption": "Arrow palette includes curved arrow icons."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#drawing-reactions-and-schemes",
          "note": null,
          "shot": {
            "image": "evidence/sketchiq/f-reaction-data.webp",
            "caption": "Reaction panel displays an empty reaction SMILES field."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Reaction mapping tool visible."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Add text tool visible; formatting not checked."
        },
        "shapes": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Shape ellipse tool visible."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/guides/draw-chemical-structures-online#editing-what-youve-drawn",
          "note": null,
          "engine": {
            "library": "Indigo 1.40.0 (WebAssembly, through Ketcher standalone)",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/0k74rwlu56yiu.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#typing-atom-labels-and-formulas",
          "note": "ChemDraw ACS 1996 preset.",
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/guides/publication-quality-chemical-structures#how-to-make-acs-style-structure-images-in-sketchiq",
          "note": "Bond and font settings persist in the browser.",
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Add Image button visible."
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#stoichiometry-table",
          "note": "Editable stoichiometry panel; copies as text.",
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#what-the-details-panel-shows",
          "note": null,
          "engine": {
            "library": "Indigo (WebAssembly, valence and radical checks)",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/333cktyh0dvz-.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/guides/stereochemistry-wedges-dashes#how-to-draw-a-stereocenter-in-sketchiq",
          "note": "Paclitaxel panel displays stereocenter descriptors.",
          "shot": {
            "image": "evidence/sketchiq/f-stereo-perception.webp",
            "caption": "Cholesterol panel lists eight stereocentres and their descriptors."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly)",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/1_ntzx6hx6o-0.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#what-the-details-panel-shows",
          "note": "Caffeine formula C8H10N4O2 and mass 194.19 displayed.",
          "shot": {
            "image": "evidence/sketchiq/f-formula-mass.webp",
            "caption": "Caffeine structure with molecular formula and molecular weight."
          },
          "engine": {
            "library": "Indigo (WebAssembly); RDKit.js (WebAssembly, fragment masses) with In-house formula assembly",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/333cktyh0dvz-.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#what-the-details-panel-shows",
          "note": "Caffeine cLogP and TPSA displayed.",
          "shot": {
            "image": "evidence/sketchiq/f-properties.webp",
            "caption": "Caffeine structure with cLogP and TPSA values."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly, Crippen logP and TPSA); PubChem web service for XLogP3",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/1_ntzx6hx6o-0.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#names-pubchem-does-not-have",
          "note": "Searching aspirin produced its structure.",
          "engine": {
            "library": "OPSIN (remote server); PubChem PUG REST web service",
            "source": "https://proteiniq.io/app/molecule-drawer#names-pubchem-does-not-have"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#systematic-names-from-orthonym",
          "note": "Caffeine drawing displayed a systematic name.",
          "shot": {
            "image": "evidence/sketchiq/f-structure-to-name.webp",
            "caption": "Caffeine structure and its systematic name."
          },
          "engine": {
            "library": "Orthonym (remote server), validated with OPSIN; PubChem web service for known compounds",
            "source": "https://proteiniq.io/app/molecule-drawer#systematic-names-from-orthonym"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#predicted-nmr-shifts",
          "note": "1H/13C predictions require sign-in and 10 credits per structure.",
          "shot": {
            "image": "evidence/sketchiq/f-nmr-prediction.webp",
            "caption": "Caffeine panel offers NMR prediction for 10 credits."
          },
          "engine": {
            "library": "MagNET with AIMNet2 geometry optimisation (remote server)",
            "source": "https://proteiniq.io/app/molecule-drawer#predicted-nmr-shifts"
          },
          "plan": "Free",
          "planLevel": "account"
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/guides/chemsketch-alternatives#sketchiq-for-former-chemsketch-users",
          "note": "R-groups are available from the toolbars.",
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "polymers": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "S-Group tool visible."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#what-the-drawer-does-not-do",
          "note": "Does not read structures from images."
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#finding-a-molecule-by-name-cas-number-or-smiles",
          "note": "Aspirin search returned PubChem entry and structure.",
          "engine": {
            "library": "PubChem PUG REST and autocomplete web services",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/333cktyh0dvz-.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "model-3d": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Viewer rotates; SMILES and 3D SDF yielded flat cholesterol."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#can-i-open-chemdraw-files",
          "note": "Exported and reimported caffeine CDXML.",
          "shot": {
            "image": "evidence/sketchiq/f-cdxml.webp",
            "caption": "Export menu includes a ChemDraw CDXML download."
          },
          "engine": {
            "library": "Indigo (WebAssembly, through Ketcher); In-house mechanism-arrow preservation",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/1_ntzx6hx6o-0.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#formats-that-cannot-hold-a-scheme-or-and-and-or-stereo",
          "note": "Export excludes multi-step schemes and convergent arrows.",
          "shot": {
            "image": "evidence/sketchiq/f-cdx.webp",
            "caption": "Export menu includes a ChemDraw CDX download."
          },
          "engine": {
            "library": "Indigo (WebAssembly, through Ketcher); In-house mechanism-arrow preservation",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/1_ntzx6hx6o-0.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#copying-and-exporting",
          "note": "MOL and SDF imports, MOL export worked; SDF flattened.",
          "shot": {
            "image": "evidence/sketchiq/f-mol-sdf.webp",
            "caption": "Export menu lists MOL and SDF download formats."
          },
          "engine": {
            "library": "Ketcher (TypeScript/JavaScript MOL V2000 parser/writer); Indigo (WebAssembly, V3000/SDF conversion)",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/06hojo2rvu69i.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#copying-and-exporting",
          "note": "Imported SMILES and downloaded SMILES.",
          "shot": {
            "image": "evidence/sketchiq/f-smiles.webp",
            "caption": "Export menu lists SMILES copy and download options."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly, canonicalisation); Indigo (WebAssembly, through Ketcher import/export)",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/1_ntzx6hx6o-0.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#copying-and-exporting",
          "note": null,
          "shot": {
            "image": "evidence/sketchiq/f-inchi.webp",
            "caption": "Export menu lists InChI copy and download options."
          },
          "engine": {
            "library": "Indigo/InChI (WebAssembly, through Ketcher standalone)",
            "source": "https://proteiniq.io/_next/static/immutable/chunks/2x2xk_4jutjni.js"
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer#copying-and-exporting",
          "note": null,
          "shot": {
            "image": "evidence/sketchiq/f-rxn.webp",
            "caption": "Reaction panel lists RXN among the export formats."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#copying-and-exporting",
          "note": "Downloaded SVG drawings.",
          "shot": {
            "image": "evidence/sketchiq/f-svg-export.webp",
            "caption": "Export menu includes an SVG image download."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://proteiniq.io/app/molecule-drawer#copying-and-exporting",
          "note": "Downloaded PDF; no embedded raster images detected.",
          "shot": {
            "image": "evidence/sketchiq/f-pdf-export.webp",
            "caption": "Export menu includes a PDF image download."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://proteiniq.io/guides/publication-quality-chemical-structures#what-the-exported-files-contain",
          "note": "PNG downloaded at 880×640; metadata says 72 dpi.",
          "shot": {
            "image": "evidence/sketchiq/f-png-export.webp",
            "caption": "PNG export menu shows image size choices up to 4×."
          },
          "plan": "SketchIQ (no account)",
          "planLevel": "free"
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "no",
          "evidence": "docs",
          "source": "https://proteiniq.io/guides/chemsketch-alternatives#sketchiq-for-former-chemsketch-users",
          "note": "Pastes an image without editable chemical objects."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://proteiniq.io/app/molecule-drawer",
          "note": "X-Frame-Options DENY and CSP frame-ancestors 'none'; no editor SDK documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "NMR prediction requires an account and costs 10 credits per structure.",
        "Commercial use requires Pro or Enterprise under ProteinIQ's general terms.",
        "ChemDraw round-trips can lose document styles, annotations and object groups."
      ],
      "github": null,
      "hands": {
        "testedVersion": "dpl_44ysNf1Cbx9iepy8z4SrXP7…",
        "canvas": "evidence/sketchiq/canvas.webp",
        "canvasLight": "evidence/sketchiq/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 384,
          "paclitaxelMb": 362,
          "baselineMb": 50.28,
          "rssIdleMb": 686.64,
          "rssPaclitaxelMb": 708.02,
          "runs": 3,
          "processes": 4,
          "method": "Headless Playwright Chromium; summed process-tree physical footprints; medians of three runs.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Dark browser preference did not change the appearance."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://proteiniq.io/app/molecule-drawer",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/sketchiq/simple.svg",
            "note": "Current SMILES rendered caffeine; exported MOL matches fixture InChIKey.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/sketchiq/complex.svg",
            "note": "Current SMILES rendered paclitaxel; exported MOL matches fixture InChIKey.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": "match"
          }
        ],
        "observations": [
          "Caffeine aromatic rings appear as circles in the default SMILES layout.",
          "Paclitaxel's automatically generated layout has overlapping methyl labels.",
          "Cholesterol SMILES opened as a flat structure in the 3D viewer.",
          "The 3D SDF import became 2D and showed an AND racemic stereo group.",
          "The default PNG export reports 72 dpi; a 4× print option is offered."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 916,
        "transferBytes": 3095213
      },
      "downloadBytes": null,
      "references": [
        "https://proteiniq.io/docs/viewers",
        "https://proteiniq.io/app/molecule-drawer"
      ]
    },
    {
      "id": "p124",
      "slug": "covalent",
      "name": "Covalent",
      "rank": 8,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Public vendor documentation does not establish canvas provenance or third-party chemistry libraries."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Covalent SVG molecular renderer",
        "language": "JavaScript",
        "source": "https://chempirical.com/_/20y4li0mgj/chem/depict.js"
      },
      "enginesChecked": true,
      "languageNote": "HTML and CSS provide layout and styling.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "CSP frame-ancestors 'self' and X-Frame-Options SAMEORIGIN block external framing."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Includes Inter fonts under SIL OFL-1.1 with font share-alike terms; documents are exempt.",
        "source": "https://github.com/rsms/inter/blob/66647c0bb/LICENSE.txt",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Multipage layouts, ACS styling, formatted text and vector exports support finished 2D chemical drawing documents.",
      "summary": "A free browser editor for chemical structures, reaction schemes, and multipage drawing documents.",
      "website": "https://chempirical.com/covalent/",
      "repo": null,
      "docs": "https://chempirical.com/chemdraw-alternative/",
      "vendor": "Nitramine (Chempirical)",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free browser service; no open-source license identified.",
        "source": "https://chempirical.com/for-students/"
      },
      "price": {
        "text": "Free",
        "source": "https://chempirical.com/for-students/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": true,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://chempirical.com/covalent/"
      },
      "engine": {
        "rendering": "Custom SVG for 2D and SVG export; Canvas 2D for PNG and 3D; custom vector PDF writer.",
        "chemistry": "Custom JavaScript chemistry core",
        "ui": "Custom JavaScript DOM UI",
        "source": "https://chempirical.com/_/1u8nv47olv/covalent/app.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/covalent/",
          "note": "Drew single, double and triple bonds.",
          "shot": {
            "image": "evidence/covalent/f-bonds-core.webp",
            "caption": "Bond tools and a Paclitaxel structure with single and double bonds."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/inspector.js",
          "note": "Drew wedge and hash; changed selected bond to wavy.",
          "shot": {
            "image": "evidence/covalent/f-stereo-bonds.webp",
            "caption": "Wedge, hashed and wavy bond tools beside a Paclitaxel structure."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/covalent/",
          "note": "Drew benzene and a six-membered ring.",
          "shot": {
            "image": "evidence/covalent/f-rings.webp",
            "caption": "Ring tools and aromatic rings in a Paclitaxel structure."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/app.js",
          "note": "Drag length controls a carbon chain with 120-degree zigzags."
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "Worksheet template adds several editable structures, not individual structure templates."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/editing.js",
          "note": "Groups such as Ph, OMe and Boc expand into atoms.",
          "shot": {
            "image": "evidence/covalent/f-abbreviations.webp",
            "caption": "Keyboard instructions mention OMe, Ph and Boc group labels."
          }
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/inspector.js",
          "note": "Charges and elements editable; direct isotope editing unverified.",
          "shot": {
            "image": "evidence/covalent/f-atom-labels.webp",
            "caption": "Keyboard instructions for element labels and atom charges."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempirical.com/covalent/",
          "note": "Element hotkeys and 1/2/3 change atoms and bonds under pointer.",
          "shot": {
            "image": "evidence/covalent/f-keyboard-drawing.webp",
            "caption": "Keyboard instructions for atom labels, charges and bond order."
          }
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/app.js",
          "note": "Rectangular selection, rotation and flipping; drawings resize in Page view."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "Drew forward arrow and changed another to equilibrium."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "Converted page arrow to curved electron-pair arrow."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/app.js",
          "note": "Reaction SMILES and RXN preserve reactants and products."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "Subscripts, superscripts and font sizing; typeface is fixed."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempirical.com/covalent/",
          "note": "Page tools include boxes, ellipses and brackets."
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "Align objects or distribute them horizontally and vertically."
        },
        "groups": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "Group and ungroup page objects."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempirical.com/covalent/",
          "note": "Clean up command: Ctrl+L.",
          "shot": {
            "image": "evidence/covalent/f-cleanup.webp",
            "caption": "Clean up command above the caffeine drawing."
          },
          "engine": {
            "library": "In-house layoutMolecule 2D coordinate generator (JavaScript module in browser)",
            "source": "https://chempirical.com/_/20y4li0mgj/chem/layout.js"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "ACS Document 1996 preset."
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "Text, arrows and shapes have individual colour controls."
        },
        "pages": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "Worksheet template added a second page; page-size control visible."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/inspector.js",
          "note": "Valence problems are displayed in the Check section.",
          "engine": {
            "library": "In-house valenceProblems and valencesFor (JavaScript modules in browser)",
            "source": "https://chempirical.com/_/20y4li0mgj/chem/valence.js"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/inspector.js",
          "note": "Paclitaxel panel displayed R/S descriptors.",
          "shot": {
            "image": "evidence/covalent/f-stereo-perception.webp",
            "caption": "Paclitaxel structure with R and S descriptors in the panel."
          },
          "engine": {
            "library": "Ported from SiMolecule Centres (JavaScript adaptation of CIP rules in chem/cip.js; browser and inspector Web Worker)",
            "source": "https://chempirical.com/_/20y4li0mgj/chem/cip.js"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/inspector.js",
          "note": "Caffeine displayed C8H10N4O2 and 194.19 g/mol.",
          "shot": {
            "image": "evidence/covalent/f-formula-mass.webp",
            "caption": "Caffeine structure with molecular formula and molar mass."
          },
          "engine": {
            "library": "In-house formula.js formula, molecular weight and exact mass calculations (JavaScript; inspector Web Worker)",
            "source": "https://chempirical.com/_/20y4li0mgj/chem/formula.js"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/covalent/",
          "note": "Aspirin search inserted its structure.",
          "engine": {
            "library": "Chempirical catalogue web service; PubChem web service (fallback)",
            "source": "https://chempirical.com/_/20y4li0mgj/covalent/app.js"
          }
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chempirical.com/chemdraw-alternative/",
          "note": "Identified caffeine; systematic name generation was not demonstrated.",
          "shot": {
            "image": "evidence/covalent/f-structure-to-name.webp",
            "caption": "Caffeine structure and its name in the structure panel."
          },
          "engine": {
            "library": "Chempirical catalogue web service; PubChem web service (existing-name lookup)",
            "source": "https://chempirical.com/_/20y4li0mgj/covalent/inspector.js"
          }
        },
        "nmr-prediction": {
          "status": "no",
          "evidence": "docs",
          "source": "https://chempirical.com/chemdraw-alternative/",
          "note": "Provided by a separate Chempirical NMR predictor."
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/privacy/",
          "note": "Search returned and inserted aspirin.",
          "engine": {
            "library": "PubChem web service (via Chempirical server proxy)",
            "source": "https://chempirical.com/_/20y4li0mgj/ui/lookup.js"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/_/1u8nv47olv/ui/viewer3d.js",
          "note": "Generated cholesterol ball-and-stick model and rotated it.",
          "shot": {
            "image": "evidence/covalent/f-model-3d.webp",
            "caption": "Cholesterol ball-and-stick model with 3D display controls."
          },
          "engine": {
            "library": "In-house Canvas 2D molecular viewer (JavaScript; in-house JavaScript 3D embedding in a module Web Worker)",
            "source": "https://chempirical.com/_/20y4li0mgj/ui/viewer3d.js"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "Imported a two-atom CDXML; no CDXML export shown.",
          "engine": {
            "library": "In-house CDXML reader (JavaScript module in browser; import only)",
            "source": "https://chempirical.com/_/20y4li0mgj/chem/cdxml.js"
          }
        },
        "cdx": {
          "status": "no",
          "evidence": "docs",
          "source": "https://chempirical.com/chemdraw-alternative/",
          "note": "Official comparison explicitly says CDX is not yet supported."
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/covalent/",
          "note": "Imported MOL and SDF; exported V3000 MOL.",
          "engine": {
            "library": "In-house MOL V2000/V3000 reader and V3000 writer with SDF record handling (JavaScript modules in browser)",
            "source": "https://chempirical.com/_/20y4li0mgj/chem/molfile.js"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/covalent/",
          "note": "Pasted fixtures and copied caffeine SMILES.",
          "engine": {
            "library": "In-house parseSmiles and writeSmiles (JavaScript parser, canonicalizer and writer modules in browser)",
            "source": "https://chempirical.com/_/20y4li0mgj/chem/smiles-writer.js"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempirical.com/covalent/",
          "note": "Open and export RXN reaction files."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/covalent/",
          "note": "Downloaded structure SVGs."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/pdf.js",
          "note": "Downloaded a one-page PDF."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chempirical.com/covalent/",
          "note": "Page PNG was 2550 by 3300 pixels for US Letter.",
          "shot": {
            "image": "evidence/covalent/f-png-export.webp",
            "caption": "Exported PNG page showing a caffeine structure."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "no",
          "evidence": "source",
          "source": "https://chempirical.com/_/1u8nv47olv/covalent/document.js",
          "note": "Word paste retains editable text; structures and arrows become pictures."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://chempirical.com/covalent/",
          "note": "CSP frame-ancestors 'self' and X-Frame-Options SAMEORIGIN block external framing."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chempirical.com/_/3iwgr3zje0/covalent/app.js",
          "note": "Atom and bond selection halos are excluded from exports."
        }
      },
      "caveats": [
        "ChemDraw CDXML import is available; binary CDX is unsupported.",
        "Office pasting turns structures and arrows into pictures.",
        "Offline operation is undocumented; the browser editor requires JavaScript."
      ],
      "github": null,
      "hands": {
        "testedVersion": "2uu6kqoryy",
        "canvas": "evidence/covalent/canvas.webp",
        "canvasLight": "evidence/covalent/canvas-light.webp",
        "canvasDark": "evidence/covalent/canvas-dark.webp",
        "memory": {
          "idleMb": 381.96,
          "paclitaxelMb": 353.96,
          "baselineMb": 215.96,
          "rssIdleMb": 833.61,
          "rssPaclitaxelMb": 860.55,
          "runs": 3,
          "processes": 8,
          "method": "Chromium tree and crashpad footprints; median of three scripted SMILES pastes.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://chempirical.com/covalent/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/covalent/simple.svg",
            "note": "Pasted SMILES; automatic layout and fit.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/covalent/complex.svg",
            "note": "Pasted SMILES; automatic layout with stereobonds.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/covalent/threed.png",
            "note": "3D model saved in threed-view.png; rotation verified.",
            "structure": "match"
          }
        ],
        "observations": [
          "The hosted build identifier appears in the served asset path.",
          "Default 2D canvas used a dark background and coloured heteroatoms.",
          "Paclitaxel was automatically fitted with wedge and hashed bonds.",
          "Cholesterol 3D default was ball-and-stick with hydrogens shown.",
          "The SDF import displayed explicit hydrogens in the drawing."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 2011,
        "transferBytes": 280309
      },
      "downloadBytes": null,
      "references": [
        "https://chempirical.com/covalent/",
        "https://chempirical.com/"
      ]
    },
    {
      "id": "p11",
      "slug": "reactio-draw",
      "name": "Reactio Draw",
      "rank": 9,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "OpenChemLib",
          "InChI",
          "OPSIN",
          "Octet Draw",
          "openclatura",
          "RDKit"
        ],
        "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L14666",
        "note": "Original SVG canvas; Octet supplies naming; openclatura and RDKit are optional desktop helpers."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "In-house SVG renderer",
        "language": "JavaScript",
        "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L15678"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript embedded in HTML; Go/Swift wrappers and support code excluded.",
      "video": {
        "provider": "file",
        "url": "https://github.com/user-attachments/assets/1637fe6d-b6d1-4ec5-9d68-9a41d62ef0c8",
        "embed": null,
        "title": "Demo video",
        "author": null,
        "linkedFrom": "https://github.com/Paivel/reactio-draw/blob/main/README.md",
        "poster": null
      },
      "embedding": {
        "methods": [
          "iframe"
        ],
        "package": null,
        "limit": "AGPL-3.0-or-later",
        "how": "Load web/index.html?embed in an iframe; exchange structures through postMessage."
      },
      "otherLanguages": [
        {
          "language": "Go",
          "role": "Windows/Linux wrappers and MCP server"
        },
        {
          "language": "Swift",
          "role": "macOS WebKit wrapper"
        },
        {
          "language": "Python",
          "role": "Optional naming and image recognition"
        },
        {
          "language": "Java",
          "role": "Desktop OPSIN fallback"
        },
        {
          "language": "C",
          "role": "InChI compiled to WebAssembly"
        },
        {
          "language": "VBA",
          "role": "Word add-in"
        }
      ],
      "thirdParty": {
        "summary": "Desktop OPSIN bundles jna-inchi (LGPL-2.1-or-later) and JNA (Apache-2.0 OR LGPL-2.1). NMR data requires database share-alike and OSI-licensed reliant software; ChEBI drawings require CC BY 4.0 attribution. Other bundled components use permissive licenses.",
        "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/THIRD-PARTY-NOTICES.md",
        "notice": "https://github.com/Paivel/reactio-draw/blob/main/THIRD-PARTY-NOTICES.md",
        "libraries": [
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          },
          {
            "name": "Octet Draw",
            "license": "Apache-2.0",
            "source": "https://github.com/SamChemMan/Octet-Draw/blob/main/LICENSE"
          },
          {
            "name": "OpenClatura",
            "license": "MIT",
            "source": "https://github.com/lamalab-org/openclatura/blob/main/LICENSE"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It creates standalone chemical drawing documents with reaction schemes, styled captions, vector figures and editable Office output.",
      "summary": "An editor for drawing chemical structures, reaction schemes and publication figures.",
      "website": "https://paivel.github.io/reactio-draw/web/",
      "repo": "https://github.com/Paivel/reactio-draw",
      "docs": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/docs/Reactio%20Draw%20-%20Getting%20started.pdf",
      "vendor": "Pavel Sakharov",
      "license": {
        "kind": "open-source",
        "spdx": "AGPL-3.0-or-later",
        "text": "Free software under GNU AGPL version 3 or later.",
        "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/README.md#licence"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/README.md"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v1.11",
        "date": "2026-11-05",
        "source": "https://github.com/Paivel/reactio-draw/releases/tag/v1.11"
      },
      "engine": {
        "rendering": "Custom SVG renderer; HTML canvas for PNG/TIFF and custom vector EPS export",
        "chemistry": "In-house with OpenChemLib, InChI, OPSIN and Octet Draw naming",
        "ui": "Vanilla HTML/CSS/JavaScript with native desktop webview wrappers",
        "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L2991",
          "note": "Drew single, double, triple bonds; changed an existing bond order.",
          "shot": {
            "image": "evidence/reactio-draw/f-bonds-core.webp",
            "caption": "Bond examples and ring structures on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L2994",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/reactio-draw/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L3002",
          "note": "Dative and quadruple bonds."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L23100",
          "note": "L, R and C choose left, right or centered."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L3029",
          "note": "Placed benzene and cyclohexane using dedicated tools.",
          "shot": {
            "image": "evidence/reactio-draw/f-rings.webp",
            "caption": "Benzene and cyclohexane drawings beside the ring tools."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L42650",
          "note": "Two cyclohexane chair templates.",
          "shot": {
            "image": "evidence/reactio-draw/f-conformers.webp",
            "caption": "Bridged and chair-shaped structure templates in the left palette."
          }
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L26666",
          "note": "Drag distance sets zigzag chain length."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L42656",
          "note": "Placed adamantane from built-in bridged structure palette.",
          "shot": {
            "image": "evidence/reactio-draw/f-templates.webp",
            "caption": "Bridged structure palette and an adamantane drawing."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L41824",
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L3715",
          "note": "Chemical definitions and expansion to atoms."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt#L186",
          "note": "Isotopes through SMILES, files and the API."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L3016",
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L26665",
          "note": null,
          "shot": {
            "image": "evidence/reactio-draw/f-keyboard-drawing.webp",
            "caption": "Hotkeys for changing atoms while pointing at them."
          }
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L19782",
          "note": "Lasso, rotate, flip, proportional scaling and stretching.",
          "shot": {
            "image": "evidence/reactio-draw/f-selection-tools.webp",
            "caption": "Selected ethanol structure with resize and rotation handles."
          }
        },
        "perspective": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L26671",
          "note": null,
          "shot": {
            "image": "evidence/reactio-draw/f-perspective.webp",
            "caption": "Cholesterol drawing with the rotation tool selected."
          }
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L45185",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/reactio-draw/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L45235",
          "note": "Drew curved electron-pair arrow and edited its curvature.",
          "shot": {
            "image": "evidence/reactio-draw/f-mechanism-arrows.webp",
            "caption": "Curved arrow on the drawing canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/EMBEDDING.md#3-commands",
          "note": "Drawing reaction arrows produced reaction SMILES in Analysis.",
          "shot": {
            "image": "evidence/reactio-draw/f-reaction-data.webp",
            "caption": "Reaction drawing with reaction SMILES in the analysis panel."
          }
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L26674",
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L3114",
          "note": "Font selection, subscripts, superscripts, bold and italic.",
          "shot": {
            "image": "evidence/reactio-draw/f-rich-text.webp",
            "caption": "Font, bold, italic, subscript, and superscript controls."
          }
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L26676",
          "note": "Editable shapes and brackets; API also supports curves."
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L3079",
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L48553",
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/EMBEDDING.md#3-commands",
          "note": "Clean Up Structure, 2D and Reaction commands.",
          "engine": {
            "library": "In-house JavaScript layout/cleanup; bundled OpenChemLib 9.25.1 JavaScript assists cage conformers and stereochemistry preservation",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L11245"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L3115",
          "note": "ACS, Nature, RSC, Angewandte and Synthesis/Synlett presets."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L50898",
          "note": "Custom bond/font settings saved as defaults for new documents."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt",
          "note": "Individual atom, bond, text and shape colors."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt",
          "note": "PNG/JPEG images placed and resized on the sheet."
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L3397",
          "note": "Editable reagent-table cells on the sheet."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt",
          "note": "Default paclitaxel layout triggered a highlighted ring-stereobond warning.",
          "shot": {
            "image": "evidence/reactio-draw/f-valence-check.webp",
            "caption": "Highlighted ring bond and a stereobond warning."
          },
          "engine": {
            "library": "In-house JavaScript valence and drawing checks; bundled OpenChemLib 9.25.1 JavaScript stereo perception for stereochemical warnings",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L18445"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L15888",
          "note": "Computed CIP R/S and E/Z labels.",
          "shot": {
            "image": "evidence/reactio-draw/f-stereo-perception.webp",
            "caption": "Analysis panel includes a checkbox for R/S and E/Z labels."
          },
          "engine": {
            "library": "Bundled OpenChemLib 9.25.1 JavaScript CIP perception via getAtomCIPParity/getBondCIPParity",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L16741"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt",
          "note": "Caffeine: C8H10N4O2, molecular weight 194.19, exact mass 194.0804.",
          "shot": {
            "image": "evidence/reactio-draw/f-formula-mass.webp",
            "caption": "Caffeine drawing alongside molecular weight and exact mass."
          },
          "engine": {
            "library": "In-house JavaScript atom counting and mass calculation using IUPAC/NIST atomic-weight/isotope data",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L5023"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt",
          "note": "Caffeine cLogP -0.18 and TPSA 58.4 displayed.",
          "shot": {
            "image": "evidence/reactio-draw/f-properties.webp",
            "caption": "Caffeine drawing with cLogP and TPSA values."
          },
          "engine": {
            "library": "Bundled OpenChemLib 9.25.1 JavaScript MoleculeProperties for cLogP, TPSA and related descriptors",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L16699"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/names/README.md",
          "note": "Ethanol name produced CCO and C2H6O.",
          "engine": {
            "library": "In-house JavaScript lookup; OPSIN 2.8.0 compiled to JavaScript with TeaVM 0.16.0, Octet Draw name tables/condensed-formula reader and Wikidata dictionary; desktop fallback to bundled OPSIN 2.9.0 Java JAR subprocess",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/names/README.md#L3"
          }
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/names/README.md",
          "note": "Alternative naming worked; primary command failed because openclatura was absent.",
          "shot": {
            "image": "evidence/reactio-draw/f-structure-to-name.webp",
            "caption": "Caffeine drawing and its alternative systematic name."
          },
          "engine": {
            "library": "Octet Draw namer/complexes TypeScript transpiled to bundled JavaScript unchanged; optional desktop openclatura Python subprocess with RDKit; OPSIN read-back verification",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/THIRD-PARTY-NOTICES.md#L16"
          }
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt",
          "note": "Offline 1H, 13C, 19F and 31P predictions.",
          "shot": {
            "image": "evidence/reactio-draw/f-nmr-prediction.webp",
            "caption": "NMR prediction controls with a proton nucleus selector."
          },
          "engine": {
            "library": "In-house JavaScript rd-sphere-v1 environment encoder/table predictor with local nmrshiftdb2-derived measured-shift tables",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/data/nmr/README.md#L12"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/EMBEDDING.md#3-commands",
          "note": "R-group lists, enumeration and decomposition."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/RELEASE_NOTES.md#L5",
          "note": "Chemical repeat units; SRU and CDXML/CDX round-trip."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt#L348",
          "note": "Requires AI add-on and separately installed MolScribe; Mac/Windows.",
          "engine": {
            "library": "MolScribe, separately installed Python/PyTorch subprocess with local model inference, connected through the macOS/Windows desktop bridge",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/macapp/reactio_ocsr.py#L43"
          }
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L3111",
          "note": "Builds and rotates; generated cholesterol inverted one stereocenter.",
          "engine": {
            "library": "Bundled OpenChemLib 9.25.1 JavaScript ConformerGenerator and MMFF94s+; In-house JavaScript SVG rendering/rotation and fallback force field; xyzrender style values only",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L48928"
          }
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/EMBEDDING.md#3-commands",
          "note": "CIF import is a test version."
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/EMBEDDING.md#3-commands",
          "note": "Exported caffeine CDXML and reopened it as recognized chemistry.",
          "engine": {
            "library": "In-house JavaScript CDXML reader/writer using browser DOMParser",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L42259"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/README.md#what-it-does",
          "note": null,
          "engine": {
            "library": "In-house JavaScript binary CDX reader/writer; ReShiki CDX property-table data, with no ReShiki runtime code",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L36332"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/EMBEDDING.md#3-commands",
          "note": "MOL import/export and SDF export/reimport succeeded.",
          "engine": {
            "library": "In-house JavaScript V2000 MOL/SDF reader/writer and V3000 writer; bundled OpenChemLib 9.25.1 JavaScript for V3000 import and enhanced-stereo export",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L42040"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/EMBEDDING.md#3-commands",
          "note": "All three fixture SMILES imported; SMILES exports saved.",
          "shot": {
            "image": "evidence/reactio-draw/f-smiles.webp",
            "caption": "Caffeine drawing and its SMILES string."
          },
          "engine": {
            "library": "In-house JavaScript SMILES parser/writer; bundled OpenChemLib 9.25.1 JavaScript toIsomericSmiles for stereochemical output",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/index.html#L31111"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt",
          "note": "Offline InChI and InChIKey output.",
          "shot": {
            "image": "evidence/reactio-draw/f-inchi.webp",
            "caption": "Caffeine drawing with InChI and InChIKey fields."
          },
          "engine": {
            "library": "InChI 1.07 C library compiled to bundled WebAssembly with wasi-sdk 25; In-house C/JavaScript adapter; local execution",
            "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/tools/inchi/build.sh#L2"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/EMBEDDING.md#3-commands",
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/EMBEDDING.md#3-commands",
          "note": "All three SVG exports saved and parsed as vector XML."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "No PDF/Print command found; Cmd+P opened no print dialog."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/index.html#L33231",
          "note": "Default 3× PNG exported; roughly 600 dpi at SVG physical size."
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/windows-app/clip.go#L77",
          "note": "Windows native CDX clipboard, both directions."
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/README.md#what-it-does",
          "note": "Editable Word drawings on Windows/Mac; cross-platform return uses copy/paste."
        },
        "python-api": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt#L471",
          "note": "Documented HTTP wrapper example; requires desktop API add-on."
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/EMBEDDING.md#2-send-commands",
          "note": "Documented JavaScript postMessage API."
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Command%20line.txt",
          "note": "Renders and converts without a window; Linux needs a desktop session.",
          "shot": {
            "image": "evidence/reactio-draw/f-cli.webp",
            "caption": "Info panel lists command-line render, convert, calc, nmr, and check."
          }
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/MCP.txt",
          "note": "Separate AI-assistants add-on required.",
          "shot": {
            "image": "evidence/reactio-draw/f-mcp-agents.webp",
            "caption": "Info panel describes a separate AI assistants add-on and commands."
          }
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/738c371a10a85b51c606619d713be441523374f8/EMBEDDING.md#1-put-the-editor-on-the-page",
          "note": "Load web/index.html?embed in an iframe; exchange structures through postMessage."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/windows-app/server.go#L3",
          "note": "Windows OLE objects support double-click editing in Word and PowerPoint."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Paivel/reactio-draw/blob/92d4c7cf7abf1f8bf0b738bd3dc5a41f53b07734/Local%20API.txt#L281",
          "note": "Atom halos and bond bands support adjustable colors and width."
        }
      },
      "caveats": [
        "macOS installation builds the app locally and requires Apple's Command Line Tools.",
        "Local API/MCP require a separate add-on; image recognition additionally requires MolScribe.",
        "Some naming guides still require desktop Java; v1.10 includes browser-based OPSIN."
      ],
      "github": {
        "url": "https://github.com/Paivel/reactio-draw",
        "stars": 30,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-10-18",
        "commits": 83,
        "contributors": 1,
        "pushedAt": "2026-11-05T11:02:27Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "1.10",
        "canvas": "evidence/reactio-draw/canvas.webp",
        "canvasLight": "evidence/reactio-draw/canvas-light.webp",
        "canvasDark": "evidence/reactio-draw/canvas-dark.webp",
        "memory": {
          "idleMb": 216.28,
          "paclitaxelMb": 288.54,
          "baselineMb": null,
          "rssIdleMb": 402.47,
          "rssPaclitaxelMb": 770.19,
          "runs": 3,
          "processes": 5,
          "method": "Median phys_footprint sums; ps tree plus lsappinfo WebKit/AppKit helpers; SMILES paste; 10-second waits.",
          "note": "Native app; open -n failed (-10825), direct executable launch. Values in MiB."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Dark interface; canvas remains white."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "zip",
        "artifact": "https://github.com/Paivel/reactio-draw/releases/download/v1.10/ReactioDraw-Mac.zip",
        "ran": true,
        "failure": null,
        "downloadBytes": 23709865,
        "installedBytes": 27414528,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/reactio-draw/simple.svg",
            "note": "Current Kekule SMILES; default layout; fitted view only.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/reactio-draw/complex.svg",
            "note": "Current Kekule SMILES; default layout; ring-stereobond warning retained; fitted view only.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "failed",
            "input": "smiles",
            "image": "evidence/reactio-draw/threed.png",
            "note": "Generated 3D model inverted hydroxyl stereocenter; depth rotation worked.",
            "structure": "stereo"
          }
        ],
        "observations": [
          "Default ACS style used colored heteroatoms and a visible grid.",
          "SMILES import required clicking the sheet to place each structure.",
          "Caffeine and paclitaxel exports preserved fixture identity and stereochemistry.",
          "Paclitaxel's default layout triggered a ring-stereobond warning.",
          "Cholesterol 3D generation inverted its hydroxyl stereocenter; rotation restored it.",
          "Native cholesterol model stores depth coordinates; MOL export flattens them to zero Z."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 337,
        "idleMb": 149,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 23709865,
      "references": [
        "https://github.com/Paivel/reactio-draw/blob/736db9c52de06d384a678bcd623c6138150523b2/README.md",
        "https://github.com/Paivel/reactio-draw/blob/736db9c52de06d384a678bcd623c6138150523b2/THIRD-PARTY-NOTICES.md",
        "https://github.com/Paivel/reactio-draw/blob/736db9c52de06d384a678bcd623c6138150523b2/PLATFORMS.md"
      ]
    },
    {
      "id": "p117",
      "slug": "chemedit",
      "name": "ChemEdit",
      "rank": 10,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "Ketcher",
          "Indigo",
          "OpenChemLib",
          "SmilesDrawer",
          "Miew"
        ],
        "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/KetcherReact.tsx",
        "note": "Embeds packaged Ketcher; Indigo supplies chemistry, OpenChemLib properties, SmilesDrawer previews, and Miew 3D."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher/Raphaël, SmilesDrawer, and Indigo",
        "language": "TypeScript",
        "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/main.ts#L839"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript is generated output and build tooling.",
      "video": {
        "provider": "file",
        "url": "https://github.com/user-attachments/assets/f1ee4820-636d-44d1-846e-a286597670df",
        "embed": null,
        "title": "Demo video",
        "author": null,
        "linkedFrom": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/README.md",
        "poster": null
      },
      "embedding": {
        "methods": [
          "desktop widget"
        ],
        "package": null,
        "limit": "MIT; desktop Obsidian only.",
        "how": "Install Obsidian plugin; open its integrated Ketcher drawing modal."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Raphaël, SmilesDrawer, Miew and runtime"
        },
        {
          "language": "C++",
          "role": "Indigo chemistry and preview WebAssembly"
        },
        {
          "language": "C",
          "role": "InChI support compiled to WebAssembly"
        },
        {
          "language": "Java",
          "role": "OpenChemLib compiled to JavaScript"
        }
      ],
      "thirdParty": {
        "summary": "Ketcher's notices list LGPL-2.1 and MPL-1.0 dependencies alongside Apache-2.0, MIT and BSD components.",
        "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/NOTICE",
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          },
          {
            "name": "SmilesDrawer",
            "license": "MIT",
            "source": "https://github.com/reymond-group/smilesDrawer/blob/master/LICENSE.md"
          },
          {
            "name": "Miew",
            "license": "MIT",
            "source": "https://github.com/epam/miew/blob/main/LICENSE.md"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "End users can draw and save 2D chemical figures with SVG export and ACS styling inside Obsidian.",
      "summary": "Obsidian plugin for drawing chemical structures, editing chemistry files, and maintaining electronic lab notebooks.",
      "website": "https://github.com/ruzx/obsidian-chemedit",
      "repo": "https://github.com/ruzx/obsidian-chemedit",
      "docs": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/README.md",
      "vendor": "Ruzal Sitdikov",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT-licensed Obsidian plugin.",
        "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/LICENSE"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.4.3",
        "date": "2026-10-21",
        "source": "https://github.com/ruzx/obsidian-chemedit/releases/tag/1.4.3"
      },
      "engine": {
        "rendering": "SVG through Ketcher/Raphael, Indigo exports, and SmilesDrawer; optional HTML canvas previews.",
        "chemistry": "Indigo via Ketcher standalone, and OpenChemLib.",
        "ui": "React within Obsidian.",
        "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/package-lock.json"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts#L21",
          "note": "Drew single, double, and triple bonds manually.",
          "shot": {
            "image": "evidence/chemedit/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts#L26",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/chemedit/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts#L39",
          "note": "Dative and hydrogen bonds."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/data/templates.js#L21",
          "note": "Placed cyclopropane, cyclohexane, and benzene rings.",
          "shot": {
            "image": "evidence/chemedit/f-rings.webp",
            "caption": "Three-membered, six-membered, and aromatic rings above the ring toolbar."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/templates/library.sdf#L8258",
          "note": "Includes chair conformations."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/editor/tool/chain.ts#L168",
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#templates-toolbar",
          "note": "Placed L-alanine from the structure library."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#templates-toolbar",
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#functional-groups",
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/data/schema/struct-schema.ts#L74",
          "note": null,
          "shot": {
            "image": "evidence/chemedit/f-atom-labels.webp",
            "caption": "Atom Properties dialog with label, alias, charge, and isotope fields."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-core/src/application/render/restruct/reatom.ts#L1720",
          "note": "Monoradical and diradical dots.",
          "shot": {
            "image": "evidence/chemedit/f-radicals.webp",
            "caption": "Radical selector in the Atom Properties dialog."
          }
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/state/handleHotkeysOverItem.ts#L251",
          "note": "Number keys changed bond order during drawing."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/editor/tool/select/select.ts#L285",
          "note": "Lasso, rotation and flips; resizing limited to images and graphical objects."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/action/tools.ts#L135",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/chemedit/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the drawing canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/action/tools.ts#L260",
          "note": "Drew curved arrow and moved its endpoint handle.",
          "shot": {
            "image": "evidence/chemedit/f-mechanism-arrows.webp",
            "caption": "Curved arrow with a full arrowhead on the drawing canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/main.ts#L1088",
          "note": "RXN export and chemically encoded ELN reactants/products."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#drawing-reactions",
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/views/modal/components/Text/Text.tsx#L54",
          "note": "Font size, bold, italic, subscripts, and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#drawing-graphical-objects",
          "note": "Geometric shapes and S-group brackets."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#ketcher-molecules-mode",
          "note": null,
          "engine": {
            "library": "Indigo 1.45.1 (C++ compiled to WebAssembly, indigo-ketcher through ketcher-standalone 3.17.2)",
            "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L228"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/Settings.ts#L174",
          "note": "ACS Document 1996 preset."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/views/modal/components/meta/Settings/Settings.tsx#L84",
          "note": "Bond and font settings save/reload as JSON."
        },
        "color": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Individual colored highlights; atom-label and bond-stroke colors remain unchanged."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#adding-images-on-the-canvas",
          "note": "PNG and SVG images."
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/README.md#L43",
          "note": "Editable ELN tables and separate TLC photo annotations."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#drawing-atoms",
          "note": "Invalid valence is underlined in red.",
          "engine": {
            "library": "Ketcher 3.17.2 (TypeScript calcValence/badConn live warnings); Indigo 1.45.1 (WebAssembly explicit structure check)",
            "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-core/src/domain/entities/struct.ts#L1120"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#stereochemistry",
          "note": null,
          "engine": {
            "library": "Indigo 1.45.1 (C++ compiled to WebAssembly, calculateCip through ketcher-standalone 3.17.2)",
            "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L170"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/ChemDataEngine.ts#L36",
          "note": "Caffeine: C8H10N4O2, molecular weight 194.194, exact mass 194.080.",
          "shot": {
            "image": "evidence/chemedit/f-formula-mass.webp",
            "caption": "Calculated formula, molecular weight, exact mass, and elemental analysis."
          },
          "engine": {
            "library": "Indigo 1.45.1 (WebAssembly via Ketcher calculate); OpenChemLib JS 9.25.0 fallback; CACTUS and PubChem remote HTTP fallbacks; In-house rough estimate as final fallback",
            "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/SharedEln.ts#L9"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/ChemDataEngine.ts#L54",
          "note": "OpenChemLib computes logP and TPSA.",
          "engine": {
            "library": "OpenChemLib JS 9.25.0 (bundled Java-to-JavaScript library, MoleculeProperties.logP and polarSurfaceArea)",
            "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/ChemDataEngine.ts#L35"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/ChemNavigator.ts#L875",
          "note": "Web lookup for caffeine returned a structure.",
          "shot": {
            "image": "evidence/chemedit/f-name-to-structure.webp",
            "caption": "Web name lookup shows caffeine and its resulting structure."
          },
          "engine": {
            "library": "OPSIN, NCI/CADD Chemical Identifier Resolver (CACTUS), and PubChem PUG REST (remote HTTP services, sequential fallbacks)",
            "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/ChemNavigator.ts#L890"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/SharedContextMenu.ts#L55",
          "note": "Returned 1,3,7-trimethylpurine-2,6-dione for caffeine.",
          "engine": {
            "library": "PubChem PUG REST (remote web service, IUPACName lookup by SMILES)",
            "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/SharedContextMenu.ts#L58"
          }
        },
        "nmr-prediction": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/main.ts#L257",
          "note": "Opens external nmrdb 1H prediction; no built-in predictor.",
          "engine": {
            "library": "NMRdb (external browser simulator opened with SMILES; no predictor in ChemEdit)",
            "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/main.ts#L257"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#drawing-r-groups",
          "note": null
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#marking-s-groups",
          "note": "SRU and copolymer S-groups."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/README.md#L114",
          "note": "Ketcher sequence/macromolecule mode; complex sequences can fall back."
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts#L720",
          "note": "Image Recognition service unavailable; clicking did nothing."
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/ChemNavigator.ts#L890",
          "note": "Web chemical-name lookup returned caffeine structure.",
          "shot": {
            "image": "evidence/chemedit/f-database-lookup.webp",
            "caption": "Web lookup for caffeine with a structure result."
          },
          "engine": {
            "library": "PubChem PUG REST and NCI/CADD Chemical Identifier Resolver (CACTUS) (remote HTTP services)",
            "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/ChemNavigator.ts#L892"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#3d-viewer",
          "note": "SDF rotates in Miew; SMILES did not generate depth coordinates.",
          "shot": {
            "image": "evidence/chemedit/f-model-3d.webp",
            "caption": "Miew dialog displaying a three-dimensional molecular model."
          },
          "engine": {
            "library": "Miew 0.11.1 through miew-react 0.11.0 (bundled JavaScript/Three.js WebGL viewer in Ketcher)",
            "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/views/modal/components/process/Miew/Miew.tsx#L44"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/README.md#1-native-file-embeds-the-easy-way",
          "note": "Exported caffeine and reopened CDXML in the editor.",
          "shot": {
            "image": "evidence/chemedit/f-cdxml.webp",
            "caption": "Opened CDXML document displays a caffeine structure."
          },
          "engine": {
            "library": "Indigo 1.45.1 (C++ compiled to WebAssembly, CDXML import/export through Ketcher 3.17.2)",
            "source": "https://github.com/epam/Indigo/blob/029211b384de1627d0bc17cb750ed7427d45db91/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L193"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#working-with-files",
          "note": "Use Ketcher's own file dialogs.",
          "engine": {
            "library": "Indigo 1.45.1 (C++ compiled to WebAssembly, CDX import/export through Ketcher 3.17.2)",
            "source": "https://github.com/epam/Indigo/blob/029211b384de1627d0bc17cb750ed7427d45db91/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L197"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#working-with-files",
          "note": "MOL export reopened; cholesterol 3D SDF imported successfully.",
          "engine": {
            "library": "Ketcher 3.17.2 (TypeScript MolSerializer for ordinary MOL V2000); Indigo 1.45.1 (WebAssembly for query MOL, V3000 and SDF); OpenChemLib JS 9.25.0 (MOL parsing helpers)",
            "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L82"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/README.md#2-smiles-blocks",
          "note": "Imported fixtures and saved generated Daylight SMILES.",
          "engine": {
            "library": "Indigo 1.45.1 (C++ compiled to WebAssembly, SMILES import/export via Ketcher); OpenChemLib JS 9.25.0 (SMILES parsing and MOL-to-SMILES helper)",
            "source": "https://github.com/epam/Indigo/blob/029211b384de1627d0bc17cb750ed7427d45db91/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L137"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/main.ts#L1078",
          "note": null,
          "engine": {
            "library": "Indigo 1.45.1 with indigo-inchi/InChI (C/C++ compiled into indigo-ketcher WebAssembly)",
            "source": "https://github.com/epam/Indigo/blob/029211b384de1627d0bc17cb750ed7427d45db91/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L201"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/main.ts#L1088",
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/7390f9506420cda79a85d3ca6b55403ec8af0c13/main.ts#L1049",
          "note": "Saved default SVG exports for all three fixtures."
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Host PDF rasterizes chemistry; white bonds lose contrast on white."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/packages/ketcher-react/src/script/ui/data/schema/options-schema.ts#L38",
          "note": "Default PNG 223×162; high-resolution setting visible but untested."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/ruzx/obsidian-chemedit/7390f9506420cda79a85d3ca6b55403ec8af0c13/ChemEditAPI.ts",
          "note": "Public typed editor, rendering and conversion API."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/ruzx/obsidian-chemedit/blob/71d2fa4ccb9407ab9d8d5ca68727a28d78df1d82/README.md#4-draw-from-scratch",
          "note": "Install Obsidian plugin; open its integrated Ketcher drawing modal."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8f4687fae67a0d741cfc6b4769eff4f94243ff52/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Ketcher provides eight-color background highlights for individual atoms and bonds."
        }
      },
      "caveats": [
        "Requires desktop Obsidian; the manifest excludes iOS and Android.",
        "Complex ChemDraw formatting and proprietary CDXML objects may not round-trip.",
        "ChemEdit's SDF save option writes MOL data; use Ketcher's own SDF exporter."
      ],
      "github": {
        "url": "https://github.com/ruzx/obsidian-chemedit",
        "stars": 3,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-08-05",
        "commits": 85,
        "contributors": 1,
        "pushedAt": "2026-10-21T12:03:58Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "1.4.3",
        "canvas": "evidence/chemedit/canvas.webp",
        "canvasLight": "evidence/chemedit/canvas-light.webp",
        "canvasDark": "evidence/chemedit/canvas-dark.webp",
        "memory": {
          "idleMb": 851.3,
          "paclitaxelMb": 704.7,
          "baselineMb": null,
          "rssIdleMb": 1097.4,
          "rssPaclitaxelMb": 1072.4,
          "runs": 3,
          "processes": 4,
          "method": "Median summed process-tree phys_footprint; isolated Obsidian/ChemEdit, SMILES paste, ten-second waits; MiB.",
          "note": "Includes required Obsidian host and Electron helpers."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Dark mode changes interface; drawing canvas remains white."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://github.com/ruzx/obsidian-chemedit/releases/download/1.4.3/main.js",
        "ran": true,
        "failure": null,
        "downloadBytes": 276581879,
        "installedBytes": 594735104,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemedit/simple.svg",
            "note": "Automatic SMILES layout; no cleanup or repositioning.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemedit/complex.svg",
            "note": "Automatic layout with wedges, hashes, and ABS label; no cleanup.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/chemedit/threed.png",
            "note": "SMILES planar; SDF rotates in Miew. Default viewport saved as threed-view.png.",
            "structure": "match"
          }
        ],
        "observations": [
          "Default editor colors nitrogen blue and oxygen red.",
          "Paclitaxel layout includes wedge bonds, hashed bonds, and ABS label.",
          "Cholesterol SMILES stays planar; supplied 3D SDF rotates in Miew.",
          "MOL/CDXML previews show black bonds on the dark host background.",
          "Host PDF rasterizes chemistry; white bonds lose contrast on white."
        ]
      },
      "perf": null,
      "downloadBytes": 276581879,
      "references": [
        "https://github.com/ruzx/obsidian-chemedit",
        "https://github.com/ruzx/obsidian-chemedit",
        "https://github.com/ruzx/obsidian-chemedit/blob/main/README.md"
      ]
    },
    {
      "id": "p67",
      "slug": "chem-illustrator",
      "name": "Chem Illustrator",
      "rank": 11,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit",
          "OPSIN",
          "OpenClatura",
          "OpenChemLib",
          "cdxmorph"
        ],
        "source": "https://github.com/nathanohare/Chem-Illustrator/blob/4ebd676997123e6829f5f4a0c1e75e644f821089/src/main.ts#L344",
        "note": "Custom Canvas editor; cdxmorph port provides reaction animation."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Chem Illustrator Canvas 2D renderer",
        "language": "TypeScript",
        "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/render/renderer.ts#L912"
      },
      "enginesChecked": true,
      "languageNote": "Python/Java provide bindings; JavaScript supports tooling; HTML/CSS provide presentation.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-3.0-or-later",
        "how": "No documented embed API; hosted framing support remains unconfirmed."
      },
      "otherLanguages": [
        {
          "language": "Rust",
          "role": "Tauri shell and native integrations"
        },
        {
          "language": "C++",
          "role": "RDKit MinimalLib compiled to WebAssembly"
        },
        {
          "language": "Java",
          "role": "OPSIN/OpenChemLib compiled to JavaScript"
        },
        {
          "language": "Python",
          "role": "OpenClatura naming through Pyodide"
        },
        {
          "language": "JavaScript",
          "role": "Bundled chemistry loaders and engines"
        }
      ],
      "thirdParty": {
        "summary": "MIT/BSD/Apache software; MPL-2.0 components; OFL-1.1 fonts; CC BY data; NMRShiftDB2 ODbL-based data requires share-alike and OSI-licensed dependent functionality.",
        "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/public/nmr/NOTICE.md",
        "notice": "https://github.com/nathanohare/Chem-Illustrator/blob/main/THIRD-PARTY-NOTICES.md",
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          },
          {
            "name": "OpenClatura",
            "license": "MIT",
            "source": "https://github.com/lamalab-org/openclatura/blob/main/LICENSE"
          },
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          },
          {
            "name": "cdxmorph",
            "license": "MIT",
            "source": "https://github.com/rshenvi/cdxmorph/blob/main/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It creates multipage chemical drawings with journal styles, captions and vector export, including editable chemistry in documents and presentations.",
      "summary": "Chemical drawing software for structures, reaction schemes, publication figures, and documents with editable chemistry.",
      "website": "https://nathanohare.github.io/Chem-Illustrator/",
      "repo": "https://github.com/nathanohare/Chem-Illustrator",
      "docs": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/README.md",
      "vendor": "Nathan O'Hare",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-3.0-or-later",
        "text": "GPL version 3 or later, with an Apple App Store distribution exception.",
        "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/README.md#licence"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/README.md"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.1.197",
        "date": "2026-11-05",
        "source": "https://github.com/nathanohare/Chem-Illustrator/releases/tag/v0.1.197"
      },
      "engine": {
        "rendering": "HTML Canvas 2D with custom SVG, EMF and PDF vector exporters",
        "chemistry": "RDKit (WebAssembly), OPSIN, OpenClatura and OpenChemLib",
        "ui": "Custom TypeScript DOM/CSS interface; Tauri desktop WebView",
        "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/developers.md"
      },
      "languages": [
        "TypeScript",
        "Rust"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#bonds-and-chains",
          "note": "Drew all three orders and cycled single to triple.",
          "shot": {
            "image": "evidence/chem-illustrator/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#bonds-and-chains",
          "note": "Drew solid wedge, hashed wedge and wavy bonds.",
          "shot": {
            "image": "evidence/chem-illustrator/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#bonds-and-chains",
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/keyboard-and-mouse.md#pointing-at-a-bond",
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#rings",
          "note": "Placed benzene and cyclohexane rings.",
          "shot": {
            "image": "evidence/chem-illustrator/f-rings.webp",
            "caption": "Benzene and cyclohexane rings beside the ring tools."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#flat-chair-flipped-chair-and-boat",
          "note": null,
          "shot": {
            "image": "evidence/chem-illustrator/f-conformers.webp",
            "caption": "Haworth projection and chair ring tools in the toolbar."
          }
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#bonds-and-chains",
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#templates",
          "note": "Placed the glycine template.",
          "shot": {
            "image": "evidence/chem-illustrator/f-templates.webp",
            "caption": "Glycine template tool and glycine structure on the canvas."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#metal-complexes",
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#labels-and-groups",
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/keyboard-and-mouse.md#pointing-at-an-atom",
          "note": "D/T isotope labels supported."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#arrows-mechanism-symbols-shapes-and-brackets",
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/keyboard-and-mouse.md#how-hotkeys-work-in-a-drawing",
          "note": null,
          "shot": {
            "image": "evidence/chem-illustrator/f-keyboard-drawing.webp",
            "caption": "Canvas and hotkey hint for the atom or bond pointed at."
          }
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#select-and-eraser",
          "note": null
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#rotating-a-structure-in-perspective",
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#arrows-mechanism-symbols-shapes-and-brackets",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/chem-illustrator/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#arrows-mechanism-symbols-shapes-and-brackets",
          "note": "Drew a curved electron-pair arrow with editable handles.",
          "shot": {
            "image": "evidence/chem-illustrator/f-mechanism-arrows.webp",
            "caption": "Selected curved arrow with editing handles."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#other-formats",
          "note": null
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#reactions-and-schemes",
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#reactions-and-schemes",
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#text-and-captions",
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#arrows-mechanism-symbols-shapes-and-brackets",
          "note": null
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#moving-rotating-and-the-format-menu",
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#moving-rotating-and-the-format-menu",
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#tidying-and-checking",
          "note": null,
          "engine": {
            "library": "In-house (TypeScript geometry cleanup); RDKit MinimalLib 2026.9.1 (WebAssembly RDDepictor and CoordGen layout seeds for tangled structures)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/main.ts#L2950"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#drawing-styles",
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#drawing-styles",
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#colors-and-palettes",
          "note": null
        },
        "pages": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#the-page",
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#pictures-and-tables",
          "note": null
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#pictures-and-tables",
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#warnings",
          "note": null,
          "engine": {
            "library": "In-house (TypeScript incremental atom, valence, isotope and label checks)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/chem/warnings.ts#L69"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#stereochemistry",
          "note": null,
          "engine": {
            "library": "RDKit MinimalLib 2026.9.1 (WebAssembly CIP R/S and E/Z perception); In-house (TypeScript drawing interpretation and generic-group handling)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/chem/stereo.ts#L91"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#the-analysis-panel",
          "note": "Caffeine showed C8H10N4O2 and molecular weight 194.19.",
          "shot": {
            "image": "evidence/chem-illustrator/f-formula-mass.webp",
            "caption": "Molecular formula and molecular weight displayed in the toolbar."
          },
          "engine": {
            "library": "RDKit MinimalLib 2026.9.1 (WebAssembly atomic masses and molecular descriptors); In-house (TypeScript Hill formula from RDKit JSON)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/worker/chem-worker.ts#L75"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#the-analysis-panel",
          "note": "Ethanol analysis displayed cLogP and tPSA.",
          "engine": {
            "library": "RDKit MinimalLib 2026.9.1 (WebAssembly Crippen logP, TPSA and other descriptors); In-house (TypeScript additional property estimates)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/chem/props.ts#L163"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#labels-and-groups",
          "note": "Ethanol produced a C2H6O structure.",
          "engine": {
            "library": "OPSIN 2.9.0 (Java compiled to JavaScript with TeaVM, local worker); RDKit MinimalLib 2026.9.1 (WebAssembly layout); PubChem PUG REST (optional remote fallback)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/main.ts#L2463"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#structure-to-name",
          "note": "Ethanol structure produced an ethanol caption.",
          "engine": {
            "library": "OpenClatura 0.4.3 (Python wheel in Pyodide 314.0.7 WebAssembly, local worker); OPSIN (TeaVM JavaScript) and RDKit MinimalLib (WebAssembly) round-trip validation",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/worker/namer-worker.ts#L23"
          }
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#predicted-nmr",
          "note": "Predicts proton/carbon shifts; exchangeable OH, NH and SH protons omitted.",
          "engine": {
            "library": "In-house (TypeScript environment-code lookup and graph-network shift prediction, bundled NMRShiftDB2/NMRBank data)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/ui/nmr-panel.ts#L438"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#polymers-and-r-groups",
          "note": null
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#polymers-and-r-groups",
          "note": null
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#metal-complexes",
          "note": "Peptide sequence input and biomolecule templates."
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#structures-from-pictures-and-hand-drawings",
          "note": "Local reader on desktop; browser requires configured AI.",
          "engine": {
            "library": "MolScribe (ONNX model pack, local ONNX Runtime Web 1.22.0 WebAssembly worker, desktop only); optional Anthropic Claude, OpenAI or Google Gemini remote APIs, or user-configured OpenAI-compatible local/remote API",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/recognise/reader.ts#L1"
          }
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#labels-and-groups",
          "note": "Name lookup retrieves structures from PubChem.",
          "engine": {
            "library": "PubChem PUG REST/PUG View (remote database); NCI CACTUS Chemical Identifier Resolver (remote CAS-to-structure fallback)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/chem/cas.ts#L182"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#3-d-model",
          "note": "Generated cholesterol conformers and rotated the model.",
          "shot": {
            "image": "evidence/chem-illustrator/f-model-3d.webp",
            "caption": "3-D model window showing a ball-and-stick structure and conformers."
          },
          "engine": {
            "library": "OpenChemLib 9.25.1 (JavaScript/GWT build, local conformer generation and MMFF94s+); In-house (TypeScript Canvas 3D viewer)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/chem/model3d-build.ts#L193"
          }
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#reactions-and-schemes",
          "note": "CIF import with rotatable ellipsoid or ball-and-stick drawings."
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#chemdraw-files",
          "note": "Saved and reopened ethanol CDXML with three atoms.",
          "engine": {
            "library": "In-house (TypeScript CDXML reader and writer)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/io/cdxml-write.ts#L129"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#chemdraw-files",
          "note": null,
          "engine": {
            "library": "In-house (TypeScript binary CDX codec converting to/from CDXML)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/io/cdx.ts#L586"
          }
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#chemdraw-files",
          "note": "MOL opened and exported; direct SDF Open showed no result.",
          "engine": {
            "library": "In-house (TypeScript MOL V2000/V3000 and SDF readers/writers)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/io/chem-formats.ts#L924"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#other-formats",
          "note": "Pasted SMILES and copied ethanol as CCO.",
          "engine": {
            "library": "RDKit MinimalLib 2026.9.1 (WebAssembly SMILES parser and writer, local worker)",
            "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/src/worker/chem-worker.ts#L165"
          }
        },
        "inchi": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/nathanohare/Chem-Illustrator/5f875b5c78203ec7d6cbce1ff5de43b7a466ac64/docs/guide/sheets.md",
          "note": "InChI available through online PubChem compound lookup."
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#other-formats",
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#other-formats",
          "note": "Exported an SVG file."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#other-formats",
          "note": "Exported PDF with vector content and embedded font."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#other-formats",
          "note": "Default export is transparent PNG at 300 dpi."
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#copy-and-paste",
          "note": "Windows desktop app."
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/files-and-sharing.md#editing-drawings-inside-word-powerpoint-and-excel-windows",
          "note": "Windows desktop OLE objects support double-click editing."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/developers.md",
          "note": "No documented embed API; hosted framing support remains unconfirmed."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/getting-started.md#the-assistant-every-mode-ctrl",
          "note": "Requires own API key or local model."
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/5f875b5c78203ec7d6cbce1ff5de43b7a466ac64/docs/guide/files-and-sharing.md#editing-drawings-inside-word-powerpoint-and-excel-windows",
          "note": "Windows Office objects reopen in Chem Illustrator; Save updates the document."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathanohare/Chem-Illustrator/blob/fb2cc2afba4e815be4cbf0bd6324488113fccc76/docs/guide/drawing.md#frames-highlights-and-fills",
          "note": "Editable colored bands and halos highlight selected atoms and bonds."
        }
      },
      "caveats": [
        "Beta software; the author warns that some features may malfunction.",
        "Editable ChemDraw clipboard exchange and Office OLE editing require Windows desktop.",
        "iPad availability is limited to TestFlight testing."
      ],
      "github": {
        "url": "https://github.com/nathanohare/Chem-Illustrator",
        "stars": 3,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-10-12",
        "commits": 1085,
        "contributors": 4,
        "pushedAt": "2026-11-05T18:12:54Z",
        "archived": false
      },
      "hands": {
        "testedVersion": null,
        "canvas": "evidence/chem-illustrator/canvas.webp",
        "canvasLight": "evidence/chem-illustrator/canvas-light.webp",
        "canvasDark": "evidence/chem-illustrator/canvas-dark.webp",
        "memory": {
          "idleMb": 522,
          "paclitaxelMb": 495,
          "baselineMb": 269,
          "rssIdleMb": 1181.8,
          "rssPaclitaxelMb": 1108.3,
          "runs": 3,
          "processes": 6,
          "method": "Fresh Playwright Edge Chromium; summed process-tree physical footprints; medians of three.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Dark theme changes interface; canvas remains white."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://nathanohare.github.io/Chem-Illustrator/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chem-illustrator/simple.png",
            "note": "Pasted SMILES; default PNG and MOL exported.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chem-illustrator/complex.png",
            "note": "Default paste crossed a fixed page edge; added pages without changing layout.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chem-illustrator/threed.png",
            "note": "Rotatable model generated; viewport saved as threed-view.png.",
            "structure": "match"
          }
        ],
        "observations": [
          "Hosted build 4c297bb was deployed on 2026-11-05.",
          "The hosted app ran in an isolated WebKit browser shell.",
          "Paclitaxel has overlapping oxygen labels in the generated layout.",
          "All three MOL outputs matched input stereochemistry in RDKit checks.",
          "Direct SDF Open showed no result; batch input selection was uncertain."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 238,
        "transferBytes": 1610971
      },
      "downloadBytes": 93004813,
      "references": [
        "https://github.com/nathanohare/Chem-Illustrator",
        "https://nathanohare.github.io/Chem-Illustrator/",
        "https://github.com/nathanohare/Chem-Illustrator/blob/main/README.md"
      ]
    },
    {
      "id": "p49",
      "slug": "chemthistry",
      "name": "ChemThisTry",
      "rank": 12,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "Ketcher",
          "Indigo",
          "RDKit",
          "3Dmol.js",
          "ASE"
        ],
        "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/README.md#L26-L39",
        "note": "Sketcher embeds Ketcher; figure-composition canvas and 3D molecular viewer are separate modules."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher; Indigo exports",
        "language": "TypeScript",
        "source": "https://github.com/epam/ketcher/blob/c9ec64c2151ef36b2b10863e6a243b87cd1b7d12/packages/ketcher-core/src/application/render/restruct/rebond.ts"
      },
      "enginesChecked": true,
      "languageNote": "Public JavaScript files handle packaging; full application source is private.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Hosted app lacks framing restrictions; supported iframe integration remains undocumented."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "Indigo exports and RDKit chemistry"
        },
        {
          "language": "Python",
          "role": "Desktop chemistry and scientific computing sidecar"
        }
      ],
      "thirdParty": {
        "summary": "Apache-2.0 Ketcher/Indigo and BSD-3-Clause RDKit/3Dmol.js; other declared runtime dependencies mostly MIT/ISC/BSD/Python-2.0. DOMPurify offers Apache-2.0 or MPL-2.0.",
        "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/package-lock.json",
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "3Dmol.js",
            "license": "BSD-3-Clause",
            "source": "https://github.com/3dmol/3Dmol.js/blob/master/LICENSE"
          },
          {
            "name": "Atomic Simulation Environment",
            "license": "LGPL-2.1-or-later",
            "source": "https://docs.ase-lib.org/about.html"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its chemical structure editor and editable vector canvas can compose publication-grade chemical figures.",
      "summary": "A desktop and browser workspace for drawing chemical structures, viewing molecules, plotting data, and composing scientific figures.",
      "website": "https://zytanglab.com/software/chemthistry/en/",
      "repo": "https://github.com/thisThisYoung/ChemThisTry",
      "docs": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/README.md",
      "vendor": "ChemThisTry Team",
      "license": {
        "kind": "free",
        "spdx": "Apache-2.0",
        "text": "Free binaries; Apache-2.0 declared, but full application source is not public.",
        "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/README.md#L144-L156"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/thisThisYoung/ChemThisTry/releases/tag/v0.1.6"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.1.6",
        "date": "2026-10-18",
        "source": "https://github.com/thisThisYoung/ChemThisTry/releases/tag/v0.1.6"
      },
      "engine": {
        "rendering": "SVG through Ketcher/Raphaël; Fabric.js canvas for figure composition",
        "chemistry": "Indigo via Ketcher standalone; RDKit for 3D conformer optimization",
        "ui": "React; Electron desktop runtime and browser/PWA build",
        "source": "https://app.chemthistry.com/assets/Sketcher.js"
      },
      "languages": [
        "TypeScript",
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L172",
          "note": "Drew single, double, triple bonds; changed an existing bond order.",
          "shot": {
            "image": "evidence/chemthistry/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the sketcher canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/chemthistry/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Dative and hydrogen bond samples drawn successfully.",
          "shot": {
            "image": "evidence/chemthistry/f-special-bonds.webp",
            "caption": "Dative and dotted bonds alongside other bond types."
          }
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Placed benzene using the aromatic ring tool."
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Accessible template library includes Chair1–Chair4 and six-membered chairs."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Exposed chain tool generates zig-zag segments during dragging."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Placed iron-pentacarbonyl from the built-in structure library."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Functional groups have expand, contract and remove-abbreviation context actions."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Reachable atom-properties dialog supports labels, charges and isotopes."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L166",
          "note": "Custom toolbar provides radical and diradical tools."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L172",
          "note": "Hover bonds or atoms and press numbered keys."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Sketcher supports lasso; resizing is documented for Canvas objects."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Forward works; Canvas start arrowhead points inward.",
          "shot": {
            "image": "evidence/chemthistry/f-reaction-arrows.webp",
            "caption": "Straight and curved arrows on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Created editable curved Canvas arc with a full arrowhead.",
          "shot": {
            "image": "evidence/chemthistry/f-mechanism-arrows.webp",
            "caption": "A curved arrow selected on the canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/README.md#L26-L29",
          "note": "Ketcher reaction editor imports chemical RXN files."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Sketcher help explicitly lists reaction mapping."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L170",
          "note": "Sketcher text supports font choices, subscripts and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Canvas arcs, paths, and arrows created and edited.",
          "shot": {
            "image": "evidence/chemthistry/f-shapes.webp",
            "caption": "A selected curved arc and straight arrows on the canvas."
          }
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Canvas aligns and distributes selected objects horizontally or vertically."
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Canvas supports grouping and ungrouping with keyboard shortcuts."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Exposed Clean Up command invokes the structure service.",
          "engine": {
            "library": "Indigo (WebAssembly via ketcher-standalone)",
            "source": "https://app.chemthistry.com/assets/Sketcher.js"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L244",
          "note": "Sketcher includes ACS 1996 bond and font styling."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Settings JSON saves bond dimensions and font sizes."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Canvas objects have individual fill and stroke colors."
        },
        "pages": {
          "status": "yes",
          "evidence": "source",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Articler supports A4/Letter sizes, margins, page breaks and multiple pages."
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Canvas imports PNG, JPEG and SVG images."
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L150-L154",
          "note": "Canvas tables have configurable rows and columns with editable text."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L168",
          "note": "Sketcher Check reports structure issues.",
          "engine": {
            "library": "Ketcher (TypeScript valence model) and Indigo (WebAssembly structure checks)",
            "source": "https://app.chemthistry.com/assets/Sketcher.js"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "source",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Calculate CIP returns atom R/S and bond E/Z descriptors.",
          "engine": {
            "library": "Indigo (WebAssembly via ketcher-standalone)",
            "source": "https://app.chemthistry.com/assets/Sketcher.js"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Caffeine formula, molecular weight, isotope masses, and composition calculated.",
          "shot": {
            "image": "evidence/chemthistry/f-formula-mass.webp",
            "caption": "Calculated molecular weight, isotope masses, composition and formula."
          },
          "engine": {
            "library": "Indigo (WebAssembly via ketcher-standalone)",
            "source": "https://app.chemthistry.com/assets/Sketcher.js"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Entering benzene into the input field generated benzene.",
          "shot": {
            "image": "evidence/chemthistry/f-name-to-structure.webp",
            "caption": "Benzene entered in the input field with its structure displayed."
          }
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming output found in menus, context actions, or Extra Info."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Sketcher provides generic R-group markers and reaction mapping."
        },
        "polymers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Attach S-Group supports SRU labels and repeat-unit connectivity."
        },
        "biomolecules": {
          "status": "no",
          "evidence": "source",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Ketcher's macromolecule editor is explicitly disabled."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "Cholesterol generated from SMILES; Spin visibly rotated the model.",
          "shot": {
            "image": "evidence/chemthistry/f-model-3d.webp",
            "caption": "A ball-and-stick cholesterol model in the molecular viewer."
          },
          "engine": {
            "library": "3Dmol.js (browser library)",
            "source": "https://app.chemthistry.com/assets/Moleculer.js"
          }
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "CIF import supports unit cells, symmetry expansion and supercells."
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L244",
          "note": "Ethanol CDXML import works; no export command found.",
          "shot": {
            "image": "evidence/chemthistry/f-cdxml.webp",
            "caption": "Ethanol structure and a CDXML import message."
          },
          "engine": {
            "library": "Indigo (WebAssembly CDXML import via ketcher-standalone)",
            "source": "https://app.chemthistry.com/assets/Sketcher.js"
          }
        },
        "cdx": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L244",
          "note": "CDX import documented; export unverified.",
          "engine": {
            "library": "Indigo (WebAssembly CDX import via ketcher-standalone)",
            "source": "https://app.chemthistry.com/assets/Sketcher.js"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "MOL read/write and cholesterol SDF import succeeded.",
          "shot": {
            "image": "evidence/chemthistry/f-mol-sdf.webp",
            "caption": "A molecular model with SDF shown as its format."
          },
          "engine": {
            "library": "Ketcher (TypeScript/JavaScript MOL V2000 serializer) and Indigo (WebAssembly MOL V3000/SDF conversion)",
            "source": "https://app.chemthistry.com/assets/Sketcher.js"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/index.js",
          "note": "SMILES import and Extra Info clipboard output verified.",
          "shot": {
            "image": "evidence/chemthistry/f-smiles.webp",
            "caption": "A caffeine structure and its loaded SMILES string."
          },
          "engine": {
            "library": "Indigo (WebAssembly via ketcher-standalone)",
            "source": "https://app.chemthistry.com/assets/Sketcher.js"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/README.md#L28",
          "note": "InChI import is documented.",
          "engine": {
            "library": "Indigo (WebAssembly via ketcher-standalone)",
            "source": "https://app.chemthistry.com/assets/Sketcher.js"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/README.md#L28",
          "note": "RXN file import is documented."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/README.md#L26-L29",
          "note": "Caffeine and paclitaxel SVG exports saved with default settings."
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/docs/AGENT_GUIDE.md#L215-L225",
          "note": "Valid vector PDF saved after write EPIPE alert."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://app.chemthistry.com/assets/Canvas.js",
          "note": "PNG works; Canvas default 300 DPI lacks embedded DPI metadata.",
          "shot": {
            "image": "evidence/chemthistry/f-png-export.webp",
            "caption": "A ball-and-stick molecular model in the PNG output."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L24",
          "note": "PowerPoint insertion uses PNG, without editable chemical structure data."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/docs/AGENT_GUIDE.md#L325-L356",
          "note": "Documented in-app plugin API; public repository omits implementation."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/docs/AGENT_GUIDE.md#L235-L298",
          "note": "Documented MCP server reads and writes offline .ctt project files."
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/docs/AGENT_GUIDE.md#L325-L356",
          "note": "Registers commands, viewers, export formats and menu contributions."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/README.md",
          "note": "Hosted app lacks framing restrictions; supported iframe integration remains undocumented."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/docs/AGENT_GUIDE.md#L55-L79",
          "note": "Requires a user-configured model endpoint and API key."
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/CHANGELOG.md#L24",
          "note": "PowerPoint export inserts PNG pictures through Office COM, not OLE objects."
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://app.chemthistry.com/assets/Sketcher.js",
          "note": "Context-menu atom/bond highlights display; SVG and PNG exports omit them."
        }
      },
      "caveats": [
        "Full application source and documented MCP/plugin implementation files are not publicly released.",
        "Desktop installers are unsigned and unnotarized.",
        "3D optimization and some vector exports require an optional Python sidecar."
      ],
      "github": {
        "url": "https://github.com/thisThisYoung/ChemThisTry",
        "stars": 14,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-07-14",
        "commits": 19,
        "contributors": 2,
        "pushedAt": "2026-10-20T02:52:19Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.1.6",
        "canvas": "evidence/chemthistry/canvas.webp",
        "canvasLight": "evidence/chemthistry/canvas-light.webp",
        "canvasDark": "evidence/chemthistry/canvas-dark.webp",
        "memory": {
          "idleMb": 1558.16,
          "paclitaxelMb": 1582.32,
          "baselineMb": null,
          "rssIdleMb": 1095.89,
          "rssPaclitaxelMb": 1129.64,
          "runs": 3,
          "processes": 4,
          "method": "Three fresh Electron launches; summed process-tree phys_footprint medians, MiB; SMILES Load; 10-second settles.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "ChemThisTry-0.1.6-arm64.dmg",
        "ran": true,
        "failure": null,
        "downloadBytes": 281393462,
        "installedBytes": 912351232,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemthistry/simple.svg",
            "note": "Current Kekulé SMILES loaded; automatic geometry and default SVG retained.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemthistry/complex.svg",
            "note": "Current Kekulé SMILES loaded; automatic geometry, wedge/hash bonds, and stereochemistry labels retained.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemthistry/threed.png",
            "note": "SMILES generated ball-and-stick 3D model; default PNG cropped to remove transparent margins.",
            "structure": null
          }
        ],
        "observations": [
          "Default 2D drawings color nitrogen blue and oxygen red.",
          "SMILES layouts use aromatic circles and display abs stereochemistry labels.",
          "Cholesterol generated a ball-and-stick 3D model with explicit hydrogens.",
          "RDKit sidecar reported missing numpy; editing and 3D generation still worked.",
          "PDF export raised write EPIPE before saving a valid vector PDF.",
          "Current Kekulé SMILES produce explicit double bonds in caffeine and paclitaxel drawings.",
          "Moleculer exposes no MOL or SMILES export; removed the previous 2D threed-out.mol from this capture set."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 450,
        "idleMb": 257,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 281393462,
      "references": [
        "https://github.com/thisThisYoung/ChemThisTry",
        "https://github.com/thisThisYoung/ChemThisTry/blob/83c75d6ec69f2e857aea87e19b3ef5bd7ee59972/README.md"
      ]
    },
    {
      "id": "p71",
      "slug": "chematic-draw",
      "name": "Chematic Draw",
      "rank": 13,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/canvas/MoleculeCanvas.tsx#L198",
        "note": "Custom Canvas 2D editor; chemistry uses the author's chematic Rust/WASM toolkit."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Chematic CanvasRenderer and SVG renderers",
        "language": "TypeScript",
        "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/electron/src/renderer/components/canvas/CanvasRenderer.ts#L247"
      },
      "enginesChecked": true,
      "languageNote": "HTML bootstraps React; Shell handles tooling.",
      "video": null,
      "embedding": {
        "methods": [
          "web component"
        ],
        "package": "@chematic/web",
        "limit": "Unpublished source package; basic editing only; host supplies controls.",
        "how": "Bundle @chematic/web/editor-element; call defineSchematicMoleculeEditorElement(); use <chematic-molecule-editor interaction=\"draw\">; listen for molecule-change."
      },
      "otherLanguages": [
        {
          "language": "Rust",
          "role": "WebAssembly chemistry and SVG depiction"
        },
        {
          "language": "JavaScript",
          "role": "ChemSpider remote API host adapter"
        }
      ],
      "thirdParty": {
        "summary": "Electron/Chromium notices list LGPL/MPL/APSL/EPL copyleft, OFL-1.1 fonts, and EasyList data under GPL-3.0-or-later OR CC-BY-SA-3.0-or-later.",
        "source": "https://github.com/electron/electron/releases/download/v44.3.0/electron-v44.3.0-linux-x64.zip",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "A substantive desktop editor draws molecules, annotations and reaction documents with vector exports, although publication layout and ChemDraw interchange have limits.",
      "summary": "Desktop chemical structure editor for drawing molecules and reaction schemes and exporting chemical files and figures.",
      "website": "https://chematic.io/draw/",
      "repo": "https://github.com/kent-tokyo/chematic-draw",
      "docs": "https://github.com/kent-tokyo/chematic-draw/blob/main/docs/README.md",
      "vendor": "Kentaro Tanabe (kent-tokyo)",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT, as declared in the application manifest.",
        "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/package.json#L41"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/kent-tokyo/chematic-draw/releases/tag/v1.0.14"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v1.0.14",
        "date": "2026-10-03",
        "source": "https://github.com/kent-tokyo/chematic-draw/releases/tag/v1.0.14"
      },
      "engine": {
        "rendering": "Custom HTML Canvas 2D on screen; chematic SVG depiction for exports, with Electron printToPDF for PDF.",
        "chemistry": "chematic Rust toolkit compiled to WebAssembly; v1.0.31 in release v1.0.14.",
        "ui": "Electron and React",
        "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/ARCHITECTURE.md"
      },
      "languages": [
        "TypeScript",
        "Rust",
        "JavaScript",
        "CSS"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/sidebar/InspectorPanel.tsx#L819",
          "note": "Keyboard added nitrogen bonded to carbon; templates contained multiple bonds.",
          "shot": {
            "image": "evidence/chematic-draw/f-bonds-core.webp",
            "caption": "Bond tools and a structure with single and double bonds."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/canvas/CanvasRenderer.ts#L247",
          "note": "Wedge tool selected; stereochemical SMILES exported without stereo."
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/lib/documentCommands.ts#L65",
          "note": "Accepted bond orders are single, double, triple and aromatic."
        },
        "double-bond-side": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/canvas/CanvasRenderer.ts#L297",
          "note": "Double bonds are always centered."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/hooks/useCanvasInteraction.ts#L273",
          "note": "Benzene template inserted a six-membered ring.",
          "shot": {
            "image": "evidence/chematic-draw/f-rings.webp",
            "caption": "Ring tools beside a structure containing several rings."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/TUTORIAL.md#draw-or-import",
          "note": "Inserted benzene from Templates panel."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/sidebar/InspectorPanel.tsx#L710",
          "note": "Keyboard added a nitrogen atom.",
          "shot": {
            "image": "evidence/chematic-draw/f-atom-labels.webp",
            "caption": "Atom properties show element, charge, and isotope controls."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/hooks/useCanvasInteraction.ts#L427",
          "note": "Shift+N added a bonded atom."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/lib/selectionTransforms.ts#L19",
          "note": "Rectangular selection, rotation and flips; no resize transform."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/sidebar/ReactionStepEditor.tsx#L72",
          "note": "Selected arrow tool; canvas click did not place an arrow."
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/sidebar/MechanismPanel.tsx#L64",
          "note": "Add Arrow entered source selection; no completed arrow verified."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/INTEROP.md#query-and-reaction-boundary",
          "note": "Reaction JSON preserves steps; RXN V2000 supports one step."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/sidebar/InspectorPanel.tsx#L773",
          "note": "Atom-map numbers can be assigned manually."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/canvas/CanvasRenderer.ts#L185",
          "note": "Plain text annotations only; fixed font without subscript/superscript controls."
        },
        "shapes": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/hooks/useCanvasInteraction.ts#L295",
          "note": "Text, arrows and brackets; no general shape or curve tools."
        },
        "align": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/lib/selectionTransforms.ts#L9",
          "note": "Aligns/distributes selected atoms; no whole-object layout."
        },
        "groups": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/MIGRATION.md#from-chemdraw",
          "note": "Group controls are inactive; imported groups have limited editing."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/MIGRATION.md#from-chemdraw",
          "note": "Clean Up Structure command is available.",
          "engine": {
            "library": "In-house (chematic-depict, Rust/WebAssembly compute_layout)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/crates/chem-wasm/src/lib.rs#L399"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/MIGRATION.md#from-chemdraw",
          "note": "Colors controls are inactive."
        },
        "pages": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/KNOWN_LIMITATIONS.md",
          "note": "CDXML multipage interchange; page-layout editing is not established."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/crates/chem-wasm/src/lib.rs#L635",
          "note": "Validates chemical valence and reports structure errors.",
          "shot": {
            "image": "evidence/chematic-draw/f-valence-check.webp",
            "caption": "The validation panel reports no errors beside a structure."
          },
          "engine": {
            "library": "In-house (chematic-core and chematic-perception, Rust/WebAssembly; bridge structural validation)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/crates/chem-wasm/src/lib.rs#L639"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/crates/chem-wasm/src/lib.rs#L740",
          "note": "Computes R/S and E/Z; ambiguous assignments are omitted.",
          "engine": {
            "library": "In-house (chematic-chem, Rust/WebAssembly assign_cip R/S and E/Z)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/crates/chem-wasm/src/lib.rs#L743"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/crates/chem-wasm/src/lib.rs#L430",
          "note": "Caffeine showed C8H10N4O2 and 194.19.",
          "engine": {
            "library": "In-house (chematic-core and chematic-chem, Rust/WebAssembly)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/crates/chem-wasm/src/lib.rs#L432"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/crates/chem-wasm/src/lib.rs#L442",
          "note": "Property panel displayed MW, LogP, and ring count.",
          "engine": {
            "library": "Ported from RDKit (Crippen SMARTS data in chematic-chem, Rust/WebAssembly); In-house (Ertl TPSA)",
            "source": "https://github.com/kent-tokyo/chematic/blob/698b9aede83ed5b64534c4660505fcc10c35150e/crates/chematic-chem/src/descriptors.rs#L1214"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/lib/chemspiderProvider.cjs#L74",
          "note": "Desktop ChemSpider lookup requires configured API access and network.",
          "engine": {
            "library": "ChemSpider Compounds API (remote HTTPS/JSON; host API key and attribution opt-in required)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/electron/src/lib/chemspiderProvider.cjs#L74"
          }
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/crates/chem-wasm/src/lib.rs#L481",
          "note": "Research identifiers showed an empty IUPAC Name field.",
          "engine": {
            "library": "In-house (chematic-iupac, Rust/WebAssembly; limited-scope IUPAC naming)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/crates/chem-wasm/src/lib.rs#L483"
          }
        },
        "nmr-prediction": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/KNOWN_LIMITATIONS.md",
          "note": "Prediction is explicitly unimplemented; peak import and manual annotation exist."
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/INTEROP.md#query-and-reaction-boundary",
          "note": "Supports atom lists, wildcards, Markush and R-group query data."
        },
        "polymers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/lib/specialChemistry.ts#L84",
          "note": "Semantic repeat units support bounded two-attachment expansion."
        },
        "biomolecules": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/sidebar/InspectorPanel.tsx#L496",
          "note": "Nucleic-acid residue metadata editing; no sequence-to-structure builder established."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/lib/advancedFeatures.ts#L175",
          "note": "Fetches importable SMILES; approximate InChIKeys can miss PubChem matches.",
          "engine": {
            "library": "PubChem PUG REST (remote InChIKey lookup); ChemSpider Compounds API (remote name search, configured host required)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/electron/src/renderer/components/sidebar/DatabaseSearchPanel.tsx#L81"
          }
        },
        "model-3d": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/sidebar/Viewer3DPanel.tsx#L51",
          "note": "Generated cholesterol model; viewport clipped it severely.",
          "shot": {
            "image": "evidence/chematic-draw/f-model-3d.webp",
            "caption": "The 3D panel displays a clipped molecular model."
          },
          "engine": {
            "library": "In-house (chematic-3d, Rust/WebAssembly rule-based coordinates and minimization; TypeScript Canvas viewer)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/electron/src/renderer/components/sidebar/Viewer3DPanel.tsx#L49"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/INTEROP.md",
          "note": "Reads/writes a subset; advanced presentation is not preserved losslessly.",
          "engine": {
            "library": "In-house (chematic-mol Rust/WebAssembly import; TypeScript subset export and source-preserving patching)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/electron/src/renderer/hooks/useDocumentFileActions.ts#L27"
          }
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/INTEROP.md",
          "note": "MOL export worked; Open dialog disabled fixture MOL and SDF.",
          "shot": {
            "image": "evidence/chematic-draw/f-mol-sdf.webp",
            "caption": "The downloads list includes a completed MOL file."
          },
          "engine": {
            "library": "In-house (chematic-mol, Rust/WebAssembly MOL V2000/V3000 and SDF; first SDF record imported)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/crates/chem-wasm/src/lib.rs#L336"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/INTEROP.md",
          "note": "Paste and export worked; cholesterol export lost stereochemistry.",
          "engine": {
            "library": "In-house (chematic-smiles, Rust/WebAssembly parser and standard/canonical writers)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/crates/chem-wasm/src/lib.rs#L318"
          }
        },
        "inchi": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/crates/chem-wasm/src/lib.rs#L763",
          "note": "Research panel displayed explicitly approximate InChI and derived InChIKey.",
          "engine": {
            "library": "In-house (chematic-inchi, Rust/WebAssembly InChI-like approximation; not reference InChI)",
            "source": "https://github.com/kent-tokyo/chematic-draw/blob/fcd174480895fdb39861dd67434406ab7c2cc254/crates/chem-wasm/src/lib.rs#L763"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/INTEROP.md#query-and-reaction-boundary",
          "note": "One-step RXN V2000; agents and coefficients require loss confirmation."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/INTEROP.md",
          "note": "SVG downloaded for caffeine, paclitaxel, and cholesterol.",
          "shot": {
            "image": "evidence/chematic-draw/f-svg-export.webp",
            "caption": "The downloads list includes completed SVG files."
          }
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/lib/ipcFileHandlers.ts#L92",
          "note": "Export shortcut referred to unavailable File menu; no PDF control."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/lib/svgToPng.ts#L11",
          "note": "PNG downloaded for caffeine.",
          "shot": {
            "image": "evidence/chematic-draw/f-png-export.webp",
            "caption": "The downloads list includes a completed PNG file."
          }
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/lib/ipcClipboardAutosave.ts#L34",
          "note": "Clipboard accepts text/plain only; native ChemDraw objects are unsupported."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/API.md",
          "note": "Documented TypeScript/WASM bridge and public Web Component package."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/docs/KNOWN_LIMITATIONS.md",
          "note": "In-process extension registration only; third-party bundle loading is disabled."
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/main/packages/chematic-web/README.md",
          "note": "Unpublished source package; basic editing only; host supplies controls."
        },
        "ai-assistant": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/sidebar/ChatPanel.tsx#L9",
          "note": "Chat only answers keyword queries; cannot propose or edit drawings."
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/kent-tokyo/chematic-draw/blob/93457396bb158d8d2b402e0b11b518431ac15c09/electron/src/renderer/components/canvas/CanvasRenderer.ts#L367-L402",
          "note": "Orange atom selection backgrounds only; exports omit them."
        }
      },
      "caveats": [
        "CDXML exchange covers a subset; advanced presentation can be lost.",
        "InChI generation is approximate; PubChem lookup can miss existing compounds.",
        "Publication layout needs manual review; PNG export has no DPI control."
      ],
      "github": {
        "url": "https://github.com/kent-tokyo/chematic-draw",
        "stars": 3,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-06-06",
        "commits": 352,
        "contributors": 1,
        "pushedAt": "2026-10-08T12:54:51Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "chematic 1.0.38 (build inde…",
        "canvas": "evidence/chematic-draw/canvas.webp",
        "canvasLight": "evidence/chematic-draw/canvas-light.webp",
        "canvasDark": "evidence/chematic-draw/canvas-dark.webp",
        "memory": {
          "idleMb": 297,
          "paclitaxelMb": 308,
          "baselineMb": 201,
          "rssIdleMb": 861.67,
          "rssPaclitaxelMb": 895.53,
          "runs": 3,
          "processes": 6,
          "method": "Playwright Chromium process-tree physical footprints; blank baseline; pasted SMILES.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://kent-tokyo.github.io/chematic-draw/playground/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chematic-draw/simple.svg",
            "note": "Caffeine connectivity survived MOL export; default dark canvas has low-contrast labels.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chematic-draw/complex.svg",
            "note": "MOL export omitted input stereochemistry; drawing contains no stereo wedges.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "failed",
            "input": "smiles",
            "image": "evidence/chematic-draw/threed.png",
            "note": "Generated model is severely clipped in 3D viewport; stereochemistry omitted from exports.",
            "structure": "stereo"
          }
        ],
        "observations": [
          "Tested the hosted playground, not the richer desktop application.",
          "Default dark canvas used black labels with poor contrast.",
          "Fit enlarged caffeine enough to clip a label; zooming out revealed it.",
          "Paclitaxel and cholesterol MOL exports lost input stereochemistry.",
          "Cholesterol SMILES export also lost stereochemistry; 3D viewport clipped the model."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 91,
        "transferBytes": 1418037
      },
      "downloadBytes": 127512050,
      "references": [
        "https://github.com/kent-tokyo/chematic-draw",
        "https://chematic.io/draw/",
        "https://raw.githubusercontent.com/kent-tokyo/chematic-draw/main/README.md"
      ]
    },
    {
      "id": "p129",
      "slug": "molecule-lab",
      "name": "Molecule Lab (The Freshman Mole)",
      "rank": 14,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Kekule.js Composer",
        "libraries": [
          "Kekule.js",
          "RDKit",
          "Open Babel",
          "3Dmol.js"
        ],
        "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95",
        "note": "Mounts Kekule.js Composer; adds RDKit validation, Open Babel conformers, and 3Dmol.js viewing."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Kekule.js canvas; in-house SVG renderer",
        "language": "JavaScript",
        "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95"
      },
      "enginesChecked": true,
      "languageNote": "HTML and CSS provide interface markup and styling.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "No embed documentation; headers alone cannot confirm iframe support."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "RDKit and Open Babel WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": "Includes GPL-2.0 (Open Babel) and GPL-noticed chemistry data; MIT/BSD components include GLmol with an LGPL-3.0 alternative.",
        "source": "https://github.com/openbabel/openbabel/blob/openbabel-3-1-1/COPYING",
        "notice": null,
        "libraries": [
          {
            "name": "Kekule.js",
            "license": "MIT",
            "source": "https://github.com/partridgejiang/Kekule.js/blob/master/LICENSE"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "Open Babel",
            "license": "GPL-2.0-only",
            "source": "https://github.com/openbabel/openbabel/blob/master/COPYING"
          },
          {
            "name": "3Dmol.js",
            "license": "BSD-3-Clause",
            "source": "https://github.com/3dmol/3Dmol.js/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It supports 2D reaction figures with captions, layout tools, editable projects and vector SVG export.",
      "summary": "A free browser editor for 2D chemical structures, reaction schemes and interactive 3D molecular models.",
      "website": "https://total-synthesis.com/molecule-drawing-tool/",
      "repo": null,
      "docs": "https://total-synthesis.com/molecule-drawing-tool/",
      "vendor": "The Freshman Mole / Total Synthesis",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free hosted tool; redistribution terms unspecified.",
        "source": "https://total-synthesis.com/molecule-drawing-tool/"
      },
      "price": {
        "text": "Free",
        "source": "https://total-synthesis.com/molecule-drawing-tool/"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://total-synthesis.com/molecule-drawing-tool/"
      },
      "engine": {
        "rendering": "Kekule.js 2D canvas renderer; custom SVG exporter with HTML canvas PNG rasterization; Three.js and 3Dmol.js for 3D.",
        "chemistry": "Kekule.js; RDKit.js for validation and stereochemistry; Open Babel for 3D conformer generation.",
        "ui": "Kekule.js widgets and custom JavaScript/HTML controls.",
        "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "Drew single, double, and triple bonds.",
          "shot": {
            "image": "evidence/molecule-lab/f-bonds-core.webp",
            "caption": "Single, double, and triple bond tools below the drawing."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "Drew solid and hashed wedges; wavy untested.",
          "shot": {
            "image": "evidence/molecule-lab/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedges in the drawing and bond toolbar."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "Placed cyclohexane; aromatic ring tool also visible.",
          "shot": {
            "image": "evidence/molecule-lab/f-rings.webp",
            "caption": "Aromatic rings on the canvas beside the ring tool."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95",
          "note": "Native chair and Haworth ring tools are retained."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/3151bf05159076067c610f5a61e38c458d6f78a7/src/widgets/chem/editor/kekule.chemEditor.chemSpaceEditors.js#L5502",
          "note": "Native flexible-chain tool adjusts atom count while dragging."
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "Boc placement added atoms but displayed an error and no drawing."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/atom-label-edit-1.88.64.js?ver=1.88.95",
          "note": "Elements, charges and isotopes use native Atom controls."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95",
          "note": "Radical and electron-pair tools are enabled."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95",
          "note": "Lasso selection, rotation, flip and scale tools are enabled."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "Drew forward and equilibrium arrows."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/3151bf05159076067c610f5a61e38c458d6f78a7/src/widgets/chem/editor/kekule.chemEditor.actions.js#L3046",
          "note": "Drew full-head and single-electron curved arrows."
        },
        "reaction-data": {
          "status": "partial",
          "evidence": "source",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/chem-io.js?ver=1.88.95",
          "note": "CDXML reaction steps require one horizontal arrow and one row."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/3151bf05159076067c610f5a61e38c458d6f78a7/src/widgets/chem/editor/kekule.chemEditor.actions.js#L3108",
          "note": "Enabled glyph palette includes plus, heat and light symbols."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/3151bf05159076067c610f5a61e38c458d6f78a7/src/widgets/chem/editor/kekule.chemEditor.actions.js#L3108",
          "note": "Enabled glyph tools provide editable line segments and curves."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": null,
          "engine": {
            "library": "In-house (JavaScript); RDKit.js (WebAssembly, complex-ring coordinates)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/structure-cleanup-1.88.17.js?ver=1.88.95"
          }
        },
        "journal-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/acs-drawing-style.js?ver=1.88.95",
          "note": "ACS-inspired publication defaults only."
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": null,
          "engine": {
            "library": "RDKit.js (WebAssembly sanitization); In-house (JavaScript advisories)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/chemical-validation-core-1.88.17.js?ver=1.88.95"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "source",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/stereo-annotations-1.88.73.js?ver=1.88.95",
          "note": "RDKit computes R/S and E/Z overlays.",
          "engine": {
            "library": "RDKit.js (WebAssembly); In-house (JavaScript geometry-based E/Z preview)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/stereo-annotations-1.88.73.js?ver=1.88.95"
          }
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95",
          "note": "PubChem lookup returned caffeine formula and molecular weight.",
          "engine": {
            "library": "PubChem web service (formula/mass record lookup via site server proxy)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95"
          }
        },
        "properties": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95",
          "note": "PubChem lookup returned XLogP and TPSA.",
          "engine": {
            "library": "PubChem web service (XLogP/TPSA record lookup via site server proxy)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95"
          }
        },
        "name-to-structure": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "Aspirin imported through PubChem name lookup.",
          "engine": {
            "library": "PubChem web service (via site server proxy); Kekule.js (JavaScript SDF reader)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/search-import.js?ver=1.88.95"
          }
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "Caffeine drawing returned PubChem IUPAC name.",
          "engine": {
            "library": "PubChem web service (IUPAC-name record lookup via site server proxy)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "PubChem returned caffeine, paclitaxel, cholesterol, and aspirin.",
          "engine": {
            "library": "PubChem web service (via site server proxy)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/search-import.js?ver=1.88.95"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "PubChem conformer loaded; fresh cubane model rotated by dragging.",
          "shot": {
            "image": "evidence/molecule-lab/f-model-3d.webp",
            "caption": "Ball-and-stick molecular model in the 3D preview."
          },
          "engine": {
            "library": "Kekule.js Viewer3D with Three.js (JavaScript); 3Dmol.js (JavaScript); Open Babel (WebAssembly conformers); PubChem web service (optional conformers)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/cdxml-import.js?ver=1.88.95",
          "note": "Exported caffeine CDXML and reimported its atom and bond text.",
          "engine": {
            "library": "In-house (JavaScript CDXML subset importer/writer); Kekule.js (JavaScript MOL conversion)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/chem-io.js?ver=1.88.95"
          }
        },
        "cdx": {
          "status": "no",
          "evidence": "source",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/cdxml-import.js?ver=1.88.95",
          "note": "Binary CDX import is explicitly rejected."
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95",
          "note": "Exported 3D SDF; no MOL import or export found.",
          "engine": {
            "library": "Kekule.js (JavaScript MOL reader/writer); In-house (JavaScript SDF export)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "PubChem-backed SMILES import and lookup output worked.",
          "engine": {
            "library": "PubChem web service (server-proxied import and record lookup); Kekule.js (JavaScript writer fallback)",
            "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "Exported all three drawings as SVG."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export command in File menu."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/copy-2d-image.js?ver=1.88.95",
          "note": "2D PNG exported; no print DPI control observed.",
          "shot": {
            "image": "evidence/molecule-lab/f-png-export.webp",
            "caption": "PNG output showing a caffeine structure."
          }
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "source",
          "source": "https://total-synthesis.com/wp-content/plugins/total-synthesis-molecule-lab/assets/molecule-lab-1.88.17.js?ver=1.88.95",
          "note": "CDXML-text paste in; copy-out uses PNG."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://total-synthesis.com/molecule-drawing-tool/",
          "note": "No embed documentation; headers alone cannot confirm iframe support."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/3151bf05159076067c610f5a61e38c458d6f78a7/src/widgets/chem/editor/kekule.chemEditor.baseEditors.js#L3187",
          "note": "Selection halos only; SVG and PNG exports omit them."
        }
      },
      "caveats": [
        "Naming, property and SMILES lookups depend on matching PubChem compounds.",
        "CDXML import omits annotations and rejects contracted groups.",
        "SVG export rejects query, coordination and non-Kekulé aromatic bonds."
      ],
      "github": null,
      "hands": {
        "testedVersion": "1.88.95",
        "canvas": "evidence/molecule-lab/canvas.webp",
        "canvasLight": "evidence/molecule-lab/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 827,
          "paclitaxelMb": 845,
          "baselineMb": 435,
          "rssIdleMb": 1679.61,
          "rssPaclitaxelMb": 1431.16,
          "runs": 3,
          "processes": 9,
          "method": "Median Chromium process-tree phys_footprint; PubChem SMILES import; MiB.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Editor remained light under the dark appearance override."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://total-synthesis.com/molecule-drawing-tool/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molecule-lab/simple.svg",
            "note": "PubChem match CID 2519 supplied the drawing.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molecule-lab/complex.svg",
            "note": "PubChem match CID 36314; zoomed out to fit.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molecule-lab/threed.png",
            "note": "PubChem conformer; viewport saved as threed-view.png; local generation timed out.",
            "structure": "match"
          }
        ],
        "observations": [
          "The hosted editor was tested in an isolated WebKit window.",
          "SMILES imports resolve through PubChem and use its 2D structures.",
          "Paclitaxel's default drawing includes crowded overlapping labels.",
          "Local cholesterol 3D generation timed out; PubChem supplied a conformer.",
          "3D PNG export failed with a renderer-size mismatch in WebKit."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 2508,
        "transferBytes": 3570803
      },
      "downloadBytes": null,
      "references": [
        "https://total-synthesis.com/molecule-drawing-tool/",
        "https://total-synthesis.com/molecule-drawing-tool/"
      ]
    },
    {
      "id": "p16",
      "slug": "freechemdraw",
      "name": "FreeChemDraw",
      "rank": 15,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "Ketcher",
          "Indigo",
          "3Dmol.js"
        ],
        "source": "https://freechemdraw.com/en/",
        "note": "Embeds Ketcher 3.18; Indigo handles chemistry and 3Dmol.js displays 3D structures."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher SVG/Raphaël; Indigo generated images",
        "language": "TypeScript",
        "source": "https://freechemdraw.com/ketcher-3.18.0/static/js/main.e47c48ad.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "file",
        "url": "https://freechemdraw.com/upload/mediatext/videos/freechemdraw-workspace-update-name-3d-search-v2_20260902004857_0c98694e.mp4",
        "embed": null,
        "title": "FreeChemDraw Feature Demo",
        "author": null,
        "linkedFrom": "https://freechemdraw.com/en/",
        "poster": null
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "X-Frame-Options SAMEORIGIN",
        "how": "Hosted editor blocks external iframes; no documented embedding SDK."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Workspace and 3Dmol.js viewer"
        },
        {
          "language": "C++",
          "role": "Indigo WebAssembly chemistry and image rendering"
        },
        {
          "language": "C",
          "role": "InChI via Indigo WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": "Server-side OSRA has GPL-2.0-or-later components; Font Awesome icons/fonts use CC-BY-4.0/OFL-1.1. Ketcher upstream NOTICE also lists LGPL-2.1, MPL-1.0 and AFL-3.0 dependencies without component mapping.",
        "source": "https://sourceforge.net/p/osra/wiki/License/",
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "3Dmol.js",
            "license": "BSD-3-Clause",
            "source": "https://github.com/3dmol/3Dmol.js/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Users can compose 2D structures and reaction schemes with text and export vector SVG figures.",
      "summary": "A free browser workspace for drawing chemical structures and reactions, converting names, calculating properties, and exporting figures.",
      "website": "https://freechemdraw.com/en/",
      "repo": null,
      "docs": "https://freechemdraw.com/en/",
      "vendor": "FreeChemDraw",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free hosted service under proprietary site terms; generated drawings may be used commercially.",
        "source": "https://freechemdraw.com/en/terms/"
      },
      "price": {
        "text": "Free",
        "source": "https://freechemdraw.com/en/"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://freechemdraw.com/en/"
      },
      "engine": {
        "rendering": "Ketcher SVG/Raphael editor; Indigo image rendering",
        "chemistry": "Indigo (embedded Ketcher editor)",
        "ui": "React (embedded Ketcher 3.18.0)",
        "source": "https://freechemdraw.com/ketcher-3.18.0/static/js/main.e47c48ad.js"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-bonds",
          "note": "Drew separate single, double, and triple bonds.",
          "shot": {
            "image": "evidence/freechemdraw/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/freechemdraw/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts",
          "note": "Dative and hydrogen bond tools."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Placed benzene and cyclohexane with ring tools.",
          "shot": {
            "image": "evidence/freechemdraw/f-rings.webp",
            "caption": "Benzene and cyclohexane rings on the drawing canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/templates/library.sdf#L8231",
          "note": "Built-in chair and boat templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/editor/tool/chain.ts",
          "note": "Dragging determines chain length."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Selected and placed D-alanine from structure library.",
          "shot": {
            "image": "evidence/freechemdraw/f-templates.webp",
            "caption": "Structure library showing template categories and amino acid structures."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Save to Templates creates reusable user templates.",
          "shot": {
            "image": "evidence/freechemdraw/f-custom-templates.webp",
            "caption": "Save Structure dialog with a Save to Templates button."
          }
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#expandingcontracting-s-group",
          "note": "Functional groups expand, contract and retain underlying chemistry."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/data/schema/struct-schema.ts",
          "note": "Editable charge, isotope, element, pseudoatom and alias fields."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/data/schema/struct-schema.ts",
          "note": "Monoradical and singlet/triplet diradical atom properties."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/state/handleHotkeysOverItem.ts",
          "note": "Hotkeys alter hovered atoms, charges and atom properties."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/editor/tool/select/select.ts",
          "note": "Lasso, rotate and flip; resizing limited to graphical objects."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/leftToolbarOptions.ts",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/freechemdraw/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the drawing canvas."
          }
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/leftToolbarOptions.ts",
          "note": "Drew curved full-head arrow; editing was not verified.",
          "shot": {
            "image": "evidence/freechemdraw/f-mechanism-arrows.webp",
            "caption": "Curved arrow on the drawing canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#reaction-specific-format-support",
          "note": "Embedded Ketcher preserves reactants, products and reagents in reaction formats.",
          "shot": {
            "image": "evidence/freechemdraw/f-reaction-data.webp",
            "caption": "Save Structure dialog with MDL Rxnfile V2000 selected."
          }
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-reactions",
          "note": "Embedded Ketcher offers manual mapping, automatic mapping and unmapping."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#adding-text-objects-on-the-canvas",
          "note": "Editable text supports styling, subscripts and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-graphical-objects",
          "note": "Ellipse, rectangle and line tools; chemical S-group brackets.",
          "shot": {
            "image": "evidence/freechemdraw/f-shapes.webp",
            "caption": "Shape tool menu with ellipse, rectangle and line icons."
          }
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#ketcher-molecules-mode",
          "note": "Clean Up assigns uniform bond lengths and angles.",
          "engine": {
            "library": "Indigo (WebAssembly through embedded Ketcher 3.18.0)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L228"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://freechemdraw.com/en/acs-chemical-drawing-style/",
          "note": "ACS preset applies coordinated bond, font and spacing settings.",
          "shot": {
            "image": "evidence/freechemdraw/f-journal-styles.webp",
            "caption": "Benzoic acid drawing with Default and ACS style options."
          }
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/modal/components/meta/Settings/Settings.tsx",
          "note": "Bond and font settings can be saved and reloaded as files."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Individual atoms and bonds support eight highlighting colors."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#adding-images-on-the-canvas",
          "note": "PNG and SVG images can be placed on the canvas."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-atoms",
          "note": "Embedded Ketcher underlines atoms with incorrect valence in red.",
          "shot": {
            "image": "evidence/freechemdraw/f-valence-check.webp",
            "caption": "Settings dialog with Show valence warnings enabled."
          },
          "engine": {
            "library": "Ketcher TypeScript valence rules; Indigo WebAssembly full structure checker",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/domain/entities/atom.ts#L447"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#stereochemistry",
          "note": "Embedded Ketcher computes R/S, r/s and E/Z descriptors.",
          "engine": {
            "library": "Indigo (WebAssembly CIP calculation through Ketcher)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L175"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://freechemdraw.com/en/molecular-properties-calculator/",
          "note": "Ethanol showed C2H6O, 46.069 molecular weight, 46.042 exact mass.",
          "shot": {
            "image": "evidence/freechemdraw/f-formula-mass.webp",
            "caption": "Calculated molecular formula, molecular weight and exact mass."
          },
          "engine": {
            "library": "Indigo (WebAssembly in Ketcher Calculate dialog; separate live-property-strip server engine undisclosed)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L190"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://freechemdraw.com/en/molecular-properties-calculator/",
          "note": "Ethanol showed TPSA 20.23 and LogP -0.001.",
          "shot": {
            "image": "evidence/freechemdraw/f-properties.webp",
            "caption": "Calculated TPSA and LogP in the molecular properties results."
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://freechemdraw.com/en/name-to-structure/",
          "note": "Ethanol and systematic aspirin name worked; aspirin alone failed.",
          "shot": {
            "image": "evidence/freechemdraw/f-name-to-structure.webp",
            "caption": "Ethanol name and resulting structure in the editor."
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://freechemdraw.com/en/structure-to-iupac-name/",
          "note": "Ethanol and systematic aspirin structures returned names.",
          "shot": {
            "image": "evidence/freechemdraw/f-structure-to-name.webp",
            "caption": "Ethanol structure and generated IUPAC name."
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-r-groups",
          "note": "Embedded Ketcher supports R-groups, attachment points and R-group logic."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#marking-s-groups",
          "note": "Embedded Ketcher supports SRU polymers, connectivity and copolymer subtypes."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#ketcher-macromolecules-mode",
          "note": "Embedded Ketcher supports peptides, nucleic acids, sequences and monomers."
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://freechemdraw.com/en/chemical-structure-image-recognition/",
          "note": "Recognition produces an editable structure; server processing required.",
          "shot": {
            "image": "evidence/freechemdraw/f-image-to-structure.webp",
            "caption": "Image Recognition panel with upload and Recognize controls."
          }
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://freechemdraw.com/en/chemical-structure-knowledge-base/freechemdraw-workspace-update-name-3d-search/",
          "note": "Searches CAS numbers, formulas and English names through ChemTradeHub.",
          "shot": {
            "image": "evidence/freechemdraw/f-database-lookup.webp",
            "caption": "Structure Lookup search field beside the editor."
          },
          "engine": {
            "library": "ChemTradeHub chemical structure lookup (remote web service through /api/query-chem)",
            "source": "https://freechemdraw.com/"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://freechemdraw.com/en/chemical-structure-knowledge-base/freechemdraw-workspace-update-name-3d-search/",
          "note": "Generated cholesterol model from SMILES and rotated it by dragging.",
          "shot": {
            "image": "evidence/freechemdraw/f-model-3d.webp",
            "caption": "Cholesterol ball-and-stick model with 3D view controls."
          },
          "engine": {
            "library": "3Dmol.js (browser JavaScript/WebGL viewer); 3D coordinates supplied by an undisclosed remote engine",
            "source": "https://freechemdraw.com/"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Exported caffeine CDXML and reopened it in editor.",
          "shot": {
            "image": "evidence/freechemdraw/f-cdxml.webp",
            "caption": "Open structure dialog containing CDXML text."
          },
          "engine": {
            "library": "Indigo (WebAssembly conversion through Ketcher)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L106"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Binary and Base64 CDX through embedded Ketcher in molecule mode.",
          "shot": {
            "image": "evidence/freechemdraw/f-cdx.webp",
            "caption": "Local file upload lists CDX among supported formats."
          },
          "engine": {
            "library": "Indigo (WebAssembly conversion through Ketcher)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L107"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Imported and exported MOL; SDF save option visible.",
          "shot": {
            "image": "evidence/freechemdraw/f-mol-sdf.webp",
            "caption": "Save Structure dialog showing an MDL Molfile preview."
          },
          "engine": {
            "library": "Ketcher TypeScript MolSerializer for ordinary MOL V2000; Indigo WebAssembly for SDF, V3000 and query MOL",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L82"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://freechemdraw.com/en/",
          "note": "Imported caffeine SMILES and copied generated SMILES.",
          "shot": {
            "image": "evidence/freechemdraw/f-smiles.webp",
            "caption": "Benzoic acid structure and its displayed SMILES."
          },
          "engine": {
            "library": "Indigo (WebAssembly conversion/layout through Ketcher)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L102"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Embedded Ketcher supports InChI, AuxInfo and InChIKey.",
          "engine": {
            "library": "InChI through Indigo (WebAssembly conversion through Ketcher)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L98"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/README.md",
          "note": "Embedded Ketcher reads and writes MDL RXN reactions.",
          "shot": {
            "image": "evidence/freechemdraw/f-rxn.webp",
            "caption": "Save Structure dialog with MDL Rxnfile V2000 selected."
          }
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://freechemdraw.com/en/chemical-structure-editor/",
          "note": "Downloaded SVG drawings for all three structures.",
          "shot": {
            "image": "evidence/freechemdraw/f-svg-export.webp",
            "caption": "Benzoic acid drawing with an Export as SVG button."
          }
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF option in editor save or workspace export controls."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/data/schema/options-schema.ts",
          "note": "PNG downloaded at 526×194; high-resolution option untested.",
          "shot": {
            "image": "evidence/freechemdraw/f-png-export.webp",
            "caption": "Benzoic acid drawing with an Export as PNG button."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://freechemdraw.com/en/mcp/",
          "note": "Separate MCP service; editor transfer requires manual SMILES/MOL import.",
          "shot": {
            "image": "evidence/freechemdraw/f-mcp-agents.webp",
            "caption": "FreeChemDraw MCP card and Explore MCP Tools link."
          }
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://freechemdraw.com/en/",
          "note": "Hosted editor blocks external iframes; no documented embedding SDK."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Embedded Ketcher provides eight-color backgrounds behind atoms and bonds."
        }
      },
      "caveats": [
        "Properties, recognition, naming and 3D generation require server processing.",
        "Browser autosave is retained for only 10 minutes.",
        "The ACS preset does not guarantee compliance with journal requirements."
      ],
      "github": null,
      "hands": {
        "testedVersion": "3.18.0",
        "canvas": "evidence/freechemdraw/canvas.webp",
        "canvasLight": "evidence/freechemdraw/canvas-light.webp",
        "canvasDark": "evidence/freechemdraw/canvas-dark.webp",
        "memory": {
          "idleMb": 562.99,
          "paclitaxelMb": 466.94,
          "baselineMb": 49.25,
          "rssIdleMb": 910.11,
          "rssPaclitaxelMb": 858.88,
          "runs": 3,
          "processes": 5,
          "method": "Median Chromium process-tree physical footprints; headless, SMILES import; 10-second waits.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://freechemdraw.com/en/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/freechemdraw/simple.svg",
            "note": "Current caffeine SMILES imported; MOL also saved.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/freechemdraw/complex.svg",
            "note": "Current paclitaxel SMILES imported; MOL also saved.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/freechemdraw/threed.png",
            "note": "Generated rotatable cholesterol 3D model; 2D MOL also saved.",
            "structure": "match"
          }
        ],
        "observations": [
          "About identifies embedded Ketcher 3.18.0; no FreeChemDraw release version shown.",
          "Default caffeine layout uses aromatic circles and colored heteroatoms.",
          "Default cholesterol 3D view shows a ball-and-stick model.",
          "Default PNG carried 72 dpi metadata; editor offers high and low resolution.",
          "Name conversion rejected aspirin but accepted its systematic name.",
          "Current Kekulé caffeine SMILES produced alternating double bonds in the default layout."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 930,
        "transferBytes": 9470619
      },
      "downloadBytes": null,
      "references": [
        "https://freechemdraw.com/en/"
      ]
    },
    {
      "id": "p135",
      "slug": "vibe-sketcher",
      "name": "vibe-sketcher",
      "rank": 16,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "Ketcher",
          "RDKit",
          "Indigo",
          "OPSIN",
          "InChI",
          "CoordGen"
        ],
        "source": "https://vibyverse.com/vibe-sketcher/docs/license.html",
        "note": "Ketcher canvas with Indigo; RDKit server chemistry; OPSIN naming is optional."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher/Raphaël canvas; RDKit/custom SVG exports",
        "language": "TypeScript",
        "source": "https://vibyverse.com/updates/vibe-sketcher/releases/0.6.5/vibe-sketcher-0.6.5-source.tar.gz"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "MPL-2.0",
        "how": "SDK edits documents; editor embedding is unverified."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "Chemistry server and SVG drawing"
        },
        {
          "language": "JavaScript",
          "role": "Electron desktop shell"
        },
        {
          "language": "C++",
          "role": "RDKit and Indigo WebAssembly chemistry"
        },
        {
          "language": "Rust",
          "role": "Publication PNG/PDF conversion via Python"
        }
      ],
      "thirdParty": {
        "summary": "Ketcher/Indigo Apache-2.0; RDKit BSD-3-Clause; React/Electron MIT. Indigo includes InChI 1.06 under LGPL-style IUPAC terms; macOS runtime adds Cairo MPL-1.1 and Eigen MPL-2.0. Telex OFL-1.1 and Roboto Apache-2.0 font notices apply.",
        "source": "https://vibyverse.com/vibe-sketcher/docs/license.html",
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          },
          {
            "name": "CoordGen",
            "license": "BSD-3-Clause",
            "source": "https://github.com/schrodinger/coordgenlibs/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It creates editable 2D structure and reaction documents with journal styles and publication SVG, PDF and high-resolution PNG exports.",
      "summary": "A 2D chemical structure and reaction editor for publication figures and computational chemistry input preparation.",
      "website": "https://vibyverse.com/vibe-sketcher",
      "repo": null,
      "docs": "https://vibyverse.com/vibe-sketcher/docs/index.html",
      "vendor": "Michael F. Peintinger",
      "license": {
        "kind": "open-source",
        "spdx": "MPL-2.0",
        "text": "Mozilla Public License 2.0; matching release source is downloadable.",
        "source": "https://vibyverse.com/vibe-sketcher/docs/license.html"
      },
      "price": {
        "text": "Free (public desktop downloads and source; 2026-11-05)",
        "source": "https://vibyverse.com/download/"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "0.6.5",
        "date": "2026-11-03",
        "source": "https://vibyverse.com/vibe-sketcher/docs/changelog.html"
      },
      "engine": {
        "rendering": "Ketcher's canvas renderer; RDKit and custom SVG exports; resvg PNG and svg2pdf PDF.",
        "chemistry": "RDKit on the server; Indigo WebAssembly in Ketcher.",
        "ui": "TypeScript shell with React/Ketcher; Electron desktop shell.",
        "source": "https://vibyverse.com/vibe-sketcher/docs/license.html"
      },
      "languages": [
        "Python",
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Drew single, double, triple bonds; changed an existing bond order.",
          "shot": {
            "image": "evidence/vibe-sketcher/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Drew solid wedge, hashed wedge and wavy bonds.",
          "shot": {
            "image": "evidence/vibe-sketcher/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "no",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/reaction-library.html#compounds-and-fragments",
          "note": "Dative and haptic bonds are deferred."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Placed benzene; common ring-size tools also visible.",
          "shot": {
            "image": "evidence/vibe-sketcher/f-rings.webp",
            "caption": "Benzene on the canvas with ring tools below."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Chair and boat templates visible in Structure Library."
        },
        "chains": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Dedicated Chain toolbar tool."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/reaction-library.html#compounds-and-fragments",
          "note": "Searched aspirin and inserted its editable compound template."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/spike_canvas.html#criterion-2-toolbar-and-template-library",
          "note": "Ketcher user templates persist in browser storage."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/figures.html#abbreviations",
          "note": "Ph, Boc and other groups contract and expand chemically."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/tutorials/stereo-and-properties.html#draw-and-inspect",
          "note": null
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/app.html#what-the-server-reads-from-the-drawing",
          "note": "Drawn radicals contribute to species multiplicity."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Lasso and flip tools visible; resizing not checked."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#cdxml-for-chemdraw",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/vibe-sketcher/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the drawing canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/app.html#drawing",
          "note": "Drew a curved, filled-head elliptical arc arrow.",
          "shot": {
            "image": "evidence/vibe-sketcher/f-mechanism-arrows.webp",
            "caption": "A curved arrow on the drawing canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#supported-formats",
          "note": "RXN and reaction SMILES preserve chemical participants."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/inputs.html#reaction-paths-neb",
          "note": "Automatic mapping with manually pinned atom pairs."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Text editor offers bold, italic, subscript and superscript."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/figures.html#shapes-and-tlc-plates",
          "note": "Editable rectangles, ellipses and lines; chemical S-group brackets."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/cleanup.html",
          "note": "Standardizes bond lengths and angles while checking stereochemistry.",
          "shot": {
            "image": "evidence/vibe-sketcher/f-cleanup.webp",
            "caption": "The Clean up command above structures on the canvas."
          },
          "engine": {
            "library": "RDKit/CoordGen (Python, local server) + In-house NumPy/FIRE refinement",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/chem/clean.html#clean_2d"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/figures.html#draw-once-in-the-document-s-style",
          "note": "ACS 1996, RSC and Wiley JCC presets."
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/figures.html#highlights",
          "note": "Selected atoms and connecting bonds receive palette-colored highlights."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Add Image toolbar button."
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/figures.html#shapes-and-tlc-plates",
          "note": "TLC plate generator produces editable drawing objects."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/document.html#what-validation-checks",
          "note": "Invalid carbon valence flagged during manual drawing.",
          "engine": {
            "library": "RDKit (Python sanitization, local server) + In-house structure checks",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/document/ket.html#molecule_reason"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/app.html#stereodescriptors",
          "note": "Paclitaxel and cholesterol received computed R/S descriptors.",
          "shot": {
            "image": "evidence/vibe-sketcher/f-stereo-perception.webp",
            "caption": "A molecular drawing alongside its calculated R and S descriptors."
          },
          "engine": {
            "library": "RDKit rdCIPLabeler (Python bindings, local server)",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/chem/cip.html#stereo_labels"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/tutorials/stereo-and-properties.html#draw-and-inspect",
          "note": "Caffeine formula C8H10N4O2 and mass 194.19 g/mol computed.",
          "shot": {
            "image": "evidence/vibe-sketcher/f-formula-mass.webp",
            "caption": "Caffeine structure with its molecular formula and mass."
          },
          "engine": {
            "library": "RDKit (Python bindings, local server)",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/chem/species.html#properties"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/app.html#elemental-analysis-and-descriptors",
          "note": "Caffeine clogP, MR, TPSA and HBD/HBA computed.",
          "shot": {
            "image": "evidence/vibe-sketcher/f-properties.webp",
            "caption": "Caffeine structure with calculated clogP, TPSA and other estimates."
          },
          "engine": {
            "library": "RDKit (Python bindings, local server)",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/chem/analysis.html#descriptors"
          }
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#supported-formats",
          "note": "Name import reports missing naming engine or OPSIN with Java."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/app.html#names",
          "note": "Imported structures report naming engine not installed."
        },
        "nmr-prediction": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/results.html#nmr-shifts",
          "note": "Shifts require external ORCA calculations and a computed reference.",
          "engine": {
            "library": "ORCA (external executable) + In-house Python shielding-to-shift conversion",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/document/nmr.html#nmr_shifts"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/figures.html#r-groups",
          "note": "R-group cores, substituent definitions and R-logic."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/figures.html#polymer-repeat-units",
          "note": "SRU/COP S-groups preserve repeat-unit connectivity and labels."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#peptides-and-nucleic-acids",
          "note": "Peptide, DNA, RNA sequence and HELM import/export."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/app.html#in-3d-in-vibe-viewer",
          "note": "Coordinates generated; no rotatable viewport available in bundled app."
        },
        "crystals": {
          "status": "no",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/roadmap.html#phase-5-inorganic-and-crystals-after-1-0-scope-to-be-decided",
          "note": "CIF/crystal authoring is planned after 1.0."
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#cdxml-for-chemdraw",
          "note": "Exported caffeine CDXML reopened as a recognized chemical structure.",
          "engine": {
            "library": "In-house Python drawing reader/writer + RDKit Python structure parser",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/document/cdxml.html"
          }
        },
        "cdx": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#supported-formats",
          "note": "Imports binary CDX; no CDX export.",
          "engine": {
            "library": "In-house Python CDX-to-CDXML translator + RDKit Python parser (import only)",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/document/formats.html"
          }
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#supported-formats",
          "note": "Caffeine MOL/SDF round trips worked; cholesterol 3D SDF rejected.",
          "engine": {
            "library": "RDKit (Python bindings, local server)",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/document/formats.html"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#supported-formats",
          "note": "Imported all fixtures; exported caffeine SMILES.",
          "shot": {
            "image": "evidence/vibe-sketcher/f-smiles.webp",
            "caption": "Caffeine structure and its SMILES in the species panel."
          },
          "engine": {
            "library": "RDKit (Python bindings, local server)",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/document/formats.html"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#supported-formats",
          "note": null,
          "engine": {
            "library": "InChI (native library through RDKit Python bindings, local server)",
            "source": "https://vibyverse.com/vibe-sketcher/docs/_modules/vibesketcher/document/formats.html"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#supported-formats",
          "note": "Read/write; export requires exactly one reaction."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#supported-formats",
          "note": "Default SVG exports saved for all three structures."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#png-and-pdf-publication-figures",
          "note": "Default caffeine PDF saved; vector paths verified."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#png-and-pdf-publication-figures",
          "note": "Default caffeine PNG saved at 300 dpi."
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/formats.html#cdxml-for-chemdraw",
          "note": "Copies CDXML text; direct ChemDraw clipboard round trips remain unverified."
        },
        "office": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/figures.html#figures-for-office-programs",
          "note": "EMF is editable vector artwork, without chemical object editing."
        },
        "python-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/python_api.html",
          "note": "Documented vibesketcher SDK."
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/cli.html",
          "note": "Headless conversion and rendering commands."
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/agents.html",
          "note": "MCP tools and REST edit the shared document."
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/inputs.html#adding-a-writer",
          "note": "InputWriter subclasses register extensions; no automatic plugin discovery."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://vibyverse.com/vibe-sketcher/docs/python_api.html",
          "note": "SDK edits documents; editor embedding is unverified."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/figures.html#figures-for-office-programs",
          "note": "Office receives EMF vector pictures, without embedded chemical object editing."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://vibyverse.com/vibe-sketcher/docs/figures.html#highlights",
          "note": "Colored tints beneath atoms and connecting bonds export consistently."
        }
      },
      "caveats": [
        "Officially described as a testing version.",
        "Self-contained desktop packages omit naming integrations and calculation submission.",
        "CDXML compatibility with ChemDraw itself is unverified."
      ],
      "github": null,
      "hands": {
        "testedVersion": "0.6.5",
        "canvas": "evidence/vibe-sketcher/canvas.webp",
        "canvasLight": null,
        "canvasDark": "evidence/vibe-sketcher/canvas-dark.webp",
        "memory": {
          "idleMb": 410.83,
          "paclitaxelMb": 453.1,
          "baselineMb": null,
          "rssIdleMb": 752.83,
          "rssPaclitaxelMb": 808.61,
          "runs": 3,
          "processes": 5,
          "method": "Three-run medians; owned Electron/Python tree phys_footprint sums; SMILES UI import; 10-second waits; MiB.",
          "note": "Includes main, renderer, GPU, network helper, bundled Python; CDP UI automation."
        },
        "themes": {
          "light": false,
          "dark": true,
          "how": "fixed",
          "note": "Fixed dark interface; drawing canvas stays white."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "https://vibyverse.com/updates/vibe-sketcher/releases/0.6.5/vibe-sketcher-0.6.5-arm64.dmg",
        "ran": true,
        "failure": null,
        "downloadBytes": 510821544,
        "installedBytes": 876380160,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/vibe-sketcher/simple.svg",
            "note": "Automatic SMILES layout retained; screenshot zoomed to 200%.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/vibe-sketcher/complex.svg",
            "note": "Automatic SMILES layout retained without cleanup or repositioning.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "Coordinates generated; screenshot and export are 2D. No rotatable viewport was available.",
            "structure": "match"
          }
        ],
        "observations": [
          "SMILES imports produced automatic layouts without cleanup.",
          "Canvas heteroatoms are colored; default SVG output is monochrome.",
          "Paclitaxel imported with wedge and hashed stereobonds.",
          "The desktop package reported its naming engine unavailable.",
          "Cholesterol coordinates generated, but no rotatable viewport was available."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 2086,
        "idleMb": 182,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 510821544,
      "references": [
        "https://vibyverse.com/vibe-sketcher",
        "https://vibyverse.com/vibe-sketcher/docs/index.html"
      ]
    },
    {
      "id": "p72",
      "slug": "erezdraw",
      "name": "ErezDraw",
      "rank": 17,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit",
          "ChemCanvas",
          "nmr-predictor",
          "OpenChemLib"
        ],
        "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L258",
        "note": "Custom SVG editor; geometry partly adapted from ChemCanvas; RDKit and OpenChemLib support chemistry."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "ErezDraw SVG; ported ChemCanvas geometry",
        "language": "JavaScript",
        "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L258-L291"
      },
      "enginesChecked": true,
      "languageNote": "Batchfile, Shell and Dockerfile handle launch, build and deployment.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-3.0-or-later; cross-origin framing blocked",
        "how": "Self-hosted web editor; no supported editor embedding interface confirmed."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "Chemistry, import, desktop and server backends"
        },
        {
          "language": "C++",
          "role": "Native RDKit chemistry"
        }
      ],
      "thirdParty": {
        "summary": "Includes GPL-3.0-or-later (ChemCanvas), LGPL-3.0 (PySide6/Qt), and GPL-2.0-or-later with PyInstaller exception; NMRShiftDB2 data has ODbL-derived share-alike terms requiring OSI-approved dependent software.",
        "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/THIRD-PARTY-NOTICES.md",
        "notice": "https://github.com/nathantallen/ErezDraw/blob/main/THIRD-PARTY-NOTICES.md",
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "ChemCanvas",
            "license": "GPL-3.0-or-later",
            "source": "https://github.com/ksharindam/chemcanvas/blob/main/pyproject.toml"
          },
          {
            "name": "nmr-predictor",
            "license": "MIT",
            "source": "https://github.com/cheminfo-js/nmr-predictor/blob/master/LICENSE"
          },
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Implemented structure, reaction, text and layout tools export vector drawings, although the application remains an incomplete prototype.",
      "summary": "A prototype desktop and self-hosted web editor for drawing chemical structures, reactions, and figures.",
      "website": null,
      "repo": "https://github.com/nathantallen/ErezDraw",
      "docs": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md",
      "vendor": "Nathan Allen",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-3.0-or-later",
        "text": "GNU GPL version 3 or later.",
        "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/THIRD-PARTY-NOTICES.md"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/COPYING"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "windows-2026-10-15-template-picker",
        "date": null,
        "source": "https://github.com/nathantallen/ErezDraw/tree/windows-2026-10-15-template-picker"
      },
      "engine": {
        "rendering": "Custom JavaScript/SVG",
        "chemistry": "RDKit",
        "ui": "PySide6/Qt desktop shells; HTML/CSS/JavaScript web interface",
        "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#verification"
      },
      "languages": [
        "JavaScript",
        "Python",
        "HTML",
        "CSS"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#drawing-and-files",
          "note": "Drew single, double and triple bonds by hand.",
          "shot": {
            "image": "evidence/erezdraw/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L126",
          "note": "Drew solid wedge, hashed wedge and wavy bonds.",
          "shot": {
            "image": "evidence/erezdraw/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/web/desktop.js#L135",
          "note": "Coordination bonds only; no hydrogen-bond or quadruple-bond tool."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#chemcanvas-adaptations-and-cp-centroid-tool",
          "note": "Clicking a double bond cycles left, right and center."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#drawing-and-files",
          "note": "Placed a six-membered ring; aromatic ring tool also visible.",
          "shot": {
            "image": "evidence/erezdraw/f-rings.webp",
            "caption": "Six-membered ring and aromatic rings on the canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#arrow-palette-and-chair-correction",
          "note": "Includes two cyclohexane chair templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L134",
          "note": "Dragging determines zigzag chain length."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#structure-view-and-organometallic-update-09-development",
          "note": "Placed the triphenylphosphine ligand template.",
          "shot": {
            "image": "evidence/erezdraw/f-templates.webp",
            "caption": "Triphenylphosphine drawing on the canvas."
          }
        },
        "custom-templates": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/FEATURE-AUDIT.md#L51",
          "note": "No general user template library."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/structure_ops.py#L170",
          "note": "Limited aliases, including Ph and OMe, are chemically interpreted."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/web/desktop.js#L125",
          "note": "Arbitrary labels and formal charges; no editable isotope field."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/DEVELOPMENT-STATUS.md#L10",
          "note": "Radical and lone-pair placement on atoms persists in drawings."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/KEYBOARD-SHORTCUTS.md#implemented",
          "note": "Hover shortcuts change atom labels, bond orders and styles."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#interface",
          "note": "Lasso selection, rotation, resizing and horizontal/vertical flips."
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#structure-perspective-tool",
          "note": "X/Y trackball tilts structures; depth persists in native drawings."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#arrow-palette-and-chair-correction",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/erezdraw/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/graphics.js#L43",
          "note": "Drew and moved a curved half-head arrow.",
          "shot": {
            "image": "evidence/erezdraw/f-mechanism-arrows.webp",
            "caption": "Selected curved fishhook arrow on the canvas."
          }
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/FEATURE-AUDIT.md#L58",
          "note": "No atom-to-atom reaction mapping."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#drawing-and-text",
          "note": "Graphical s, p, dxy, dz2 and hybrid orbitals."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#drawing-and-text",
          "note": "Captions support fonts, substring formatting, subscripts and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L286",
          "note": "Editable rectangles, ellipses, brackets and Bézier curves."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#interface",
          "note": "Six alignment modes and horizontal/vertical equal-gap distribution."
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#interface",
          "note": "Persistent Group, Ungroup and integral grouping commands."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#chemistry-checks-and-cleanup",
          "note": "RDKit 2D cleanup protects metal, coordination and wedge/hash components.",
          "engine": {
            "library": "RDKit (Python rdDepictor.Compute2DCoords)",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/chemistry.py#L131-L158"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/web/README.md#L52",
          "note": "Built-in ACS Document 1996 preset."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/web/README.md#L52",
          "note": "Custom bond and font settings persist in reusable drawing files."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L206",
          "note": "Atom labels and captions can be colored individually."
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/web/desktop.js#L75",
          "note": "Editable page dimensions and margins; no multipage layout."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#drawing-and-text",
          "note": "Editable tables; dedicated TLC tool was removed."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#chemistry-checks-and-cleanup",
          "note": "Manual RDKit checks; metal and unsupported-label coverage is incomplete.",
          "engine": {
            "library": "RDKit (Python Chem.DetectChemistryProblems/SanitizeMol); in-house coverage warnings",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/chemistry.py#L94-L129"
          }
        },
        "stereo-perception": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/FEATURE-AUDIT.md#L54",
          "note": "No R/S or E/Z assignment."
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#structure-view-and-organometallic-update-09-development",
          "note": "MOL caffeine: C8H10N4O2, molecular weight 194.194.",
          "shot": {
            "image": "evidence/erezdraw/f-formula-mass.webp",
            "caption": "Molecular analysis shows caffeine’s formula and molecular weight."
          },
          "engine": {
            "library": "RDKit (Python rdMolDescriptors and periodic table)",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/structure_ops.py#L170-L179"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/structure_ops.py#L197",
          "note": "Offline RDKit logP and TPSA estimates for organic molecules.",
          "engine": {
            "library": "RDKit (Python Descriptors; Crippen logP and TPSA); optional PubChem PUG REST property lookup",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/structure_ops.py#L197-L201"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#structure-view-and-organometallic-update-09-development",
          "note": "Caffeine loaded using PubChem; absent from local dictionary.",
          "engine": {
            "library": "In-house common-name dictionary (Python); optional PubChem PUG REST web service; RDKit (Python structure generation)",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/structure_ops.py#L153-L168"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/structure_ops.py#L228",
          "note": "PubChem returned 1,3,7-trimethylpurine-2,6-dione for MOL caffeine.",
          "shot": {
            "image": "evidence/erezdraw/f-structure-to-name.webp",
            "caption": "Caffeine structure with its systematic name beneath it."
          },
          "engine": {
            "library": "PubChem PUG REST web service (Python client; exact structure matches)",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/structure_ops.py#L228-L245"
          }
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#predicted-nmr-and-fragment-masses",
          "note": "Local 1H/13C shifts; limited coverage and approximate proton environments.",
          "engine": {
            "library": "nmr-predictor + openchemlib-extended (JavaScript; local HOSE reference matching with bundled proton/nmrshiftdb2 carbon data); in-house Python/RDKit proton refinement",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/nmr/source/entry.js#L1-L14"
          }
        },
        "markush": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/FEATURE-AUDIT.md#L57",
          "note": "No query atoms, alternative groups or generic matching rules."
        },
        "polymers": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/FEATURE-AUDIT.md#L58",
          "note": "No repeat-unit model."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/structure_ops.py#L159",
          "note": "PubChem successfully resolved caffeine name and structure.",
          "engine": {
            "library": "PubChem PUG REST web service (Python urllib client)",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/structure_ops.py#L153-L168"
          }
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/FEATURE-AUDIT.md#L55",
          "note": "SDF opens flat; perspective edits drawings without a model viewer."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/web/README.md#L23",
          "note": "Imported three-atom CDXML; no CDXML export command.",
          "engine": {
            "library": "In-house (Python xml.etree.ElementTree importer; import only)",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/chemdraw_io.py#L128-L153"
          }
        },
        "cdx": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/web/README.md#L23",
          "note": "Imports supported objects; no CDX export or lossless round trip.",
          "engine": {
            "library": "In-house (Python struct-based binary CDX parser; import only)",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/chemdraw_io.py#L48-L131"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L106",
          "note": "Imported MOL and SDF; exported MOL.",
          "engine": {
            "library": "In-house (JavaScript MOL V2000 parser/writer; first SDF record only)",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L106-L110"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/web/desktop.js#L114",
          "note": "Paclitaxel imports correctly; caffeine becomes +3. No SMILES export.",
          "engine": {
            "library": "RDKit (Python Chem.MolFromSmiles import); output limited to PubChem-matched properties",
            "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/structure_ops.py#L38-L53"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L357",
          "note": "Default SVG files saved for both 2D fixtures."
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Print PDF rasterizes the entire editor, including toolbars.",
          "shot": {
            "image": "evidence/erezdraw/f-pdf-export.webp",
            "caption": "Printed page includes the editor toolbar and caffeine drawing."
          }
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L358",
          "note": "Default output is 276×243 pixels, without DPI metadata.",
          "shot": {
            "image": "evidence/erezdraw/f-png-export.webp",
            "caption": "Exported PNG of the caffeine drawing."
          }
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/MANUAL-COMPATIBILITY.md#L26",
          "note": "No proprietary ChemDraw clipboard data."
        },
        "office": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/README.md#charges-pubchem-and-word",
          "note": "Word receives graphics; no ChemDraw OLE editing."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/web/server.py#L20-L26",
          "note": "Self-hosted web editor; no supported editor embedding interface confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/nathantallen/ErezDraw/blob/178f2b534b74da128a5710f4654ffa193c6e4b01/assets/editor.html#L338-L358",
          "note": "Hover backgrounds and halos are temporary and excluded from SVG/PNG exports."
        }
      },
      "caveats": [
        "Development checkpoint with conflicting historical documentation; no feature-complete release is claimed.",
        "ChemDraw imports are lossy; ChemDraw export and editable Office round trips are unavailable.",
        "Organometallic checks and NMR predictions have explicit coverage limits."
      ],
      "github": {
        "url": "https://github.com/nathantallen/ErezDraw",
        "stars": 5,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-10-12",
        "commits": 25,
        "contributors": 1,
        "pushedAt": "2026-10-29T12:48:31Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "178f2b5",
        "canvas": "evidence/erezdraw/canvas.webp",
        "canvasLight": "evidence/erezdraw/canvas-light.webp",
        "canvasDark": "evidence/erezdraw/canvas-dark.webp",
        "memory": {
          "idleMb": 506.74,
          "paclitaxelMb": 509.68,
          "baselineMb": null,
          "rssIdleMb": 1044.84,
          "rssPaclitaxelMb": 1059.95,
          "runs": 1,
          "processes": 2,
          "method": "One manual native run; summed process-tree phys_footprint; 10-second waits; MiB (1048576 bytes).",
          "note": "Published SMILES route; QtWebEngine main and renderer included; native app, no browser baseline."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Dark mode changes surrounding interface; drawing canvas stays white."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://codeload.github.com/nathantallen/ErezDraw/zip/178f2b534b74da128a5710f4654ffa193c6e4b01",
        "ran": true,
        "failure": null,
        "downloadBytes": 20858221,
        "installedBytes": 660791296,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "smiles",
            "image": "evidence/erezdraw/simple.svg",
            "note": "SMILES import adds +3 charge; exported MOL fails aromatic sanitization.",
            "structure": "mismatch"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/erezdraw/complex.svg",
            "note": "Default SMILES layout; exported stereochemistry matches all 11 fixture centers.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": null
          }
        ],
        "observations": [
          "Default canvas is white; labels use Arial 10 pt.",
          "SMILES caffeine gains three positive nitrogen charges.",
          "Caffeine MOL export fails RDKit aromatic sanitization.",
          "Paclitaxel retains all 11 fixture stereocenters.",
          "Default PNG is 276×243 pixels without DPI metadata."
        ]
      },
      "perf": null,
      "downloadBytes": 20858221,
      "references": [
        "https://github.com/nathantallen/ErezDraw"
      ]
    },
    {
      "id": "p97",
      "slug": "molchart",
      "name": "MolChart",
      "rank": 18,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "RDKit",
          "OpenChemLib"
        ],
        "source": "https://molchart.com/assets/main-BkJHgyhY.js",
        "note": "Vendor credits OpenChemLib and RDKit; canvas provenance remains unestablished."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "Anonymous",
          "level": "free",
          "price": "2026-11-06: Free"
        },
        {
          "name": "Free account",
          "level": "account",
          "price": "2026-11-06: Free"
        },
        {
          "name": "Member",
          "level": "paid",
          "price": "2026-11-06: US$10/month advertised; US$30/month structured offer."
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "Custom React SVG renderer",
        "language": "TypeScript",
        "source": "https://molchart.com/assets/main-BkJHgyhY.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [
          "iframe"
        ],
        "package": null,
        "limit": "ChatGPT viewer; manual editing requires full app",
        "how": "MCP molchart.show_document renders ChatGPT widget; manual editing opens full app."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "FastAPI and RDKit server"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Manual structure editing, reaction-scheme layout and vector SVG export support standalone publication-grade 2D chemical drawings.",
      "summary": "Browser editor for manually drawing 2D chemical structures and reaction schemes with an integrated AI assistant.",
      "website": "https://molchart.com/",
      "repo": null,
      "docs": "https://molchart.com/manual.html",
      "vendor": "Xiangyang Wang",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary hosted service with a free editor and paid AI membership.",
        "source": "https://molchart.com/terms.html"
      },
      "price": {
        "text": "2026-11-05: Free editor; US$10/month membership advertised, but official prices and AI limits conflict.",
        "source": "https://molchart.com/draw-molecules-online.html"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": "v1.375",
        "date": null,
        "source": "https://molchart.com/assets/main-BkJHgyhY.js"
      },
      "engine": {
        "rendering": "SVG drawing canvas and SVG export; HTML canvas rasterization for PNG.",
        "chemistry": "OpenChemLib (browser) and RDKit (server)",
        "ui": "React",
        "source": "https://molchart.com/llms-full.txt"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#drawing-bonds-and-chains",
          "note": "Drew all three and changed a single to double.",
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#drawing-bonds-and-chains",
          "note": "Drew solid wedge, hashed wedge and wavy bonds.",
          "shot": {
            "image": "evidence/molchart/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#rings",
          "note": "Placed benzene and cyclohexane rings.",
          "shot": {
            "image": "evidence/molchart/f-rings.webp",
            "caption": "Ring tools and a selected fused-ring structure."
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#drawing-bonds-and-chains",
          "note": null,
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#rings",
          "note": "Placed indole from the fused-ring library.",
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molchart.com/assets/main-BkJHgyhY.js",
          "note": "Selected structures can be saved and inserted through the template palette."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#atoms-and-elements",
          "note": "Typed group abbreviations expand into chemical structures.",
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://molchart.com/assets/main-BkJHgyhY.js",
          "note": "Charges and elements editable; isotope masses preserved on import.",
          "shot": {
            "image": "evidence/molchart/f-atom-labels.webp",
            "caption": "Edit menu shows element and charge commands."
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#hydrogens-charges-and-lone-pairs",
          "note": "Computed or manually adjusted lone pairs.",
          "shot": {
            "image": "evidence/molchart/f-radicals.webp",
            "caption": "Edit menu shows add and remove lone pair commands."
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "keyboard-drawing": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#atoms-and-elements",
          "note": "Element keys edit selected atoms; hover-key editing is unverified.",
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://molchart.com/assets/main-BkJHgyhY.js",
          "note": "Lasso, rotation and flips; resizing verified only for arrows.",
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#arrows-text-and-reactions",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/molchart/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows beside an indole structure."
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#arrows-text-and-reactions",
          "note": "Drew curved and fishhook arrows; editing untested.",
          "shot": {
            "image": "evidence/molchart/f-mechanism-arrows.webp",
            "caption": "A red curved arrow appears below reaction arrows."
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://molchart.com/assets/main-BkJHgyhY.js",
          "note": "Font formatting exists; free-text subscript and superscript controls are unverified."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#selecting-and-editing",
          "note": null,
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#selecting-and-editing",
          "note": null,
          "engine": {
            "library": "OpenChemLib (browser JavaScript Molecule.inventCoordinates); In-house (orientation preservation and fallback geometry)",
            "source": "https://molchart.com/assets/main-BkJHgyhY.js"
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#arrows-text-and-reactions",
          "note": "Selected arrows can be recolored individually.",
          "shot": {
            "image": "evidence/molchart/f-color.webp",
            "caption": "A red curved arrow appears below black reaction arrows."
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#analysis-tools",
          "note": null,
          "engine": {
            "library": "In-house (browser JavaScript valence, charge, bond and aromaticity rules)",
            "source": "https://molchart.com/assets/main-BkJHgyhY.js"
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#analysis-tools",
          "note": "Assigns R/S centers and E/Z double bonds.",
          "engine": {
            "library": "OpenChemLib (browser JavaScript cHelperCIP, getAtomCIPParity and getBondCIPParity)",
            "source": "https://molchart.com/assets/main-BkJHgyhY.js"
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#getting-started",
          "note": "Caffeine formula and mass shown after import.",
          "shot": {
            "image": "evidence/molchart/f-formula-mass.webp",
            "caption": "Status bar shows a molecular formula and mass."
          },
          "engine": {
            "library": "OpenChemLib (browser JavaScript Molecule.getMolecularFormula, formula and absoluteWeight)",
            "source": "https://molchart.com/assets/main-BkJHgyhY.js"
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/structure-to-iupac-name.html",
          "note": "Calculator returned caffeine logP and TPSA.",
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#import-and-export",
          "note": "Aspirin name generated a structure.",
          "engine": {
            "library": "In-house (browser IUPAC parser and common-name dictionary); PubChem PUG REST (remote fallback); OpenChemLib (browser JavaScript SMILES parsing)",
            "source": "https://molchart.com/assets/main-BkJHgyhY.js"
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#analysis-tools",
          "note": "CCCO returned incorrect locant: Propan-3-ol.",
          "shot": {
            "image": "evidence/molchart/f-structure-to-name.webp",
            "caption": "Structure Name dialog displays Propan-3-ol."
          },
          "engine": {
            "library": "In-house (browser naming rules and common-name dictionary); OpenChemLib (browser JavaScript canonical-SMILES/IDCode matching)",
            "source": "https://molchart.com/assets/main-BkJHgyhY.js"
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "nmr-prediction": {
          "status": "no",
          "evidence": "docs",
          "source": "https://molchart.com/chemdraw-alternative.html",
          "note": "Official comparison explicitly excludes NMR prediction."
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#atoms-and-elements",
          "note": "R-group and halide placeholder atom labels.",
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "no",
          "evidence": "docs",
          "source": "https://molchart.com/chemdraw-alternative.html",
          "note": "Official comparison explicitly excludes biopolymer tools."
        },
        "image-to-structure": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#import-and-export",
          "note": "Restores embedded MolChart PNG drawings; general image recognition is unverified."
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#analysis-tools",
          "note": null,
          "engine": {
            "library": "PubChem PUG REST (remote compound name and structure lookup)",
            "source": "https://molchart.com/assets/main-BkJHgyhY.js"
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#view-options",
          "note": "Generated cholesterol model and rotated it in depth.",
          "shot": {
            "image": "evidence/molchart/f-model-3d.webp",
            "caption": "3D Structure Viewer shows a ball-and-stick model."
          },
          "engine": {
            "library": "3Dmol.js (browser JavaScript viewer); RDKit (Python server conformer generation through FastAPI)",
            "source": "https://molchart.com/assets/main-BkJHgyhY.js"
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#view-options",
          "note": "Loads crystallographic structures from COD.",
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#import-and-export",
          "note": "Exported and reimported cholesterol CDXML.",
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#import-and-export",
          "note": null,
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#import-and-export",
          "note": "Imported and exported MOL; exported SDF.",
          "engine": {
            "library": "OpenChemLib (browser JavaScript MOL import/export, Molecule.fromMolfile/toMolfile/toMolfileV3)",
            "source": "https://molchart.com/assets/main-BkJHgyhY.js"
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#import-and-export",
          "note": "Imported SMILES and copied indole SMILES.",
          "engine": {
            "library": "OpenChemLib (browser JavaScript Molecule.fromSmiles/toSmiles)",
            "source": "https://molchart.com/assets/main-BkJHgyhY.js"
          },
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/manual.html#import-and-export",
          "note": "Exported SVG drawings for all three fixtures.",
          "plan": "Anonymous",
          "planLevel": "free"
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export command found in File menu."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molchart.com/assets/main-BkJHgyhY.js",
          "note": "Exported 1785×2000 PNG with 481 dpi metadata.",
          "shot": {
            "image": "evidence/molchart/f-png-export.webp",
            "caption": "PNG output showing a cholesterol structure."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "no",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#import-and-export",
          "note": "Office clipboard output is explicitly a bitmap, not editable chemistry."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/llms-full.txt",
          "note": "Streamable HTTP MCP interface provides drawing, editing and analysis tools."
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://molchart.com/llms-full.txt",
          "note": "ChatGPT viewer; manual editing requires full app"
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molchart.com/manual.html#the-ai-assistant",
          "note": null,
          "shot": {
            "image": "evidence/molchart/f-ai-assistant.webp",
            "caption": "MolChart Assistant offers example drawing prompts."
          },
          "plan": "Anonymous",
          "planLevel": "free"
        }
      },
      "caveats": [
        "Drawing and export implementations were inspected; end-to-end editor usability was not tested.",
        "Official pages disagree on AI quotas and membership pricing.",
        "An older comparison denies templates and CDX/CDXML support that the manual and shipped code provide."
      ],
      "github": null,
      "hands": {
        "testedVersion": "v1.375",
        "canvas": "evidence/molchart/canvas.webp",
        "canvasLight": "evidence/molchart/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 284.28,
          "paclitaxelMb": 310.39,
          "baselineMb": 184.32,
          "rssIdleMb": 809.91,
          "rssPaclitaxelMb": 850.56,
          "runs": 3,
          "processes": 8,
          "method": "Playwright Chrome tree and detached crash handler; phys_footprint sums, three-run medians.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://molchart.com/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molchart/simple.svg",
            "note": "Caffeine imported and laid out automatically.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molchart/complex.svg",
            "note": "Zoomed out to fit the automatic layout.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molchart/threed.png",
            "note": "Generated rotatable 3D model; viewport saved as threed-view.png.",
            "structure": "match"
          }
        ],
        "observations": [
          "The anonymous New command requested sign-in; subsequent fixtures used Clear Canvas.",
          "Caffeine's status bar showed 194.08; the property calculator showed 194.19.",
          "Paclitaxel's automatic drawing required zooming out to fit the viewport.",
          "The default 3D model used ball-and-stick with hydrogens hidden.",
          "The 2D SVG and MOL exports are saved alongside the 3D viewport capture."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 2090,
        "transferBytes": 2344228
      },
      "downloadBytes": null,
      "references": [
        "https://molchart.com/",
        "https://molchart.com/draw-molecules-online.html"
      ]
    },
    {
      "id": "p41",
      "slug": "molcanvas",
      "name": "MolCanvas",
      "rank": 19,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "OpenChemLib"
        ],
        "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/main.ts#L46",
        "note": "Own SVG editor and renderer; OpenChemLib supplies molecular chemistry, conversion and coordinates."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "MolCanvas SVG renderer",
        "language": "TypeScript",
        "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/render.ts#L471-L501"
      },
      "enginesChecked": true,
      "languageNote": "Rust supplies desktop plumbing; HTML and CSS provide presentation.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Permission required for modification, redistribution, or self-hosting.",
        "how": "Hosted editor available; supported embedding integration unconfirmed."
      },
      "otherLanguages": [
        {
          "language": "Rust",
          "role": "Tauri desktop shell and native commands"
        },
        {
          "language": "JavaScript",
          "role": "OpenChemLib chemistry library"
        }
      ],
      "thirdParty": {
        "summary": "Includes BSD-3-Clause (OpenChemLib).",
        "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/package-lock.json",
        "notice": null,
        "libraries": [
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its standalone editor combines molecular drawings, reaction arrows, text and polymer units with SVG export for publication figures.",
      "summary": "A chemical structure editor for drawing organic molecules, reaction schemes, and polymer repeat units.",
      "website": "https://ashif3hq.github.io/molCanvas/",
      "repo": "https://github.com/Ashif3hq/molCanvas",
      "docs": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md",
      "vendor": "Ashif",
      "license": {
        "kind": "source-available",
        "spdx": null,
        "text": "Free to use; current code requires permission for modification or redistribution. Versions through v0.3.0 retain MIT licensing.",
        "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/LICENSE"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "untagged-db1f52e99abd1bd7cd7b",
        "date": "2026-11-04",
        "source": "https://github.com/Ashif3hq/molCanvas/releases/tag/untagged-db1f52e99abd1bd7cd7b"
      },
      "engine": {
        "rendering": "Custom SVG renderer for screen and vector export; HTML canvas rasterization for PNG",
        "chemistry": "OpenChemLib",
        "ui": "Browser DOM/SVG interface; Tauri desktop shell using system WebKit",
        "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#how-it-works"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Drew single; changed to double and triple.",
          "shot": {
            "image": "evidence/molcanvas/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Drew wedge, hashed and wavy bonds.",
          "shot": {
            "image": "evidence/molcanvas/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/cdxml.ts#L252-L265",
          "note": "Dative becomes single; hydrogen and ionic bonds explicitly unsupported."
        },
        "double-bond-side": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/render.ts#L190-L222",
          "note": "Automatic side placement only; no manual side setting."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Placed benzene and cyclohexane using dedicated tools.",
          "shot": {
            "image": "evidence/molcanvas/f-rings.webp",
            "caption": "Benzene and cyclohexane rings on the canvas."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/main.ts#L226",
          "note": "Dragging created a six-bond zig-zag carbon chain.",
          "shot": {
            "image": "evidence/molcanvas/f-chains.webp",
            "caption": "A zig-zag chain on the canvas."
          }
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Stamped naphthalene from the built-in library.",
          "shot": {
            "image": "evidence/molcanvas/f-templates.webp",
            "caption": "Structure library showing rings and fused-ring templates."
          }
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/chem.ts#L140-L149",
          "note": "Elements and charges editable; isotopes supported through import only."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/editor.ts#L923-L945",
          "note": "Box selection, rotation and flips; no lasso or object resizing.",
          "shot": {
            "image": "evidence/molcanvas/f-selection-tools.webp",
            "caption": "Selected caffeine structure and box-selection instructions."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Drew forward, equilibrium, retrosynthesis and resonance arrows.",
          "shot": {
            "image": "evidence/molcanvas/f-reaction-arrows.webp",
            "caption": "Four reaction arrow styles on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Curved arrows explicitly cannot be represented."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "CDXML export identifies chemical reactants and products."
        },
        "atom-mapping": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#roadmap",
          "note": "Atom mapping is on the roadmap."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/render.ts#L414-L430",
          "note": "Automatic subscripts; fixed font and no superscript formatting."
        },
        "shapes": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/cdxml.ts#L185-L193",
          "note": "Polymer brackets supported; general shapes and curves unsupported."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/editor.ts#L947-L953",
          "note": "Regenerates selected or whole structure coordinates through OpenChemLib.",
          "engine": {
            "library": "OpenChemLib (JavaScript npm package)",
            "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/chem.ts#L188-L198"
          }
        },
        "journal-styles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Fixed ACS 1996 formatting applies only to CDXML export."
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/render.ts#L33-L43",
          "note": "Fixed element palette toggle; no individual object color settings.",
          "shot": {
            "image": "evidence/molcanvas/f-color.webp",
            "caption": "Caffeine structure with blue nitrogen and red oxygen labels."
          }
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/cdxml.ts#L185-L193",
          "note": "Embedded raster objects are unsupported and skipped."
        },
        "tlc-tables": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/cdxml.ts#L185-L193",
          "note": "TLC plates and tables are explicitly unsupported and skipped."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/render.ts#L252-L254",
          "note": "Valence problems are collected for on-canvas warnings.",
          "engine": {
            "library": "In-house (TypeScript valence rules)",
            "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/valence.ts#L1-L87"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Caffeine: C8H10N4O2, 194.19 g/mol; exact mass also shown.",
          "shot": {
            "image": "evidence/molcanvas/f-formula-mass.webp",
            "caption": "Caffeine structure with molecular formula and mass."
          },
          "engine": {
            "library": "OpenChemLib (JavaScript npm package)",
            "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/chem.ts#L233-L258"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Caffeine cLogP -0.18 and TPSA 58.4 square angstroms displayed.",
          "shot": {
            "image": "evidence/molcanvas/f-properties.webp",
            "caption": "Caffeine structure with cLogP and TPSA values."
          },
          "engine": {
            "library": "OpenChemLib (JavaScript npm package, MoleculeProperties)",
            "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/chem.ts#L233-L270"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Typing caffeine fetched and drew its structure from PubChem.",
          "engine": {
            "library": "PubChem PUG REST web service",
            "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/main.ts#L688-L737"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Caffeine identified as 1,3,7-trimethylpurine-2,6-dione, CID 2519.",
          "shot": {
            "image": "evidence/molcanvas/f-structure-to-name.webp",
            "caption": "Caffeine structure with its PubChem name and CID."
          },
          "engine": {
            "library": "PubChem PUG REST web service",
            "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/main.ts#L698-L717"
          }
        },
        "nmr-prediction": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#roadmap",
          "note": "NMR shift prediction is on the roadmap."
        },
        "markush": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Query atoms explicitly cannot be represented."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Repeat-unit chemistry, block counts and monomer-to-polymer conversion.",
          "shot": {
            "image": "evidence/molcanvas/f-polymers.webp",
            "caption": "Polymer tools panel with a repeat-unit command."
          }
        },
        "biomolecules": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Amino-acid and biomolecule template categories; no sequence editor seen."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Caffeine lookup fetched its structure through PubChem.",
          "engine": {
            "library": "PubChem PUG REST web service",
            "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/main.ts#L688-L737"
          }
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "3D SDF opens on 2D canvas; no viewer control found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Exported caffeine CDXML and re-imported it successfully.",
          "engine": {
            "library": "In-house (TypeScript XML reader/writer); OpenChemLib (JavaScript) aromatic bond conversion",
            "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/cdxml.ts"
          }
        },
        "cdx": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#roadmap",
          "note": "Binary CDX support is on the roadmap."
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/main.ts#L749-L886",
          "note": "Imported MOL and SDF; exported V2000 MOL and 3D SDF.",
          "engine": {
            "library": "OpenChemLib (JavaScript npm package) for MOL; In-house (TypeScript) SDF framing",
            "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/modeling.ts#L44-L60"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Pasted fixture SMILES and saved a .smi export.",
          "shot": {
            "image": "evidence/molcanvas/f-smiles.webp",
            "caption": "Caffeine structure and its displayed SMILES string."
          },
          "engine": {
            "library": "OpenChemLib (JavaScript npm package)",
            "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/chem.ts#L114-L169"
          }
        },
        "inchi": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#roadmap",
          "note": "InChI and InChIKey are on the roadmap."
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/README.md#features",
          "note": "Saved default SVG exports for caffeine and paclitaxel."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "No PDF menu option; Command-P produced no response."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/main.ts#L790-L802",
          "note": "Default PNG saved at 800x868 pixels; no DPI metadata.",
          "shot": {
            "image": "evidence/molcanvas/f-png-export.webp",
            "caption": "PNG image of a caffeine structure."
          }
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/bcfd043bad801dd440825bd1a0198679996eda8f/src/editor.ts#L1157-L1196",
          "note": "Text CDXML/MOL/SMILES only; native ChemDraw clipboard formats unsupported."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/main/README.md",
          "note": "Hosted editor available; supported embedding integration unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/Ashif3hq/molCanvas/blob/75bbd6d74905d0b314948eb7ace334313fa16965/src/render.ts#L438-L499",
          "note": "Blue selection halos only; exports explicitly remove selection and hover."
        }
      },
      "caveats": [
        "Current source license restricts modification, redistribution and self-hosting.",
        "CDXML import omits curved arrows, shapes, query atoms and embedded objects.",
        "macOS minimum conflicts: release notes say 11+, app configuration requires 12+."
      ],
      "github": {
        "url": "https://github.com/Ashif3hq/molCanvas",
        "stars": 6,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-10-23",
        "commits": 47,
        "contributors": 3,
        "pushedAt": "2026-11-04T07:48:19Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.4.0",
        "canvas": "evidence/molcanvas/canvas.webp",
        "canvasLight": "evidence/molcanvas/canvas-light.webp",
        "canvasDark": "evidence/molcanvas/canvas-dark.webp",
        "memory": {
          "idleMb": 327.93,
          "paclitaxelMb": 363.97,
          "baselineMb": null,
          "rssIdleMb": 601.53,
          "rssPaclitaxelMb": 667.58,
          "runs": 3,
          "processes": 10,
          "method": "Median three runs; phys_footprint sum; ps descendants and lsappinfo coalition, including WebKit and native helpers.",
          "note": "SMILES; isolated bundle identifier; ≥10-second settling; MiB; processes is maximum observed."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "https://github.com/Ashif3hq/molCanvas/releases/download/untagged-db1f52e99abd1bd7cd7b/MolCanvas_0.4.0_aarch64.dmg",
        "ran": true,
        "failure": null,
        "downloadBytes": 3248540,
        "installedBytes": 5627904,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molcanvas/simple.svg",
            "note": "Current Kekule SMILES; automatic layout fitted without cleanup.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molcanvas/complex.svg",
            "note": "Current Kekule SMILES; automatic layout retains wedge and hashed bonds.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": "match"
          }
        ],
        "observations": [
          "Default app canvas is dark with coloured heteroatoms.",
          "SMILES import automatically lays out and selects each structure.",
          "Paclitaxel displays wedge and hashed bonds without cleanup.",
          "SVG exports crop to the structure and use dark bonds.",
          "Cholesterol 3D SDF opens on the 2D canvas with explicit hydrogens."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 290,
        "idleMb": 100,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 3248540,
      "references": [
        "https://github.com/Ashif3hq/molCanvas/blob/f8e5def62afad3bca4369fae838457dc7c935f82/README.md",
        "https://github.com/Ashif3hq/molCanvas/blob/f8e5def62afad3bca4369fae838457dc7c935f82/LICENSE",
        "https://github.com/Ashif3hq/molCanvas/blob/v0.3.0/LICENSE"
      ]
    },
    {
      "id": "p12",
      "slug": "kendraw",
      "name": "Kendraw",
      "rank": 20,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "Ketcher",
          "Indigo",
          "RDKit"
        ],
        "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/ui/src/canvas-ketcher/KetcherCanvas.tsx#L51",
        "note": "Hosted builds embed unmodified Ketcher; source builds can use the original canvas."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher 3.12.0 SVG renderer on Raphaël; Indigo generated images",
        "language": "TypeScript",
        "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/ui/src/canvas-ketcher/KetcherCanvas.tsx#L10"
      },
      "enginesChecked": true,
      "languageNote": "HTML/CSS provide markup/styles; other languages support configuration, builds and deployment.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Docker denies framing; embedding API remains future work.",
        "how": "No supported embedding route; Docker explicitly denies framing."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "RDKit backend and additive NMR prediction"
        },
        {
          "language": "C++",
          "role": "Native and WebAssembly chemistry engines"
        },
        {
          "language": "JavaScript",
          "role": "Raphaël graphics and Miew 3D viewer"
        }
      ],
      "thirdParty": {
        "summary": "Ketcher is Apache-2.0; its upstream NOTICE also lists LGPL-2.1/MPL-1.0/AFL-3.0 dependencies. NMR tables cite NMRShiftDB2 (database share-alike and OSI-license condition) and SDBS (commercial use requires permission); the project's CC-BY/free-access descriptions need clarification.",
        "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/backend/kendraw_chem/nmr/shift_tables.py",
        "notice": "https://github.com/electrosenpai/kendraw/blob/main/docs/THIRD-PARTY-NOTICES.md",
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It provides a standalone drawing workspace with reaction tools, text, shapes, journal settings, and publication-ready SVG export.",
      "summary": "An open-source browser application for drawing chemical structures and reactions, calculating molecular properties, and predicting NMR spectra.",
      "website": "https://kendraw.fdp.expert/",
      "repo": "https://github.com/electrosenpai/kendraw",
      "docs": "https://github.com/electrosenpai/kendraw#readme",
      "vendor": "Jean-Baptiste Donnette",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT-licensed application; embedded Ketcher and Indigo use Apache-2.0.",
        "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/README.md#why-kendraw"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/electrosenpai/kendraw/releases"
      },
      "engine": {
        "rendering": "SVG through Ketcher/Raphael; Indigo generates PNG and SVG exports.",
        "chemistry": "Indigo WebAssembly in Ketcher; RDKit and Indigo in the Python backend",
        "ui": "React",
        "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/docs/THIRD-PARTY-NOTICES.md#relationship"
      },
      "languages": [
        "TypeScript",
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#drawing-bonds",
          "note": "Drew single, double and triple bonds; MOL confirms orders.",
          "shot": {
            "image": "evidence/kendraw/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts#L27",
          "note": "Drew wedge, hashed and wavy bonds; MOL confirms types.",
          "shot": {
            "image": "evidence/kendraw/f-stereo-bonds.webp",
            "caption": "Wedge, hashed and wavy bonds on the drawing canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts#L40",
          "note": "Dative and hydrogen bond tools."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#templates-toolbar",
          "note": "Placed benzene and cyclohexane from ring toolbar.",
          "shot": {
            "image": "evidence/kendraw/f-rings.webp",
            "caption": "Benzene and cyclohexane rings on the canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/templates/library.sdf#L8258",
          "note": "Built-in cyclohexane chair templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/editor/tool/chain.ts#L151",
          "note": "Drag distance determines carbon chain length."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#templates-toolbar",
          "note": "Inserted bicyclo[1.1.1]pentane from structure library.",
          "shot": {
            "image": "evidence/kendraw/f-templates.webp",
            "caption": "Structure Library showing bicyclic templates."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#templates-toolbar",
          "note": "Save drawings into the reusable User Templates library.",
          "shot": {
            "image": "evidence/kendraw/f-custom-templates.webp",
            "caption": "Save Structure dialog with Save to Templates button."
          }
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#functional-groups",
          "note": "Functional groups retain chemistry and support expansion."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/data/schema/struct-schema.js#L21",
          "note": "Atom properties include labels, charges and isotope masses."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/data/schema/struct-schema.js#L80",
          "note": "Monoradical and singlet/triplet diradical atom properties."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/state/handleHotkeysOverItem.ts#L204",
          "note": "Keyboard atom tools modify hovered atoms."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#changing-structure-display",
          "note": "Lasso, rotation and flipping; structure resizing unverified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-core/src/domain/entities/rxnArrow.ts#L24",
          "note": "Drew equilibrium arrow; forward and retrosynthetic tools are visible.",
          "shot": {
            "image": "evidence/kendraw/f-reaction-arrows.webp",
            "caption": "Equilibrium arrow on the drawing canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-core/src/domain/entities/rxnArrow.ts#L24",
          "note": "Drew an elliptical arc with a half arrowhead.",
          "shot": {
            "image": "evidence/kendraw/f-mechanism-arrows.webp",
            "caption": "Curved arrow on the drawing canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/README.md#ketcher-api",
          "note": "Ketcher represents reactions and exports RXN."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#drawing-reactions",
          "note": "Manual and automatic reaction mapping in Ketcher."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/views/modal/components/Text/SpecialSymbolsList/SpecialSymbolsList.tsx#L22",
          "note": "Symbol palette includes reaction arrows, Greek letters, temperatures and Ångström."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/views/modal/components/Text/Text.tsx#L52",
          "note": "Free text supports font settings, superscript and subscript."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#drawing-graphical-objects",
          "note": "Ellipses, rectangles, lines and chemical S-group brackets."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#inability-to-change-s-group",
          "note": "Chemical S-groups move together; Remove Abbreviation separates their atoms."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/README.md#editor-builtin-tools",
          "note": "Clean Up regularizes bond lengths and angles.",
          "engine": {
            "library": "Indigo (indigo-ketcher 1.40.0 WebAssembly through Ketcher 3.12.0); RDKit native Python bindings for alternate-canvas backend cleanup",
            "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/backend/kendraw_chem/structure.py#L70"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#acs-american-chemical-society-style",
          "note": "Built-in ACS style settings.",
          "shot": {
            "image": "evidence/kendraw/f-journal-styles.webp",
            "caption": "Settings dialog with Set ACS Settings button."
          }
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/views/modal/components/meta/Settings/Settings.tsx#L84",
          "note": "Bond and font settings can be saved and reloaded."
        },
        "color": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Individual atom/bond highlights; direct recoloring unverified."
        },
        "pages": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/docs/public-beta-release-notes.md#three-limitations-to-mention-honestly",
          "note": "Multipage documents are explicitly deferred."
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#adding-images-on-the-canvas",
          "note": "Add Image places PNG and SVG pictures."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#drawing-atoms",
          "note": "Invalid valence is underlined; structure checking is available.",
          "shot": {
            "image": "evidence/kendraw/f-valence-check.webp",
            "caption": "Settings dialog with valence warnings enabled."
          },
          "engine": {
            "library": "Ketcher TypeScript valence rules; Indigo WebAssembly structure checker; In-house TypeScript side-panel validation",
            "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-core/src/domain/entities/atom.ts#L446"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#stereochemistry",
          "note": "Ketcher computes R/S, r/s and E/Z descriptors.",
          "engine": {
            "library": "Indigo (indigo-ketcher 1.40.0 WebAssembly through Ketcher 3.12.0)",
            "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L158"
          }
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/ui/src/PropertyPanel.tsx#L190",
          "note": "Ketcher calculates caffeine correctly; surrounding panel reports incorrect values.",
          "shot": {
            "image": "evidence/kendraw/f-formula-mass.webp",
            "caption": "Calculated Values dialog showing molecular weight and exact mass."
          },
          "engine": {
            "library": "RDKit native Python bindings (Descriptors and rdMolDescriptors); In-house TypeScript formula/MW display; Indigo WebAssembly in Ketcher's calculation dialog",
            "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/backend/kendraw_chem/compute.py#L63"
          }
        },
        "properties": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/ui/src/PropertyPanel.tsx#L212",
          "note": "Panel computes logP and tPSA, but caffeine identifiers are incorrect.",
          "shot": {
            "image": "evidence/kendraw/f-properties.webp",
            "caption": "Structure beside the properties panel with logP and tPSA."
          },
          "engine": {
            "library": "RDKit native Python bindings (Descriptors, Lipinski and rdMolDescriptors)",
            "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/backend/kendraw_chem/compute.py#L63"
          }
        },
        "name-to-structure": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/ui/src/MoleculeSearch.tsx#L117",
          "note": "PubChem name lookup; Ketcher insertion is not wired.",
          "engine": {
            "library": "PubChem PUG REST HTTP API through an In-house TypeScript client",
            "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/io/src/pubchem/pubchem-client.ts#L17"
          }
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/backend/kendraw_chem/naming.py#L1",
          "note": "Naming service is an unimplemented placeholder."
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/nmr/src/NmrPanel.tsx#L442",
          "note": "Built-in additive ¹H/¹³C predictions; backend required.",
          "engine": {
            "library": "In-house Python additive 1H/13C predictor; RDKit native Python bindings for molecular analysis",
            "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/backend/kendraw_chem/nmr/nmr_service.py#L67"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#drawing-r-groups",
          "note": "R-groups, attachment points and query atoms."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#marking-s-groups",
          "note": "Structural repeating units include polymer connectivity semantics."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#ketcher-macromolecules-mode",
          "note": "Peptide, RNA/DNA, sequence and HELM tools."
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts#L732",
          "note": "Image recognition explicitly unsupported in bundled standalone mode."
        },
        "database-lookup": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/ui/src/MoleculeSearch.tsx#L117",
          "note": "PubChem fetching works; Ketcher insertion is not wired.",
          "engine": {
            "library": "PubChem PUG REST and autocomplete HTTP APIs through an In-house TypeScript client",
            "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/io/src/pubchem/pubchem-client.ts#L1"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#3d-viewer",
          "note": "SDF coordinates displayed and rotated in Miew viewer.",
          "shot": {
            "image": "evidence/kendraw/f-model-3d.webp",
            "caption": "Molecular model in the Miew viewer."
          },
          "engine": {
            "library": "Miew JavaScript/WebGL viewer through Ketcher's miew-react component",
            "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/views/modal/components/process/Miew/Miew.tsx#L36"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#working-with-files",
          "note": "Exported and reopened CDXML; chemical round-trip fidelity remains unverified.",
          "engine": {
            "library": "Indigo WebAssembly through Ketcher's CDXML formatter; In-house TypeScript CDXML import/export for the alternate canvas",
            "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L108"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#working-with-files",
          "note": "Binary and base64 CDX via Ketcher's Open/Save.",
          "engine": {
            "library": "Indigo (indigo-ketcher 1.40.0 WebAssembly through Ketcher 3.12.0)",
            "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L109"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#working-with-files",
          "note": "Opened MOL and SDF; exported MOL.",
          "shot": {
            "image": "evidence/kendraw/f-mol-sdf.webp",
            "caption": "Save Structure format menu listing MDL Molfile and SDF."
          },
          "engine": {
            "library": "Ketcher TypeScript MOL V2000 serializer and Indigo WebAssembly conversion; In-house TypeScript MOL/SDF import parser; RDKit native Python bindings for backend MOL conversion",
            "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/ui/src/ImportDialog.tsx#L284"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#working-with-files",
          "note": "Imported SMILES and exported Daylight SMILES through Ketcher.",
          "engine": {
            "library": "Indigo WebAssembly through Ketcher; RDKit native Python bindings for backend conversion; In-house TypeScript import parser",
            "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/backend/kendraw_chem/convert.py#L84"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#working-with-files",
          "note": "InChI import and export.",
          "engine": {
            "library": "InChI through RDKit native Python bindings (rdkit.Chem.inchi) and Indigo WebAssembly in Ketcher",
            "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/backend/kendraw_chem/convert.py#L84"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/Save.tsx#L248",
          "note": "Ketcher reads and writes RXN V2000/V3000."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#working-with-files",
          "note": "Ketcher saved vector SVG for both 2D fixtures."
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/packages/ui/src/PropertyPanel.tsx#L118",
          "note": "PDF export embeds a raster image, not vector drawing."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/packages/ketcher-react/src/script/ui/data/schema/options-schema.ts#L38",
          "note": "PNG saved; default Ketcher export measured 223 by 162 pixels."
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/issues/3689#issuecomment-1903688361",
          "note": "MOL text exchange; native ChemDraw clipboard pasting unsupported."
        },
        "office": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/docs/chemdraw-exhaustive-comparison.md#L187",
          "note": "Editable Office embedding is explicitly absent."
        },
        "python-api": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/docs/chemdraw-exhaustive-comparison.md#section-19--scripting-et-automatisation",
          "note": "REST backend exists; native scripting SDK is explicitly absent."
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/docs/api-endpoints-map.md#endpoint-catalogue",
          "note": "TypeScript client drives conversion, properties and NMR services."
        },
        "cli": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/docs/kendraw-vs-chemdraw-feature-gap.md#L726",
          "note": "Headless conversion and batch CLI are listed as missing."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/docs/kendraw-vs-chemdraw-feature-gap.md#L722",
          "note": "Plugin system is explicitly listed as missing."
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/docker/nginx.conf#L9",
          "note": "No supported embedding route; Docker explicitly denies framing."
        },
        "ai-assistant": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/electrosenpai/kendraw/blob/fabeccf810b79c6cf56e678ebbfd12bbc482fc29/docs/architecture-kendraw-2026-04-12.md#17-considérations-futures-v2--pour-mémoire",
          "note": "LLM assistant is explicitly outside current scope."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/8eced2ca1c68e3f45b092b2ba461e26880061b90/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Ketcher mode provides eight-color backgrounds on individual atoms and bonds."
        }
      },
      "caveats": [
        "Docker enables Ketcher despite README opt-in wording; older feature audits describe the legacy editor.",
        "Ketcher mode lacks autosave and bidirectional NMR highlighting available in the legacy editor.",
        "PDF export rasterizes drawings; SVG preserves vector output."
      ],
      "github": {
        "url": "https://github.com/electrosenpai/kendraw",
        "stars": 8,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-04-11",
        "commits": 256,
        "contributors": 1,
        "pushedAt": "2026-06-29T21:59:28Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.1.0",
        "canvas": "evidence/kendraw/canvas.webp",
        "canvasLight": "evidence/kendraw/canvas-light.webp",
        "canvasDark": "evidence/kendraw/canvas-dark.webp",
        "memory": {
          "idleMb": 828,
          "paclitaxelMb": 854,
          "baselineMb": 526,
          "rssIdleMb": 1659.08,
          "rssPaclitaxelMb": 1602.05,
          "runs": 3,
          "processes": 7,
          "method": "Median Chromium process-tree physical footprints; blank baseline; scripted SMILES import.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Dark interface retains white canvas; bonds appear pale."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://kendraw.fdp.expert/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/kendraw/simple.svg",
            "note": "Default layout; exported MOL matches caffeine.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/kendraw/complex.svg",
            "note": "Default layout; exported MOL matches paclitaxel including stereochemistry.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/kendraw/threed.png",
            "note": "Rotatable Miew viewer uses supplied three-dimensional SDF coordinates.",
            "structure": "match"
          }
        ],
        "observations": [
          "About reports Ketcher 3.12.0; no Kendraw version was displayed.",
          "Default bonds and carbon labels appear very pale against the white canvas.",
          "For caffeine, Ketcher calculates C8H10N4O2 and 194.194; the panel reports C8N4O2 and 184.114.",
          "The panel's caffeine SMILES and InChI differ from Ketcher's aromatic structure.",
          "The SMILES 3D view was flat; the supplied SDF displayed three-dimensional coordinates.",
          "Kendraw version 0.1.0 appears in its SVG metadata and hosted About component source."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 1140,
        "transferBytes": 8883410
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/electrosenpai/kendraw"
      ]
    },
    {
      "id": "p54",
      "slug": "boltzdraw",
      "name": "BoltzDraw",
      "rank": 21,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "RDKit",
          "Indigo",
          "Mol*",
          "PLIP",
          "ProLIF",
          "WaterKit",
          "Open Babel",
          "PDBFixer",
          "OpenMM",
          "Meeko",
          "MDAnalysis",
          "Gemmi",
          "UnipKa"
        ],
        "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/index.html#L62",
        "note": "Ketcher iframe; RDKit/Mol* frontend; remaining libraries support optional Python services."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher; Indigo exports; RDKit previews",
        "language": "TypeScript",
        "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/render/restruct/reatom.ts#L282"
      },
      "enginesChecked": true,
      "languageNote": "HTML/CSS provide presentation; Shell launches services; bundled dependency code excluded.",
      "video": null,
      "embedding": {
        "methods": [
          "iframe"
        ],
        "package": null,
        "limit": "Bundled Ketcher only (Apache-2.0); full wrapper embedding undocumented.",
        "how": "Self-host bundled ketcher/index.html iframe; use same-origin contentWindow.ketcher API."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Wrapper and molecule analysis interface"
        },
        {
          "language": "C++",
          "role": "Indigo exports and RDKit previews"
        },
        {
          "language": "Python",
          "role": "Local molecular analysis backend"
        }
      ],
      "thirdParty": {
        "summary": "Includes Cairo (LGPL-2.1 OR MPL-1.1), OFL-1.1 fonts, GPL-3.0+ vendored WaterKit and GPL-2.0+ AD4 data; optional Python services add GPL-2/3, LGPL-2.1/3 and MPL-2.0 dependencies.",
        "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/environment.yml",
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "Mol*",
            "license": "MIT",
            "source": "https://github.com/molstar/molstar/blob/master/LICENSE"
          },
          {
            "name": "PLIP",
            "license": "GPL-2.0-only",
            "source": "https://github.com/pharmai/plip/blob/master/pyproject.toml"
          },
          {
            "name": "ProLIF",
            "license": "Apache-2.0",
            "source": "https://github.com/chemosim-lab/ProLIF/blob/master/LICENSE"
          },
          {
            "name": "WaterKit",
            "license": "GPL-3.0-only",
            "source": "https://github.com/forlilab/waterkit/blob/master/LICENSE"
          },
          {
            "name": "Open Babel",
            "license": "GPL-2.0-only",
            "source": "https://github.com/openbabel/openbabel/blob/master/COPYING"
          },
          {
            "name": "PDBFixer",
            "license": "MIT",
            "source": "https://github.com/openmm/pdbfixer/blob/master/LICENSE"
          },
          {
            "name": "OpenMM",
            "license": "MIT AND LGPL-3.0-or-later",
            "source": "https://github.com/openmm/openmm/blob/master/docs-source/licenses/Licenses.txt"
          },
          {
            "name": "Meeko",
            "license": "LGPL-2.1",
            "source": "https://github.com/forlilab/Meeko/blob/develop/LICENSE"
          },
          {
            "name": "MDAnalysis",
            "license": "LGPL-3.0-or-later",
            "source": "https://github.com/MDAnalysis/mdanalysis/blob/package-2.11.0/LICENSE"
          },
          {
            "name": "Gemmi",
            "license": "MPL-2.0 OR LGPL-3.0-only",
            "source": "https://github.com/project-gemmi/gemmi/blob/master/README.md"
          },
          {
            "name": "Uni-pKa",
            "license": "Apache-2.0",
            "source": "https://github.com/dptech-corp/Uni-pKa/blob/main/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "It is a Ketcher-based web structure editor centered on molecular input, analysis panels, and structure exports.",
      "summary": "A browser-based molecular editor combining Ketcher drawing, property calculations, peptide building, and protein–ligand visualization.",
      "website": "https://github.com/GSmithBoltz/BoltzDraw",
      "repo": "https://github.com/GSmithBoltz/BoltzDraw",
      "docs": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/README.md",
      "vendor": "GSmithBoltz",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "README declares MIT; no separate license file is included.",
        "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/README.md#license"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/README.md#license"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/GSmithBoltz/BoltzDraw/releases"
      },
      "engine": {
        "rendering": "SVG through Ketcher/Raphael; Indigo generates PNG/SVG exports; RDKit generates SVG molecule previews.",
        "chemistry": "Indigo (Ketcher WebAssembly); RDKit.js",
        "ui": "HTML/CSS and JavaScript wrapper; React-based Ketcher",
        "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/ketcher/static/js/main.67cb654b.js"
      },
      "languages": [
        "JavaScript",
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-bonds",
          "note": "Placed single, double, and triple bonds.",
          "shot": {
            "image": "evidence/boltzdraw/f-bonds-core.webp",
            "caption": "Single, double and triple bonds drawn on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts#L27",
          "note": "Placed wedge, hashed, and wavy bonds.",
          "shot": {
            "image": "evidence/boltzdraw/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts#L40",
          "note": "Dative and hydrogen bonds."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#templates-toolbar",
          "note": "Placed benzene and cyclohexane.",
          "shot": {
            "image": "evidence/boltzdraw/f-rings.webp",
            "caption": "Benzene and cyclohexane rings drawn on the canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/templates/library.sdf",
          "note": "Includes chair and boat conformations."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/editor/tool/chain.ts",
          "note": "Dragging sets zigzag chain length."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#templates-toolbar",
          "note": "Placed D-alanine from the structure library.",
          "shot": {
            "image": "evidence/boltzdraw/f-templates.webp",
            "caption": "Structure library showing D-amino acid templates."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#templates-toolbar",
          "note": null,
          "shot": {
            "image": "evidence/boltzdraw/f-custom-templates.webp",
            "caption": "Save Structure dialog with a Save to Templates button."
          }
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#expandingcontracting-s-group",
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/data/schema/struct-schema.js",
          "note": "Element labels, charges, isotopes and aliases are editable.",
          "shot": {
            "image": "evidence/boltzdraw/f-atom-labels.webp",
            "caption": "A structure with colored oxygen and nitrogen atom labels."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/data/schema/struct-schema.js#L80",
          "note": "Monoradical and singlet/triplet diradical states."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-atoms",
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Rectangle, lasso, and fragment selection tools are visible.",
          "shot": {
            "image": "evidence/boltzdraw/f-selection-tools.webp",
            "caption": "Selection menu showing rectangle, lasso and fragment tools."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/leftToolbarOptions.ts",
          "note": "Placed equilibrium arrow; forward arrow tool also available.",
          "shot": {
            "image": "evidence/boltzdraw/f-reaction-arrows.webp",
            "caption": "An equilibrium arrow and a curved arrow on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/editor/tool/reactionarrow.ts",
          "note": "Placed curved arrow; half-headed option also visible.",
          "shot": {
            "image": "evidence/boltzdraw/f-mechanism-arrows.webp",
            "caption": "A curved arrow and an equilibrium arrow on the canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/README.md#ketcher-api",
          "note": "Native Ketcher RXN export preserves reaction chemistry."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-reactions",
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#creating-text-objects-on-the-canvas",
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-graphical-objects",
          "note": "Ellipses, rectangles, lines and chemical S-group brackets.",
          "shot": {
            "image": "evidence/boltzdraw/f-shapes.webp",
            "caption": "Shape menu showing ellipse, rectangle and line tools."
          }
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Chemical S-groups exist; general drawing-object grouping is unverified."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#ketcher-overview",
          "note": null,
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L208"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/modal/components/meta/Settings/Settings.tsx#L81",
          "note": "Bond and font settings save to and reload from JSON."
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#adding-images-on-the-canvas",
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-atoms",
          "note": null,
          "shot": {
            "image": "evidence/boltzdraw/f-valence-check.webp",
            "caption": "Settings dialog with the valence warnings option enabled."
          },
          "engine": {
            "library": "Ketcher (TypeScript); Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/state/server/index.js#L61"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#ketcher-overview",
          "note": "Calculate CIP determines R/S and E/Z.",
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L158"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/modal/components/process/Analyse/Analyse.jsx#L68",
          "note": "Caffeine: C8H10N4O2, molecular weight 194.191, exact mass 194.080.",
          "shot": {
            "image": "evidence/boltzdraw/f-formula-mass.webp",
            "caption": "Calculated formula, molecular weight and exact mass."
          },
          "engine": {
            "library": "Indigo (WebAssembly); RDKit.js (WebAssembly mass descriptors)",
            "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/js/properties.js#L48-L65"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/js/properties.js#L64",
          "note": "Cards displayed cLogP and TPSA for imported structures.",
          "shot": {
            "image": "evidence/boltzdraw/f-properties.webp",
            "caption": "Molecule card showing molecular weight, cLogP, TPSA and other properties."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly)",
            "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/js/properties.js#L48"
          }
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Opening caffeine as text produced a conversion error."
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/README.md#analysis-panel-boltzdraw",
          "note": "CSV export returned caffeine's systematic name.",
          "engine": {
            "library": "PubChem PUG REST (remote API)",
            "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/js/app.js#L1031"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-r-groups",
          "note": null,
          "shot": {
            "image": "evidence/boltzdraw/f-markush.webp",
            "caption": "R-group menu with label and fragment tools."
          }
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#marking-s-groups",
          "note": null
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/README.md#import-panel-boltzdraw",
          "note": "Peptide sequences convert to structures, including D-residues and terminal modifications.",
          "shot": {
            "image": "evidence/boltzdraw/f-biomolecules.webp",
            "caption": "Peptide import panel with sequence and terminal options."
          }
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts#L725",
          "note": "OCR explicitly rejects requests in this standalone Ketcher build."
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/README.md#import-panel-boltzdraw",
          "note": "Imports small-molecule ligands by RCSB PDB accession.",
          "engine": {
            "library": "RCSB PDB Data API (remote API)",
            "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/js/pdb.js#L40"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/README.md#modes",
          "note": "SDF coordinates rotate; SMILES import remained flat.",
          "shot": {
            "image": "evidence/boltzdraw/f-model-3d.webp",
            "caption": "A molecular structure shown in the 3D viewer."
          },
          "engine": {
            "library": "Mol* (browser JavaScript); Miew (browser JavaScript)",
            "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/js/molstar.js#L56"
          }
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/README.md#modes",
          "note": "CIF/mmCIF files open in the separate BoltzStar viewer."
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatProperties.ts#L98",
          "note": "Exported and reopened caffeine CDXML.",
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L108"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatProperties.ts#L104",
          "note": "Native Ketcher supports binary and base64 CDX.",
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L109"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatProperties.ts",
          "note": "Opened MOL and SDF; exported MOL.",
          "shot": {
            "image": "evidence/boltzdraw/f-mol-sdf.webp",
            "caption": "Save Structure menu listing MOL and SDF formats."
          },
          "engine": {
            "library": "Ketcher (TypeScript); Indigo (WebAssembly); RDKit.js (WebAssembly)",
            "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/js/app.js#L962"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/README.md#ketcher-api",
          "note": "Imported SMILES and saved SMILES.",
          "shot": {
            "image": "evidence/boltzdraw/f-smiles.webp",
            "caption": "Save Structure menu listing Daylight SMILES."
          },
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L104"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/README.md#ketcher-api",
          "note": null,
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L101"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/README.md#ketcher-api",
          "note": "Native Ketcher exports RXN V2000 and V3000."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#working-with-files",
          "note": "Saved native SVG drawings.",
          "shot": {
            "image": "evidence/boltzdraw/f-svg-export.webp",
            "caption": "Export panel offering SVG Vector and other formats."
          }
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "PDF absent from editor and wrapper export formats."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "PNG saved at 553 × 392 pixels, 72 dpi.",
          "shot": {
            "image": "evidence/boltzdraw/f-png-export.webp",
            "caption": "Export panel offering PNG Image and other formats."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/README.md#ketcher-api",
          "note": "Embedded Ketcher API is accessible through its iframe."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/js/app.js#L392",
          "note": "Local modules add modes using the documented registerMode function."
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/ketcher/iframe.html",
          "note": "Bundled Ketcher only (Apache-2.0); full wrapper embedding undocumented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/ketcher/static/js/main.67cb654b.js",
          "note": "API highlights display colored halos; exports omit them."
        }
      },
      "caveats": [
        "Despite README's backend-free description, hydration and ADME require local Python; drawing loads CDN assets.",
        "README describes canvas export, but wrapper PNG/SVG exports omit annotations and original layout.",
        "Upstream Ketcher advertises OCR; this bundled standalone build explicitly rejects it."
      ],
      "github": {
        "url": "https://github.com/GSmithBoltz/BoltzDraw",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2025-12-24",
        "commits": 57,
        "contributors": 4,
        "pushedAt": "2026-11-05T17:23:52Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "Ketcher 2.24.0",
        "canvas": "evidence/boltzdraw/canvas.webp",
        "canvasLight": "evidence/boltzdraw/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 373,
          "paclitaxelMb": 346,
          "baselineMb": 50.33,
          "rssIdleMb": 800.25,
          "rssPaclitaxelMb": 785.41,
          "runs": 3,
          "processes": 4,
          "method": "Playwright headless Chromium; summed process-tree physical footprints; median of three.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://gsmithboltz.github.io/BoltzDraw/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/boltzdraw/simple.svg",
            "note": "Current SMILES imported; native SVG and MOL saved.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/boltzdraw/complex.svg",
            "note": "Current SMILES imported; native SVG and MOL saved.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/boltzdraw/threed.png",
            "note": "SDF coordinates shown in rotatable 3D viewer; MOL saved.",
            "structure": "match"
          }
        ],
        "observations": [
          "The About dialog identifies the embedded editor as Ketcher 2.24.0; no BoltzDraw version was shown.",
          "The first SMILES import appeared on canvas while the properties panel initially showed zero molecules.",
          "Caffeine used aromatic circles and colored heteroatom labels by default.",
          "The 3D viewer showed a flat SMILES-derived drawing; the SDF supplied spatial coordinates.",
          "The exported cholesterol MOL retained nonzero Z coordinates but was tagged 2D."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 287,
        "transferBytes": 2221536
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/GSmithBoltz/BoltzDraw",
        "https://github.com/GSmithBoltz/BoltzDraw/blob/3fd0fa29818410961192d873944c33682c75f03d/README.md"
      ]
    },
    {
      "id": "p120",
      "slug": "chemliora",
      "name": "Chemliora",
      "rank": 22,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "OpenChemLib",
          "GANSU Lite",
          "MOrbVis"
        ],
        "source": "https://chem-analyses.com/tools/structure-editor/licenses.html",
        "note": "License confirms chemistry libraries and optional orbital tools; canvas provenance remains unestablished."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Custom SVG bond and atom renderer",
        "language": "JavaScript",
        "source": "https://chem-analyses.com/tools/structure-editor/js/structure-svg-renderer.js"
      },
      "enginesChecked": true,
      "languageNote": "HTML and CSS provide layout and styling.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "No documented embedding route; absent framing restrictions do not confirm support."
      },
      "otherLanguages": [
        {
          "language": "Java",
          "role": "OpenChemLib compiled to JavaScript"
        },
        {
          "language": "TypeScript",
          "role": "GANSU Lite and MOrbVis modules"
        },
        {
          "language": "Rust",
          "role": "GANSU Lite kernels (WebAssembly)"
        }
      ],
      "thirdParty": {
        "summary": "BSD-3-Clause/MIT/Zlib components; NMR calibration credits nmrshiftdb2's custom share-alike database license with an OSI-approved software condition. Raw measurements are not bundled.",
        "source": "https://chem-analyses.com/tools/structure-editor/licenses.html",
        "notice": null,
        "libraries": [
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          },
          {
            "name": "GANSU Lite",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Yasuaki-Ito/GANSU-Lite/blob/main/LICENSE"
          },
          {
            "name": "MOrbVis",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Yasuaki-Ito/morbvis/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It creates styled 2D structures and reaction figures with vector SVG export for publication.",
      "summary": "A browser editor for drawing chemical structures, reaction schemes and polymers, with image export and approximate spectral predictions.",
      "website": "https://chem-analyses.com/tools/structure-editor/",
      "repo": null,
      "docs": "https://chem-analyses.com/tools/structure-editor/help",
      "vendor": "Chem-Analyses Lab",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free to use; third-party licenses do not grant redistribution rights to the whole application.",
        "source": "https://chem-analyses.com/tools/structure-editor/licenses"
      },
      "price": {
        "text": "Free",
        "source": "https://chem-analyses.com/tools/structure-editor/help"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": "15.19.0",
        "date": "2026-11-05",
        "source": "https://chem-analyses.com/updates/"
      },
      "engine": {
        "rendering": "Custom SVG renderer; HTML canvas for PNG export",
        "chemistry": "OpenChemLib JS",
        "ui": "HTML/CSS and vanilla JavaScript",
        "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Drew single; changed it to double and triple.",
          "shot": {
            "image": "evidence/chemliora/f-bonds-core.webp",
            "caption": "Single, double, and triple bond tools in the drawing palette."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Converted a bond to solid wedge, hashed wedge, and wavy.",
          "shot": {
            "image": "evidence/chemliora/f-stereo-bonds.webp",
            "caption": "Wedge, hashed wedge, and wavy bond tools in the palette."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Coordination and hydrogen contacts are annotations, excluded from chemical exports."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Placed benzene and cyclohexane rings.",
          "shot": {
            "image": "evidence/chemliora/f-rings.webp",
            "caption": "Ring tools beside benzene and cyclohexane drawings."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "partial",
          "evidence": "source",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "Freehand zigzags create up to eight bonds; no length-drag tool."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Placed anthracene from the template library."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Favorites are stored only in the current browser."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": null,
          "shot": {
            "image": "evidence/chemliora/f-abbreviations.webp",
            "caption": "Substituent palette lists Ph, Boc, OMe, and other labels."
          }
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": null,
          "shot": {
            "image": "evidence/chemliora/f-atom-labels.webp",
            "caption": "Element palette and nitrogen and oxygen labels on the canvas."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Lone pairs are drawing annotations.",
          "shot": {
            "image": "evidence/chemliora/f-radicals.webp",
            "caption": "Charge and electron tools include single and paired dots."
          }
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "Rectangle selection, rotation and flips; no lasso or resize controls."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/chemliora/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the drawing canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Drew curved arrow; selection exposed endpoints and bend controls.",
          "shot": {
            "image": "evidence/chemliora/f-mechanism-arrows.webp",
            "caption": "Curved arrow on the canvas beside the reaction tools."
          }
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "Manual atom-map numbers are preserved in chemical exports."
        },
        "orbitals": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chem-analyses.com/articles/chemliora-feature-evolution-2026/",
          "note": "Simplified calculated HOMO/LUMO shapes in analysis view."
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "Only plain reaction-condition text; no font or script formatting."
        },
        "shapes": {
          "status": "partial",
          "evidence": "source",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "Polymer brackets and curved arrows only; no general shape objects.",
          "shot": {
            "image": "evidence/chemliora/f-shapes.webp",
            "caption": "Polymer bracket tool in the advanced toolbar."
          }
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/articles/chemliora-ethyl-acetate-structure-guide/",
          "note": null,
          "shot": {
            "image": "evidence/chemliora/f-cleanup.webp",
            "caption": "Tidy structure button above the drawing canvas."
          },
          "engine": {
            "library": "OpenChemLib JS (JavaScript, inventCoordinates)",
            "source": "https://chem-analyses.com/tools/structure-editor/js/structure-formats.js"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "Nature and ACS presets."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "Imported CDS settings persist in browser storage and JSON."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "Individual atom-label colors."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": null,
          "engine": {
            "library": "OpenChemLib JS (JavaScript valence and aromaticity analysis); In-house (JavaScript charge checks)",
            "source": "https://chem-analyses.com/tools/structure-editor/js/structure-check.js"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Labels omit structures exceeding 200 atoms.",
          "shot": {
            "image": "evidence/chemliora/f-stereo-perception.webp",
            "caption": "Structure drawing with a Z label beside the double bond."
          },
          "engine": {
            "library": "OpenChemLib JS (JavaScript CIP parity calculation)",
            "source": "https://chem-analyses.com/tools/structure-editor/js/stereo-labels.js"
          }
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chem-analyses.com/articles/chemliora-ethyl-acetate-structure-guide/",
          "note": "Canvas correct; explicit-hydrogen SDF property table overcounts hydrogens.",
          "shot": {
            "image": "evidence/chemliora/f-formula-mass.webp",
            "caption": "Property table showing molecular formula, exact mass, and molecular weight."
          },
          "engine": {
            "library": "In-house (JavaScript formula counting and mass sums); OpenChemLib JS (JavaScript implicit-hydrogen analysis, with In-house fallback)",
            "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb2ec58f1f8b.js"
          }
        },
        "properties": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "logP and TPSA shown; explicit-hydrogen formula was incorrect.",
          "shot": {
            "image": "evidence/chemliora/f-properties.webp",
            "caption": "Property estimates table with formula, molecular weight, and logP."
          },
          "engine": {
            "library": "OpenChemLib JS (JavaScript, MoleculeProperties logP and polarSurfaceArea)",
            "source": "https://chem-analyses.com/tools/structure-editor/js/property-estimates.js"
          }
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "No name input found; SMILES field rejected caffeine."
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "PubChem lookup returned caffeine's systematic name.",
          "engine": {
            "library": "PubChem PUG REST web service (remote IUPACName lookup by SMILES)",
            "source": "https://chem-analyses.com/tools/structure-editor/js/molecular-identity.js"
          }
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Approximate predictions; 13C remains experimental.",
          "engine": {
            "library": "In-house (JavaScript shift rules, regression models and spectrum synthesis); OpenChemLib JS (JavaScript molecular preprocessing)",
            "source": "https://chem-analyses.com/tools/structure-editor/js/h1-nmr-predictor.js?v=1a505e54"
          }
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Monomer-based repeat-unit generation; save JSON for re-editing.",
          "shot": {
            "image": "evidence/chemliora/f-polymers.webp",
            "caption": "Polymer bracket and A–B controls in the advanced toolbar."
          }
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Generated ten conformers and rotated cholesterol in depth.",
          "shot": {
            "image": "evidence/chemliora/f-model-3d.webp",
            "caption": "3D ball-and-stick model with conformer and rotation controls."
          },
          "engine": {
            "library": "In-house (JavaScript Canvas viewer); OpenChemLib JS (JavaScript conformer generation and MMFF94S optimization)",
            "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb2ec58f1f8b.js"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Exported and reopened its own cholesterol CDXML.",
          "engine": {
            "library": "In-house (JavaScript CDXML parser and exporter)",
            "source": "https://chem-analyses.com/tools/structure-editor/js/cdxml-format.js"
          }
        },
        "cdx": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Import only.",
          "engine": {
            "library": "In-house (JavaScript binary CDX parser; import only)",
            "source": "https://chem-analyses.com/tools/structure-editor/js/cdx-format.js"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "MOL and SDF imports and exports worked.",
          "engine": {
            "library": "OpenChemLib JS (JavaScript MOL parser/writer); In-house (JavaScript SDF record handling)",
            "source": "https://chem-analyses.com/tools/structure-editor/js/structure-formats.js"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Imported SMILES and copied a generated SMILES.",
          "shot": {
            "image": "evidence/chemliora/f-smiles.webp",
            "caption": "Structure on the canvas with a SMILES generation confirmation."
          },
          "engine": {
            "library": "OpenChemLib JS (JavaScript SMILES parser and isomeric SMILES writer)",
            "source": "https://chem-analyses.com/tools/structure-editor/js/structure-formats.js"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "Saved default SVG images for all three structures."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "No PDF export; browser print preview included interface and clipped drawing."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb37a439a186.js",
          "note": "4× PNG exported; file reports 72 dpi metadata.",
          "shot": {
            "image": "evidence/chemliora/f-png-export.webp",
            "caption": "PNG output showing a cholesterol structure."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://chem-analyses.com/tools/structure-editor/help",
          "note": "No documented embedding route; absent framing restrictions do not confirm support."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chem-analyses.com/tools/structure-editor/app-bundle.cb2ec58f1f8b.js",
          "note": "Selection halos are removed from SVG and PNG exports."
        }
      },
      "caveats": [
        "CDX is import-only; PDF export is unavailable.",
        "ChemDraw compatibility is unverified; save JSON for full re-editing.",
        "Spectral predictions are approximate; 13C NMR remains experimental."
      ],
      "github": null,
      "hands": {
        "testedVersion": "15.19.0",
        "canvas": "evidence/chemliora/canvas.webp",
        "canvasLight": "evidence/chemliora/canvas-light.webp",
        "canvasDark": "evidence/chemliora/canvas-dark.webp",
        "memory": {
          "idleMb": 689,
          "paclitaxelMb": 711,
          "baselineMb": 430,
          "rssIdleMb": 1181.97,
          "rssPaclitaxelMb": 1216.67,
          "runs": 3,
          "processes": 7,
          "method": "Playwright Chromium process tree; summed phys_footprint; three-run medians.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Hosted version now reports 15.20.0."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://chem-analyses.com/tools/structure-editor/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemliora/simple.svg",
            "note": "Generated automatically; MOL output saved.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemliora/complex.svg",
            "note": "Generated automatically; MOL output saved.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemliora/threed.png",
            "note": "Rotatable 3D conformer captured separately in threed-view.png.",
            "structure": "match"
          }
        ],
        "observations": [
          "The default canvas used a dark background and coloured heteroatom labels.",
          "SMILES imports generated layouts automatically without cleanup.",
          "RDKit canonical isomeric SMILES matched all three exported MOL structures.",
          "For explicit-hydrogen caffeine SDF, the property table showed C8H20N4O2 instead of C8H10N4O2.",
          "The default 3D view used ball-and-stick with hydrogens."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 713,
        "transferBytes": 939182
      },
      "downloadBytes": null,
      "references": [
        "https://chem-analyses.com/tools/structure-editor/",
        "https://chem-analyses.com/tools/structure-editor/"
      ]
    },
    {
      "id": "p127",
      "slug": "molbrett",
      "name": "Molbrett",
      "rank": 23,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "Ketcher",
          "Indigo"
        ],
        "source": "https://molbrett.elsci.io/static/js/main-page.bundle.06dde1e7.js",
        "note": "Embeds Ketcher with standalone Indigo chemistry; the surrounding whiteboard uses Excalidraw."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "Free cloud",
          "level": "free",
          "price": "$0 (2026-11-06)"
        },
        {
          "name": "Local installation",
          "level": "paid",
          "price": "Quote; free for academia (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher Raphael/SVG; whiteboard server undisclosed",
        "language": "TypeScript",
        "source": "https://molbrett.elsci.io/static/js/main-page.bundle.06dde1e7.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "file",
        "url": "https://elsci.io/img/molbrett-landing.7ed5bb73.mp4",
        "embed": null,
        "title": "Draw molecules with Molbrett",
        "author": null,
        "linkedFrom": "https://elsci.io/molbrett/index.html",
        "poster": null
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Local deployment requires license; free for academia.",
        "how": "Hosted X-Frame-Options DENY; no alternative embed route documented."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Molbrett UI and Miew 3D viewer"
        },
        {
          "language": "C++",
          "role": "Indigo chemistry compiled to WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": "MIT/Apache-2.0 components; DOMPurify also offers MPL-2.0; bundled Excalifont/Xiaolai fonts use OFL-1.1.",
        "source": "https://molbrett.elsci.io/static/js/main-page.bundle.06dde1e7.js.LICENSE.txt",
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Combines editable 2D chemical structures, annotations, diagram layout, and vector export for complete chemical figures.",
      "summary": "A browser whiteboard for drawing chemical structures, synthetic routes, and annotated chemistry diagrams.",
      "website": "https://elsci.io/molbrett/index.html",
      "repo": null,
      "docs": "https://elsci.io/docs/molbrett/index.html",
      "vendor": "Elsci LLC",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Free cloud service; local deployment requires a license, free for academia.",
        "source": "https://elsci.io/docs/molbrett/index.html"
      },
      "price": {
        "text": "Free cloud; local academic licenses free; other local pricing by enquiry (2026-11-05).",
        "source": "https://elsci.io/docs/molbrett/index.html"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://elsci.io/docs/molbrett/installation.html"
      },
      "engine": {
        "rendering": "Excalidraw HTML canvas whiteboard displaying SVG molecular images",
        "chemistry": "Indigo through embedded Ketcher standalone",
        "ui": "React, Ketcher, and Excalidraw",
        "source": "https://molbrett.elsci.io/static/js/main-page.bundle.06dde1e7.js"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-bonds",
          "note": "Drew single, double and triple bonds."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-bonds",
          "note": "Drew solid wedge, hashed wedge and wavy bonds.",
          "shot": {
            "image": "evidence/molbrett/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedges in a molecular drawing."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-bonds",
          "note": "Dative and hydrogen bonds in Ketcher."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Placed benzene; other ring sizes appear in the toolbar.",
          "shot": {
            "image": "evidence/molbrett/f-rings.webp",
            "caption": "Ring tools and aromatic rings in the editor."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/editor/tool/chain.ts#L150",
          "note": "Dragging determines chain length in Ketcher."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Selected and placed adenine from the structure library."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Ketcher saves drawings into its User Templates library."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#expandingcontracting-s-group",
          "note": "Ketcher functional groups expand and contract chemically."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/images/13_atom_propn.png",
          "note": "Ketcher atom dialog includes label, alias, charge, and isotope."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/images/13_atom_propn.png",
          "note": "Radical setting in Ketcher's atom properties."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-atoms",
          "note": "Click an atom and type its replacement label."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#changing-structure-display",
          "note": "Ketcher lasso/rotate/flip; whiteboard objects can be resized."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-reactions",
          "note": "Drew forward and equilibrium arrows."
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Drew a curved arrow; later editing was not checked."
        },
        "reaction-data": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#reaction-specific-format-support",
          "note": "Reaction drawing generated an RXN preview."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-reactions",
          "note": "Manual mapping, automatic mapping, and unmapping in Ketcher."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/elsci-io/excalidraw/blob/bf509553b4581be9a8db2d0e2388f690f31349e0/packages/element/src/types.ts",
          "note": "Whiteboard fonts supported; subscript/superscript formatting is confined to Ketcher."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/elsci-io/excalidraw/blob/bf509553b4581be9a8db2d0e2388f690f31349e0/README.md#features",
          "note": "Excalidraw shapes, lines, and free drawing."
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/elsci-io/excalidraw/blob/bf509553b4581be9a8db2d0e2388f690f31349e0/packages/excalidraw/actions/actionAlign.tsx",
          "note": "Align selected whiteboard objects."
        },
        "groups": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/elsci-io/excalidraw/blob/bf509553b4581be9a8db2d0e2388f690f31349e0/packages/excalidraw/actions/actionGroup.tsx",
          "note": "Group and ungroup whiteboard objects."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#ketcher-molecules-mode",
          "note": "Ketcher normalizes bond lengths and angles.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly, Ketcher standalone browser worker)",
            "source": "https://molbrett.elsci.io/static/js/8300.bundle.ccb3f267.js"
          }
        },
        "journal-styles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#acs-american-chemical-society-style",
          "note": "ACS preset applies in Ketcher, not to whiteboard styling."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Settings provide Save to File and Open from File."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/elsci-io/excalidraw/blob/bf509553b4581be9a8db2d0e2388f690f31349e0/packages/excalidraw/actions/actionProperties.tsx#L294",
          "note": "Selected whiteboard objects have individual stroke and fill colors."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/elsci-io/excalidraw/blob/bf509553b4581be9a8db2d0e2388f690f31349e0/README.md#features",
          "note": "Raster pictures on the Excalidraw whiteboard."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-atoms",
          "note": "Ketcher underlines invalid valences in red.",
          "engine": {
            "library": "Ketcher (TypeScript valence checks); Indigo (WebAssembly structure checks)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/state/server/index.js"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#stereochemistry",
          "note": "Ketcher computes R/S, r/s, and E/Z descriptors.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly, Ketcher standalone browser worker)",
            "source": "https://molbrett.elsci.io/static/js/8300.bundle.ccb3f267.js"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/images/6_calc_values.png",
          "note": "Caffeine: C8H10N4O2, molecular weight 194.194.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly, Ketcher standalone browser worker)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/state/server/index.js"
          }
        },
        "properties": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Calculated Values showed formula, masses and elemental analysis only."
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Entering caffeine in Open structure produced an editor error."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in editor controls or save formats."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-r-groups",
          "note": "Ketcher supports R-groups, atom lists, and attachment logic."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#marking-s-groups",
          "note": "Ketcher SRU polymers and copolymer S-groups."
        },
        "biomolecules": {
          "status": "no",
          "evidence": "source",
          "source": "https://molbrett.elsci.io/static/js/main-page.bundle.06dde1e7.js",
          "note": "Dedicated macromolecule authoring is explicitly disabled."
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts#L720",
          "note": "Recognition explicitly unsupported in the embedded standalone service."
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#3d-viewer",
          "note": "SDF model rotated in depth; SMILES model was flat.",
          "shot": {
            "image": "evidence/molbrett/f-model-3d.webp",
            "caption": "Molecular model in the 3D viewing dialog."
          },
          "engine": {
            "library": "Miew (JavaScript/Three.js via miew-react in Ketcher)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/modal/components/process/Miew/Miew.tsx"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Generated CDXML preview reimported; file download failed in host.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly, Ketcher standalone browser worker)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Structure import/export through Ketcher; whiteboards use Excalidraw format.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly, Ketcher standalone browser worker)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts"
          }
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "MOL and SDF opened; MOL preview generated, download absent.",
          "engine": {
            "library": "Ketcher MolSerializer (TypeScript, MOL V2000); Indigo 1.46.0 (WebAssembly, MOL V3000/SDF)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/formatters/formatterFactory.ts"
          },
          "plan": "Free cloud",
          "planLevel": "free"
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "SMILES imported and output previews generated for three fixtures.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly, Ketcher standalone browser worker)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/formatters/formatterFactory.ts"
          },
          "plan": "Free cloud",
          "planLevel": "free"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://elsci.io/docs/molbrett/index.html",
          "note": "Paste InChI directly onto the whiteboard.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly, Ketcher standalone browser worker)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts"
          },
          "plan": "Free cloud",
          "planLevel": "free"
        },
        "rxn": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/ketcher-autotests/tests/specs/File-Management/Open-And-Save-Files/Rxn-Files/rxn-files.spec.ts#L44",
          "note": "RXN preview generated for a drawing with arrows."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/elsci-io/excalidraw/blob/bf509553b4581be9a8db2d0e2388f690f31349e0/README.md#features",
          "note": "Board SVG downloads generated for all three fixtures."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Board export offered PNG and SVG, with no PDF option."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Default 2× PNG exported; no DPI control was shown.",
          "shot": {
            "image": "evidence/molbrett/f-png-export.webp",
            "caption": "Caffeine structure exported as a PNG image."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://molbrett.elsci.io/scene",
          "note": "Hosted X-Frame-Options DENY; no alternative embed route documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Structures are edited in embedded Ketcher 3.18.0, separately from the diagram whiteboard.",
        "Macromolecule mode and image recognition are unavailable in this integration.",
        "Local installation is a licensed Docker server; vendor credentials are required."
      ],
      "github": null,
      "hands": {
        "testedVersion": "06dde1e7",
        "canvas": "evidence/molbrett/canvas.webp",
        "canvasLight": "evidence/molbrett/canvas-light.webp",
        "canvasDark": "evidence/molbrett/canvas-dark.webp",
        "memory": {
          "idleMb": 540.93,
          "paclitaxelMb": 644.73,
          "baselineMb": 381.79,
          "rssIdleMb": 1068.03,
          "rssPaclitaxelMb": 1219.64,
          "runs": 3,
          "processes": 7,
          "method": "Playwright Chromium process-tree physical footprint; MiB, median of three runs.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Black bonds have very low contrast on the dark canvas."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://molbrett.elsci.io/scene",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molbrett/simple.svg",
            "note": "Default SMILES layout; board SVG exported after placing the structure.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molbrett/complex.svg",
            "note": "Default SMILES layout includes wedges and an ABS label.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/molbrett/threed.png",
            "note": "Rotatable SDF model; default viewport saved as threed-view.png.",
            "structure": "match"
          }
        ],
        "observations": [
          "Molbrett main bundle identifier was 06dde1e7; embedded Ketcher About reports 3.18.0.",
          "SMILES layouts use colored heteroatoms and terminal carbon labels in the editor.",
          "SDF viewer defaults to lines on a gray background with explicit hydrogens.",
          "Chemical file download did not appear in the isolated WebKit host; SMILES previews were transcribed.",
          "RDKit canonicalized all three transcribed outputs identically to their fixture SMILES."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 2544,
        "transferBytes": 1808433
      },
      "downloadBytes": null,
      "references": [
        "https://elsci.io/molbrett/index.html",
        "https://elsci.io/docs/molbrett/index.html"
      ]
    },
    {
      "id": "p137",
      "slug": "zeanium-molecule-drawer",
      "name": "Zeanium Molecule Drawer",
      "rank": 24,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Public materials do not establish canvas provenance or chemistry dependencies."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "In-house SVG renderer",
        "language": "JavaScript",
        "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js"
      },
      "enginesChecked": true,
      "languageNote": "Source languages not publicly stated; generated JavaScript excluded.",
      "video": {
        "provider": "file",
        "url": "https://zeanium.net/video/zeandraw-demo.mp4",
        "embed": null,
        "title": "ZeanDraw in action: drawing benzoic acid and spinning it in 3D",
        "author": null,
        "linkedFrom": "https://zeanium.net/",
        "poster": "https://zeanium.net/video/zeandraw-demo-poster.webp"
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "X-Frame-Options: DENY",
        "how": "Hosted editor blocks framing; no documented SDK found."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": "Identified browser components: React and Three.js (MIT), Lucide icons (ISC), and Inter/Orbitron fonts (SIL OFL-1.1: redistributed fonts and derivatives retain OFL).",
        "source": "https://zeanium.net/assets/index-BQLiMrmp.js",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Editable drawing documents, reaction schemes, journal presets, and SVG export support standalone publication-oriented 2D figures.",
      "summary": "A free browser editor for drawing molecular structures, reaction schemes, and chemical figures with vector export.",
      "website": "https://zeanium.net/draw/",
      "repo": null,
      "docs": "https://zeanium.net/draw/",
      "vendor": "Zeanium",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free browser access; no published software license identified.",
        "source": "https://zeanium.net/draw/"
      },
      "price": {
        "text": "Free",
        "source": "https://zeanium.net/draw/"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://zeanium.net/draw/"
      },
      "engine": {
        "rendering": "SVG for 2D drawing and export; HTML canvas for PNG; Three.js/WebGL for 3D.",
        "chemistry": "Custom JavaScript chemistry routines",
        "ui": "React",
        "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/draw/",
          "note": "Drew single bond and cycled through double and triple.",
          "shot": {
            "image": "evidence/zeanium-molecule-drawer/f-bonds-core.webp",
            "caption": "Single-bond tool instructions describe cycling through bond orders."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Drew solid wedge, hashed wedge and wavy bond."
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Bond model supports orders 1–3 and graphical styles, without dative bonds."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/draw/",
          "note": "Placed benzene; multiple other ring tools are visible.",
          "shot": {
            "image": "evidence/zeanium-molecule-drawer/f-rings.webp",
            "caption": "Ring tools include aromatic and several other ring shapes."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Two cyclohexane chair templates.",
          "shot": {
            "image": "evidence/zeanium-molecule-drawer/f-conformers.webp",
            "caption": "A chair-shaped ring tool appears in the ring toolbar."
          }
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Drag to grow a zigzag carbon chain."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "VSEPR library placed boron trifluoride."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Ph, Boc, OMe and other abbreviations expand into molecular graphs."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Element labels and charges supported; isotope metadata is not represented."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Automatic and manually positioned lone pairs."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Hover atoms to change elements; 1/2/3 set hovered bond order."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Lasso, rotation, and flips; no selected-structure resizing."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/zeanium-molecule-drawer/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the drawing canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Drew curved electron arrow from bond to atom.",
          "shot": {
            "image": "evidence/zeanium-molecule-drawer/f-mechanism-arrows.webp",
            "caption": "A curved electron arrow starts from a bond."
          }
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Chemical-symbol pickers include ‡, charges, radical dots, Δ, and hν."
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Plain multiline captions use preset fonts; no rich-text formatting."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Resizable brackets and editable freehand curves."
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Line up selected molecules and symbols; distribute gaps evenly."
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Repositions chains and branches; rings remain fixed.",
          "engine": {
            "library": "In-house (JavaScript, browser)",
            "source": "https://zeanium.net/assets/smiles-DtxJ4bPl.js"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "ACS 1996, RSC, Wiley, and other journal presets."
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Mechanism and freehand arrows have individual color controls."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Flags excess valence, overlapping atoms, and undefined stereocenters.",
          "shot": {
            "image": "evidence/zeanium-molecule-drawer/f-valence-check.webp",
            "caption": "The structure check flags ten items to review."
          },
          "engine": {
            "library": "In-house (JavaScript, browser)",
            "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Computes R/S centers and E/Z double-bond descriptors.",
          "engine": {
            "library": "In-house (JavaScript, browser)",
            "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Caffeine displayed C8H10N4O2 and 194.19 g/mol.",
          "shot": {
            "image": "evidence/zeanium-molecule-drawer/f-formula-mass.webp",
            "caption": "Caffeine drawing with molecular formula and mass displayed below."
          },
          "engine": {
            "library": "In-house (JavaScript, browser)",
            "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/chemDescriptors-BcucR2DD.js",
          "note": "Properties dialog displayed estimated logP and TPSA.",
          "engine": {
            "library": "In-house (JavaScript Ertl TPSA and partial Wildman-Crippen logP)",
            "source": "https://zeanium.net/assets/chemDescriptors-BcucR2DD.js"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "PubChem search for aspirin produced a structure.",
          "engine": {
            "library": "PubChem PUG REST (remote web service) + In-house JavaScript SMILES parser",
            "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js"
          }
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Action search found name lookup only, not structure naming."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "PubChem aspirin lookup returned a structure.",
          "engine": {
            "library": "PubChem PUG REST (remote web service)",
            "source": "https://zeanium.net/assets/pubchemClient-BrnAGLt-.js"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Cholesterol model built automatically and rotated in depth.",
          "shot": {
            "image": "evidence/zeanium-molecule-drawer/f-model-3d.webp",
            "caption": "Ball-and-stick 3D model of the molecule."
          },
          "engine": {
            "library": "Three.js r185 + OrbitControls (JavaScript/WebGL, browser)",
            "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Selected CDXML; drawing stayed unchanged; no export option."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "MOL import/export and single SDF import worked; no SDF export.",
          "engine": {
            "library": "In-house (JavaScript MOL V2000 parser/writer; no SDF)",
            "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/smiles-DtxJ4bPl.js",
          "note": "Read and copied SMILES; importer discards stereochemistry.",
          "engine": {
            "library": "In-house (JavaScript parser/writer; stereo and isotopes omitted)",
            "source": "https://zeanium.net/assets/smiles-DtxJ4bPl.js"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zeanium.net/draw/",
          "note": "Exported SVG files for all three fixtures."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "File menu and action search offered no PDF export."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "PNG exported at 2000 pixels wide; no DPI control shown.",
          "shot": {
            "image": "evidence/zeanium-molecule-drawer/f-png-export.webp",
            "caption": "Exported PNG image of a molecular drawing."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://zeanium.net/draw/",
          "note": "Hosted editor blocks framing; no documented SDK found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://zeanium.net/assets/MoleculeDrawerPage-JSxxZFpe.js",
          "note": "Selection backgrounds only; stripped from SVG and PNG exports."
        }
      },
      "caveats": [
        "SMILES interchange omits stereochemistry and isotope information.",
        "MOL support is V2000 only; text and arrows require .zeandraw files.",
        "Offline operation is unverified; resource caching requires a prior online visit."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": "evidence/zeanium-molecule-drawer/canvas.webp",
        "canvasLight": "evidence/zeanium-molecule-drawer/canvas-light.webp",
        "canvasDark": "evidence/zeanium-molecule-drawer/canvas-dark.webp",
        "memory": {
          "idleMb": 478,
          "paclitaxelMb": 682,
          "baselineMb": 271,
          "rssIdleMb": 1033.28,
          "rssPaclitaxelMb": 1072.05,
          "runs": 3,
          "processes": 7,
          "method": "Playwright Edge Chromium; summed process-tree phys_footprint; median of three runs.",
          "note": "SMILES import discards stereochemistry."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Canvas switches; surrounding interface stays dark."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://zeanium.net/draw/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/zeanium-molecule-drawer/simple.svg",
            "note": null,
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/zeanium-molecule-drawer/complex.svg",
            "note": "SMILES stereochemistry discarded; several bonds and labels overlap.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/zeanium-molecule-drawer/threed.png",
            "note": "Rotating 3D view saved separately; SMILES stereochemistry discarded.",
            "structure": "stereo"
          }
        ],
        "observations": [
          "No numbered version appeared; the served editor bundle identifies the build.",
          "Default style was Adv. Synth. Catal. with colored heteroatoms.",
          "Paclitaxel layout contains overlapping bonds and labels.",
          "The import dialog says SMILES stereochemistry is not imported.",
          "The default 3D preview spins and shows hydrogens and lone pairs."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 382,
        "transferBytes": 845580
      },
      "downloadBytes": null,
      "references": [
        "https://zeanium.net/draw/",
        "https://zeanium.net/draw/"
      ]
    },
    {
      "id": "p102",
      "slug": "sciformation-vectormol",
      "name": "Sciformation VectorMol",
      "rank": 25,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://sciformation.com/VecMol/info.html?embedded=&lang=en&mode=rxn",
        "note": "Vendor credits its developer; third-party notices list generic graphics and utilities."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "VectorMol molecular renderer over Raphaël",
        "language": "JavaScript",
        "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [
          "iframe"
        ],
        "package": null,
        "limit": "CC-BY-NC-SA-3.0; commercial use requires an individual license",
        "how": "Iframe editor exposes getMolRxnfile()/setMolRxnfile(); embedded=true hides load/save controls."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "MIT/Zlib libraries, BSL-1.0 Clipper lasso code, and public-domain Tango icons.",
        "source": "https://sciformation.com/VecMol/info.html?embedded=&lang=en&mode=rxn",
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "Its documented iframe and JavaScript interfaces primarily provide molecular and reaction input for other applications.",
      "summary": "A browser editor for drawing molecular structures and single-step reactions, with iframe embedding and SVG export.",
      "website": "https://sciformation.com/vectormol.html?lang=en",
      "repo": null,
      "docs": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
      "vendor": "Sciformation Consulting GmbH",
      "license": {
        "kind": "source-available",
        "spdx": "CC-BY-NC-SA-3.0",
        "text": "CC BY-NC-SA 3.0 for noncommercial use; commercial use requires an individual license. Readable source available on request.",
        "source": "https://sciformation.com/VecMol/info.html?embedded=&lang=en&mode=rxn"
      },
      "price": {
        "text": "Free for noncommercial use; commercial pricing on request (2026-11-05).",
        "source": "https://sciformation.com/VecMol/info.html?embedded=&lang=en&mode=rxn"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": true,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://sciformation.com/VecMol/info.html?embedded=&lang=en&mode=rxn"
      },
      "engine": {
        "rendering": "Raphaël SVG graphics on screen and in SVG exports",
        "chemistry": "In-house JavaScript molecular model and geometry optimizer",
        "ui": "Custom HTML controls with jQuery",
        "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Drew single, double, and triple bonds.",
          "shot": {
            "image": "evidence/sciformation-vectormol/f-bonds-core.webp",
            "caption": "Single, triple and aromatic double bonds on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/sciformation-vectormol/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Coordination uses unspecified bonds rather than directed dative bonds."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/templates/0.mol",
          "note": "Phenyl shortcut inserted an aromatic ring.",
          "shot": {
            "image": "evidence/sciformation-vectormol/f-rings.webp",
            "caption": "A benzene ring on the drawing canvas."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Chain tool creates zigzag backbones by dragging."
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25",
          "note": "Phenyl shortcut worked; broader library not verified."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Requires template mode and access to the installation's templates folder."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Ph inserted a phenyl structure."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Element labels, charges, isotope masses and explicit hydrogen counts."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Atom radical dots and electron-pair modifiers."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Number and letter shortcuts changed drawing tools."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25",
          "note": "Lasso, rotate, flip; Ctrl+wheel scales the active selection."
        },
        "perspective": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "3D rotation changed the selected structure's projection.",
          "shot": {
            "image": "evidence/sciformation-vectormol/f-perspective.webp",
            "caption": "Cholesterol structure displayed in 3D mode with explicit hydrogens."
          }
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25",
          "note": "Forward arrow drawn; other arrow types not found.",
          "shot": {
            "image": "evidence/sciformation-vectormol/f-reaction-arrows.webp",
            "caption": "A forward reaction arrow beside a benzene ring."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Arrow tool drew a straight reaction arrow; no curved tool found."
        },
        "reaction-data": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Reaction mode wrote RXN; reaction round-trip not checked."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Chemical substructure groups only; disconnected objects cannot be grouped."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25",
          "note": "Toolbar command optimizes bond geometry in two dimensions.",
          "engine": {
            "library": "In-house (JavaScript)",
            "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25",
          "note": "Individual atom colors through JavaScript setAtomColors()."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Caffeine displayed formula and two masses.",
          "shot": {
            "image": "evidence/sciformation-vectormol/f-formula-mass.webp",
            "caption": "Caffeine structure with its molecular formula and two mass values."
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Entering caffeine in atom field did not create caffeine."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Clicking formula did not produce a name; no command found."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sciformation.com/VecMol/index.html?lang=en&mode=rxn",
          "note": "Toolbar provides R-group and wildcard atom choices."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Chemical repeat groups support variable polymers and fixed-count oligomers."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25",
          "note": "Imported 3D coordinates rotated in depth on canvas.",
          "shot": {
            "image": "evidence/sciformation-vectormol/f-model-3d.webp",
            "caption": "Cholesterol structure displayed in 3D mode with explicit hydrogens."
          },
          "engine": {
            "library": "In-house (JavaScript; line-bond models)",
            "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25",
          "note": "Simple CDXML imported; CDXML export not found.",
          "engine": {
            "library": "In-house (JavaScript; CDXML import only)",
            "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25"
          }
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Opened MOL and SDF; molecule mode saved MOL.",
          "engine": {
            "library": "In-house (JavaScript; MOL read/write)",
            "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25"
          }
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Opening caffeine SMILES file left canvas empty."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Reaction mode saved RXN; import not checked."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "SVG button downloaded structure SVG.",
          "shot": {
            "image": "evidence/sciformation-vectormol/f-svg-export.webp",
            "caption": "SVG button in the toolbar above the drawing canvas."
          }
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Save controls offered RXN or SVG, not PDF."
        },
        "png-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Save controls offered RXN or SVG, not PNG."
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciformation.com/vectormol.html?lang=en",
          "note": "Vendor claim: ChemDraw copy/paste via MOL/CDXML, depending on browser."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "JavaScript getMolRxnfile() and setMolRxnfile(String) exchange structures."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol",
          "note": "Iframe editor exposes getMolRxnfile()/setMolRxnfile(); embedded=true hides load/save controls."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciformation.com/VecMol/svg-mol-full.min.min.js?version=2026-08-25",
          "note": "API highlights atoms with blue surrounding boxes; SVG retains them."
        }
      },
      "caveats": [
        "Commercial use requires an individual license; the hosted editor is labeled 'test use only'.",
        "Only single-step reactions are documented; drawing another arrow replaces the first.",
        "The manual denies external clipboard access, while current code and the product page support ChemDraw interchange."
      ],
      "github": null,
      "hands": {
        "testedVersion": "2026-08-25",
        "canvas": "evidence/sciformation-vectormol/canvas.webp",
        "canvasLight": "evidence/sciformation-vectormol/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 506.4,
          "paclitaxelMb": 505.51,
          "baselineMb": 416.49,
          "rssIdleMb": 1046.64,
          "rssPaclitaxelMb": 1057.05,
          "runs": 3,
          "processes": 7,
          "method": "Fresh Playwright Chromium; summed process-tree physical footprints; medians in MiB.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Light and dark browser preferences rendered identically."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://sciformation.com/VecMol/index.html?lang=en&mode=rxn",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/sciformation-vectormol/simple.svg",
            "note": "SMILES file produced no structure; MOL opened.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/sciformation-vectormol/complex.svg",
            "note": null,
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/sciformation-vectormol/threed.png",
            "note": "3D coordinates rotate on the drawing canvas; explicit hydrogens overlap.",
            "structure": "match"
          }
        ],
        "observations": [
          "The script URL carries build identifier 2026-08-25; no semantic version was shown.",
          "The public demo footer says test use only.",
          "MOL exports in molecule mode matched fixture stereochemistry in RDKit.",
          "The cholesterol SDF displayed all explicit hydrogens in a wireframe projection.",
          "Reaction mode saves RXN; molecule mode saves MOL."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 4929,
        "transferBytes": 1282106
      },
      "downloadBytes": null,
      "references": [
        "https://sciformation.com/vectormol.html?lang=en",
        "https://sciformation.com/VecMol/help.html?embedded=&lang=en&mode=mol"
      ]
    },
    {
      "id": "p51",
      "slug": "bondforge",
      "name": "BondForge",
      "rank": 26,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit",
          "OPSIN"
        ],
        "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/ui/main_window.py",
        "note": "Custom Qt drawing scene; OPSIN is optional."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "BondForge molecular renderer",
        "language": "Python",
        "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/items/bond_item.py#L72"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-3.0-or-later",
        "how": "Standalone Qt application; no documented editor embedding interface found."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "RDKit chemistry backend"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-3.0 PySide6/Qt and BSD-3-Clause RDKit/NumPy; optional naming uses MIT-licensed py2opsin/OPSIN.",
        "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/pyproject.toml",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It creates standalone 2D drawing documents with structures, reaction arrows, captions and vector exports.",
      "summary": "BondForge is a desktop application for drawing chemical structures, reaction schemes, and annotated figures.",
      "website": "https://github.com/Grimlock5310/BondForge",
      "repo": "https://github.com/Grimlock5310/BondForge",
      "docs": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md",
      "vendor": "BondForge Contributors",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-3.0-or-later",
        "text": "GNU GPL version 3 or later.",
        "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/pyproject.toml"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/Grimlock5310/BondForge/releases"
      },
      "engine": {
        "rendering": "Qt QGraphicsView/QGraphicsScene with QPainter; QSvgGenerator and QPdfWriter for vector exports",
        "chemistry": "RDKit; optional OPSIN for name-to-structure",
        "ui": "PySide6 (Qt for Python)",
        "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/export.py"
      },
      "languages": [
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#status",
          "note": "Single, double, triple tools produced ethane, ethene, and ethyne."
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/items/bond_item.py",
          "note": "Solid and hashed wedges export correctly; no wavy tool visible.",
          "shot": {
            "image": "evidence/bondforge/f-stereo-bonds.webp",
            "caption": "Exported solid and hashed wedge bonds."
          }
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/items/bond_item.py",
          "note": "Dative data renders as ordinary lines; specialist bond rendering is absent."
        },
        "double-bond-side": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/items/bond_item.py",
          "note": "Double bonds are always centered; left/right positioning is unavailable."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/ui/main_window.py",
          "note": "Aromatic six-membered ring inserted; sizes three through eight visible.",
          "shot": {
            "image": "evidence/bondforge/f-rings.webp",
            "caption": "Exported six-membered aromatic ring."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/tools/bond_tool.py",
          "note": "Repeated clicks extend zigzags; dragging creates only one bond."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/core/model/templates.py",
          "note": "Inserted built-in IgG antibody template and exported SVG."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/items/atom_item.py",
          "note": "Elements and charges display; stored isotopes are not drawn."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#status",
          "note": null
        },
        "selection-tools": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/ui/main_window.py",
          "note": "Documented Select event forwarding uses no-op placeholder handlers."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#status",
          "note": "Forward and equilibrium arrows drawn and exported distinctly.",
          "shot": {
            "image": "evidence/bondforge/f-reaction-arrows.webp",
            "caption": "Exported forward and equilibrium arrows."
          }
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/tools/arrow_tool.py",
          "note": "Pair/radical curves export; no curvature editing controls found.",
          "shot": {
            "image": "evidence/bondforge/f-mechanism-arrows.webp",
            "caption": "Exported curved pair and radical arrows."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/core/io/rxn.py",
          "note": "RXN export infers reactants/products from the first forward arrow."
        },
        "atom-mapping": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/hotkeys.py",
          "note": "Sequential numbering only; UI cannot pair corresponding reactant/product atoms."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/items/text_item.py",
          "note": "Captions support model fonts; documented HTML formatting becomes plain text."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#status",
          "note": "RDKit regenerates 2D coordinates with uniform bond lengths.",
          "engine": {
            "library": "RDKit (Python)",
            "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/engine/cleanup.py#L58"
          }
        },
        "journal-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/styles.py",
          "note": "Presets rescale geometry; documented font, linewidth and new-bond defaults remain unapplied."
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/items/bond_item.py",
          "note": "Drawing colors are hard-coded; selection changes are automatic."
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/export.py",
          "note": "Fixed single Letter page; no page-size or multipage controls."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/ui/main_window.py",
          "note": "MOL/SMILES file operations display sanitization errors.",
          "engine": {
            "library": "RDKit (Python)",
            "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/core/io/mol.py#L34"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#status",
          "note": "Fixture imports update molecular formula, molecular weight, and exact mass.",
          "shot": {
            "image": "evidence/bondforge/f-formula-mass.webp",
            "caption": "Properties panel showing molecular formula, molecular weight, and exact mass."
          },
          "engine": {
            "library": "RDKit (Python)",
            "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/engine/properties.py#L55"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#status",
          "note": "Imported structures show logP, TPSA, hydrogen bonding, and ring counts.",
          "shot": {
            "image": "evidence/bondforge/f-properties.webp",
            "caption": "Properties panel showing logP, TPSA, and other molecular values."
          },
          "engine": {
            "library": "RDKit (Python)",
            "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/engine/properties.py#L58"
          }
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/engine/naming/opsin_client.py",
          "note": "Ethanol fails: OPSIN unavailable; optional dependency version cannot resolve."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#known-parity-gaps",
          "note": "Planned for a later release."
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#status",
          "note": "Heuristic 1H and 13C predictions intended for teaching.",
          "engine": {
            "library": "In-house (Python heuristic predictor)",
            "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/engine/prediction/nmr.py#L148"
          }
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#status",
          "note": "IgG inserted; Sequence Editor and HELM export commands visible."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#roadmap",
          "note": "PubChem search is listed for future v1.0."
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/ui/viewers/viewer_3d.py",
          "note": "Cholesterol generated from SMILES; zoom and drag rotation work.",
          "shot": {
            "image": "evidence/bondforge/f-model-3d.webp",
            "caption": "BondForge 3D viewer displaying a molecular model."
          },
          "engine": {
            "library": "In-house (Python viewer); RDKit (Python conformer generation)",
            "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/ui/main_window.py#L527"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#known-parity-gaps",
          "note": "CDXML import reports: Failed to parse MOL block."
        },
        "cdx": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#known-parity-gaps",
          "note": "Legacy CDX support is described as future best-effort work."
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/core/io/mol.py",
          "note": "MOL read/write; SDF opens via All files; stereochemistry lost.",
          "engine": {
            "library": "RDKit (Python MOL reader/writer; no SDF workflow)",
            "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/core/io/mol.py#L18"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#status",
          "note": "Import/export works; cholesterol loses all eight assigned stereocenters.",
          "engine": {
            "library": "RDKit (Python)",
            "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/core/io/smiles.py#L16"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Adapter docstring mentions InChI without implementing an InChI workflow."
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/core/io/rxn.py",
          "note": "Export only; README's read/write claim exceeds implemented support."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#status",
          "note": "SVG files written; fixture depictions overlap at default scale.",
          "shot": {
            "image": "evidence/bondforge/f-svg-export.webp",
            "caption": "SVG exports showing solid and hashed wedge bonds."
          }
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/export.py",
          "note": "Default PDF written as one US Letter page."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/export.py",
          "note": "PNG writes at 72 dpi; no resolution control shown."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/__main__.py",
          "note": "Console entry point only launches the desktop GUI."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md#roadmap",
          "note": "Plugin API is listed for future v1.0."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md",
          "note": "Standalone Qt application; no documented editor embedding interface found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/bondforge/canvas/items/atom_item.py#L86-L89",
          "note": "Fixed blue atom-selection rings; no persistent highlighting controls."
        }
      },
      "caveats": [
        "Pre-alpha source code; supplied metadata has no tagged release or packaged downloads.",
        "Name-to-structure needs the optional naming dependency and a Java runtime.",
        "Documentation overstates rich text, journal formatting and several file-format workflows."
      ],
      "github": {
        "url": "https://github.com/Grimlock5310/BondForge",
        "stars": 1,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-04-07",
        "commits": 24,
        "contributors": 2,
        "pushedAt": "2026-04-11T22:17:59Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "commit b68de22",
        "canvas": "evidence/bondforge/canvas.webp",
        "canvasLight": "evidence/bondforge/canvas-light.webp",
        "canvasDark": "evidence/bondforge/canvas-dark.webp",
        "memory": {
          "idleMb": 129.33,
          "paclitaxelMb": 192.95,
          "baselineMb": null,
          "rssIdleMb": 284.62,
          "rssPaclitaxelMb": 475.09,
          "runs": 3,
          "processes": 9,
          "method": "Three-run median; process trees plus lsappinfo coalitions; phys_footprint MiB; MOL import; 10-second waits.",
          "note": "Native Qt; baseline inapplicable. Paclitaxel loads with the published collapsed depiction."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "follows system",
          "note": "Default MOL import collapses into overlapping labels in both appearances."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://github.com/Grimlock5310/BondForge.git",
        "ran": true,
        "failure": null,
        "downloadBytes": 144265,
        "installedBytes": 1444904960,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "mol",
            "image": "evidence/bondforge/simple.svg",
            "note": "SMILES and MOL produce collapsed, overlapping labels; default drawing is unreadable.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "mol",
            "image": "evidence/bondforge/complex.svg",
            "note": "SMILES and MOL produce collapsed, overlapping labels; default drawing is unreadable.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/bondforge/threed.png",
            "note": "Rotatable 3D model from SMILES; default style; zoomed to fit; stereochemistry not preserved.",
            "structure": "stereo"
          }
        ],
        "observations": [
          "Default SMILES imports collapse to overlapping labels in canvas and SVG.",
          "Default dark canvas has very low contrast black bonds.",
          "Paclitaxel and cholesterol outputs retain connectivity but lose assigned tetrahedral stereochemistry.",
          "Cholesterol 3D model rotates; initial view requires zooming out.",
          "Cholesterol PNG defaults to 158 by 142 pixels at 72 dpi.",
          "MOL fallback also produces collapsed, overlapping labels for caffeine and paclitaxel."
        ]
      },
      "perf": null,
      "downloadBytes": 144265,
      "references": [
        "https://github.com/Grimlock5310/BondForge",
        "https://github.com/Grimlock5310/BondForge/blob/b68de221eba1d9870f3d86e95c6970f9fc48f0f7/README.md"
      ]
    },
    {
      "id": "p29",
      "slug": "chemdoodle-web-components",
      "name": "ChemDoodle Web Components",
      "rank": 27,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip",
        "note": "ChemDoodle's own sketcher and chemistry implementation; derived from its desktop application."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "ChemDoodle Atom/Bond canvas renderer",
        "language": "JavaScript",
        "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip"
      },
      "enginesChecked": true,
      "languageNote": "HTML provides examples; CSS styles the interface.",
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=B3iK_btquR4",
        "embed": "https://www.youtube-nocookie.com/embed/B3iK_btquR4",
        "title": "ChemDoodle Web Sketcher Introduction",
        "author": "ChemDoodle",
        "linkedFrom": "https://web.chemdoodle.com/demos/2d-sketcher",
        "poster": "https://web.chemdoodle.com/img/chemdoodle/video_splash.png"
      },
      "embedding": {
        "methods": [
          "npm package",
          "script tag"
        ],
        "package": "react-chemdoodle",
        "limit": "Core GPLv3 or proprietary license; React wrapper MIT.",
        "how": "Embed SketcherCanvas directly or through React wrapper; separately load core scripts."
      },
      "otherLanguages": [
        {
          "language": "Java",
          "role": "Remote ChemDoodle chemistry services"
        },
        {
          "language": "GLSL",
          "role": "WebGL 3D rendering shaders"
        }
      ],
      "thirdParty": {
        "summary": "MIT and Zlib third-party code; bundled UI icons have proprietary CWC-only reuse terms.",
        "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip",
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "Primarily a JavaScript component library for embedding chemical sketchers and molecular graphics in applications.",
      "summary": "JavaScript components for embedding chemical structure drawing, molecular visualization, and chemistry interfaces in websites.",
      "website": "https://web.chemdoodle.com/",
      "repo": null,
      "docs": "https://web.chemdoodle.com/tutorial/2d-structure-canvases/sketcher-canvas",
      "vendor": "iChemLabs, LLC",
      "license": {
        "kind": "open-source",
        "spdx": null,
        "text": "GPLv3 library; separate proprietary licenses available.",
        "source": "https://web.chemdoodle.com/installation/license"
      },
      "price": {
        "text": "Free under GPLv3; proprietary licensing by quote (2026-11-05).",
        "source": "https://web.chemdoodle.com/store/proprietary-licensing"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": true,
        "offline": true
      },
      "version": {
        "name": "11.0.0",
        "date": "2025-05-17",
        "source": "https://web.chemdoodle.com/installation/changelog"
      },
      "engine": {
        "rendering": "HTML5 Canvas 2D; WebGL for 3D; canvas2svg for proprietary SVG export",
        "chemistry": "ChemDoodle informatics; optional ChemDoodle Java API through iChemLabs Cloud Services",
        "ui": "Custom JavaScript/HTML/CSS UI in the ChemDoodleWeb-uis extension",
        "source": "https://web.chemdoodle.com/docs/api"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/demos/2d-sketcher",
          "note": "Drew single bond and changed it to double and triple.",
          "shot": {
            "image": "evidence/chemdoodle-web-components/f-bonds-core.webp",
            "caption": "Bond palette beside a molecular drawing in the sketcher."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/installation/changelog",
          "note": "Changed a bond to recessed, protruding, and wavy.",
          "shot": {
            "image": "evidence/chemdoodle-web-components/f-stereo-bonds.webp",
            "caption": "A molecular drawing with solid and hashed wedge bonds."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/installation/changelog",
          "note": "Dative plus zero-order ionic/hydrogen bonds."
        },
        "double-bond-side": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/demos/2d-sketcher",
          "note": "Sketcher flips asymmetric bonds; centered rendering requires API styles."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/docs/api",
          "note": "Added benzene; other ring sizes appear in toolbar.",
          "shot": {
            "image": "evidence/chemdoodle-web-components/f-rings.webp",
            "caption": "Benzene ring on the sketcher canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Template library includes a Ring Conformers category."
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/demos/2d-sketcher",
          "note": "Drag distance determines carbon-chain length."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/docs/api",
          "note": "Attached alanine from the amino acid template library.",
          "shot": {
            "image": "evidence/chemdoodle-web-components/f-templates.webp",
            "caption": "Templates panel showing amino acid structures and alanine choices."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/docs/api",
          "note": "User-created templates persist in browser localStorage.",
          "shot": {
            "image": "evidence/chemdoodle-web-components/f-custom-templates.webp",
            "caption": "Templates panel with amino acid choices and an Add Template button."
          }
        },
        "abbreviations": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/store/proprietary-licensing",
          "note": "Proprietary label parsing and formatting; structural expansion unverified."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/demos/2d-sketcher",
          "note": "Element/isotope/charge tools; arbitrary typed labels require proprietary builds."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/demos/2d-sketcher",
          "note": "Tools add and remove radicals and lone pairs."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/demos/2d-sketcher",
          "note": "Hover shortcuts change elements, bond orders, charges, and orientation."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/demos/2d-sketcher",
          "note": "Lasso, flips, whole-figure rotation; scaling changes rendering size."
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/2d-structure-canvases/transform-canvas",
          "note": "TransformCanvas optionally rotates rendered structures in three dimensions."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/docs/2d-shapes",
          "note": "Drew synthetic and equilibrium arrows.",
          "shot": {
            "image": "evidence/chemdoodle-web-components/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the sketcher canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/docs/2d-shapes",
          "note": "Drew an electron-pair pusher between atoms.",
          "shot": {
            "image": "evidence/chemdoodle-web-components/f-mechanism-arrows.webp",
            "caption": "A curved red arrow beside a structure on the canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/docs/chemdoodle-json-format",
          "note": "JSON stores molecular reactants/products assigned to reaction arrows."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/demos/2d-sketcher",
          "note": "Drag between atoms to create reaction atom mappings."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/docs/2d-shapes",
          "note": "Editable lines, arrows, pushers, brackets, and repeat units."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/demos/2d-sketcher",
          "note": "Requires registered iChemLabs Cloud Services access.",
          "engine": {
            "library": "In-house ChemDoodle Java API (remote iChemLabs CloudServices; optimize with dimension 2)",
            "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip"
          }
        },
        "journal-styles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/advanced/styles",
          "note": "ACS 1996 example requires manual API settings."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/advanced/styles",
          "note": "Reusable JavaScript Styles objects configure bond and font settings."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/advanced/styles",
          "note": "Individual atom and bond colors through API style objects."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/docs/api",
          "note": "API places images as canvas backgrounds."
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/non-canvas/stoichiometry-table",
          "note": "Separate editable stoichiometry-table component; calculations require Cloud Services."
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/docs/ichemlabs-cloud-services",
          "note": "R/S and E/Z resolution through iChemLabs Cloud Services.",
          "engine": {
            "library": "ChemDoodle Java API (remote iChemLabs CloudServices; resolveCIP)",
            "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/demos/elemental-analysis",
          "note": "Calculator returned paclitaxel formula and molecular mass.",
          "shot": {
            "image": "evidence/chemdoodle-web-components/f-formula-mass.webp",
            "caption": "Calculations panel lists molecular formula and mass above the structure."
          },
          "engine": {
            "library": "ChemDoodle Java API (remote iChemLabs CloudServices; elementalAnalysis)",
            "source": "https://web.chemdoodle.com/demos/elemental-analysis"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/docs/ichemlabs-cloud-services",
          "note": "Calculator returned polar surface area and other descriptors.",
          "engine": {
            "library": "ChemDoodle Java API (remote iChemLabs CloudServices; calculate with xlogp2 and tpsa descriptors)",
            "source": "https://web.chemdoodle.com/demos/calculate-molecule-properties"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/demos/iupac-naming",
          "note": "Naming demo converted caffeine to a 14-atom structure.",
          "engine": {
            "library": "OPSIN (Java on remote iChemLabs CloudServices, accessed through ChemDoodle.iChemLabs.readIUPACName)",
            "source": "https://web.chemdoodle.com/demos/iupac-naming"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/demos/iupac-naming",
          "note": "Naming demo returned traditional and preferred names for caffeine.",
          "shot": {
            "image": "evidence/chemdoodle-web-components/f-structure-to-name.webp",
            "caption": "Structure to Name displays traditional and attempted preferred names."
          },
          "engine": {
            "library": "In-house ChemDoodle Java API (remote iChemLabs CloudServices; generateIUPACName)",
            "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip"
          }
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/demos/simulate-nmr-and-ms",
          "note": "Proton and carbon-13 prediction through iChemLabs Cloud Services.",
          "engine": {
            "library": "ChemDoodle Java API (remote iChemLabs CloudServices; simulate1HNMR and simulate13CNMR)",
            "source": "https://web.chemdoodle.com/docs/ichemlabs-cloud-services"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/advanced/sketcher-query-sketcher",
          "note": "Query atoms support element lists, wildcards, and attachment constraints."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/docs/2d-shapes",
          "note": "Repeat units associate boundary bonds and repeat-count ranges."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/demos/chemical-image-recovery",
          "note": "Chemical image recovery through iChemLabs Cloud Services.",
          "engine": {
            "library": "ChemDoodle Chemical Image Recovery (remote iChemLabs CloudServices; ChemDoodle.iChemLabs.cir)",
            "source": "https://web.chemdoodle.com/demos/chemical-image-recovery"
          }
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/2d-structure-canvases/molgrabber-canvas",
          "note": "PubChem, ChemSpider, and ChemExper through iChemLabs Cloud Services.",
          "engine": {
            "library": "ChemDoodle Java API (remote iChemLabs CloudServices; getMoleculeFromDatabase accesses PubChem, ChemSpider and ChemExper)",
            "source": "https://web.chemdoodle.com/docs/ichemlabs-cloud-services"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/tutorial/3d-structure-canvases/transform3d-canvas",
          "note": "Separate 3D editor loaded and rotated cholesterol; rendering was very dark.",
          "shot": {
            "image": "evidence/chemdoodle-web-components/f-model-3d.webp",
            "caption": "Ball-and-stick molecular model in the 3D editor."
          },
          "engine": {
            "library": "In-house ChemDoodle Web Components (browser JavaScript/WebGL and GLSL; glMatrix matrix math; TransformCanvas3D)",
            "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip"
          }
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/advanced/working-with-cif-files",
          "note": "Reads CIF files and constructs unit cells and supercells."
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/tutorial/loading-data",
          "note": "Save dialog offered CDXML; generation stalled with a script error.",
          "engine": {
            "library": "ChemDoodle Java API (remote iChemLabs CloudServices; getMoleculeFromContent and saveFile format conversion)",
            "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/loading-data",
          "note": "Read/write through iChemLabs Cloud Services using desktop-format support.",
          "engine": {
            "library": "ChemDoodle Java API (remote iChemLabs CloudServices; getMoleculeFromContent and saveFile format conversion)",
            "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip"
          }
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/tutorial/loading-data",
          "note": "MOL and single-record SDF loaded; MOL generation stalled with error.",
          "engine": {
            "library": "In-house ChemDoodle.io.MOLInterpreter (browser JavaScript; MOL V2000/V3000); ChemDoodle Java API (remote iChemLabs CloudServices for SDF)",
            "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://web.chemdoodle.com/docs/ichemlabs-cloud-services",
          "note": "Separate SMILES demo read caffeine and wrote imported structures.",
          "engine": {
            "library": "ChemDoodle Java API (remote iChemLabs CloudServices; readSMILES and writeSMILES)",
            "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/loading-data",
          "note": "Read/write through iChemLabs Cloud Services using desktop-format support.",
          "engine": {
            "library": "ChemDoodle Java API (remote iChemLabs CloudServices; getMoleculeFromContent and saveFile format conversion)",
            "source": "https://web.chemdoodle.com/downloads/ChemDoodleWeb-11.0.0.zip"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/docs/api",
          "note": "Native readRXN and writeRXN APIs."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/advanced/image-export",
          "note": "Proprietary builds only; 2D canvases only."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No image export option in the demo save dialog."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No image export option in the demo save dialog."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/docs/api",
          "note": "Documented JavaScript API."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/advanced/developing-plugins",
          "note": "Documented JavaScript plugin extension mechanism."
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/advanced/reactjs-development",
          "note": "Embed SketcherCanvas directly or through React wrapper; separately load core scripts."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/libs/cwc/ChemDoodleWeb.js",
          "note": "Atom halos are tied to temporary selection and hover states."
        }
      },
      "caveats": [
        "GPLv3 library; proprietary integration and bundled asset reuse have separate licensing terms.",
        "SVG export and condensed-label editing require proprietary builds.",
        "Cleanup, naming, SMILES conversion, and advanced calculations require cloud-service access."
      ],
      "github": null,
      "hands": {
        "testedVersion": "11.0.0",
        "canvas": "evidence/chemdoodle-web-components/canvas.webp",
        "canvasLight": "evidence/chemdoodle-web-components/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 175,
          "paclitaxelMb": 171,
          "baselineMb": 50.3,
          "rssIdleMb": 433.9,
          "rssPaclitaxelMb": 438.5,
          "runs": 3,
          "processes": 4,
          "method": "Headless Chromium process-tree phys_footprint; MiB; median of three fresh runs.",
          "note": "MOL imported through sketcher; baseline is about:blank."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://web.chemdoodle.com/demos/2d-sketcher",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/chemdoodle-web-components/simple.png",
            "note": "SMILES rejected; MOL imported. SMILES output generated in separate demo.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/chemdoodle-web-components/complex.png",
            "note": "SMILES rejected; imported MOL has crowded labels near the central ring.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/chemdoodle-web-components/threed.png",
            "note": "Rotatable 3D model is extremely dark in headless Chromium.",
            "structure": null
          }
        ],
        "observations": [
          "The hosted sketcher reports version 11.0.0.",
          "Separate demos provide SMILES conversion, naming, and a 3D editor.",
          "The save dialog stalled generating MOL, SDF, CDXML, and SMILES files.",
          "The 3D cholesterol model is barely visible against the black background.",
          "No image-export command appeared in the sketcher save dialog.",
          "The sketcher open dialog rejected both current Kekule SMILES fixtures."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 2580,
        "transferBytes": 1367462
      },
      "downloadBytes": null,
      "references": [
        "https://web.chemdoodle.com/",
        "https://www.ichemlabs.com/download"
      ]
    },
    {
      "id": "p119",
      "slug": "chemeditor-chemrise",
      "name": "Chemeditor (Chemrise)",
      "rank": 28,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "Ketcher",
          "Indigo",
          "Miew"
        ],
        "source": "https://chemrise.ru/chemeditor/help",
        "note": "Vendor documents embedded Ketcher; shipped standalone build includes Indigo chemistry and Miew 3D."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher/Raphaël; Indigo export renderer",
        "language": "TypeScript",
        "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/render/raphaelRender.ts#L22"
      },
      "enginesChecked": true,
      "languageNote": "HTML and CSS provide layout and styling.",
      "video": {
        "provider": "file",
        "url": "https://chemrise.ru/video5/chemeditor.webm",
        "embed": null,
        "title": "Пример записи и сохранения реакции",
        "author": null,
        "linkedFrom": "https://chemrise.ru/video/chemeditor.webm",
        "poster": null
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Hosted editor available; external embedding support unconfirmed."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Raphaël, CKEditor and Miew viewer"
        },
        {
          "language": "C++",
          "role": "Indigo chemistry and rendering (WebAssembly)"
        },
        {
          "language": "C",
          "role": "InChI support compiled to WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": "Includes copyleft CKEditor 4.11.4 (GPL-2.0+ OR LGPL-2.1+ OR MPL-1.1+) and OFL-1.1 JetBrains Mono fonts with font share-alike terms.",
        "source": "https://github.com/ckeditor/ckeditor4/blob/4.11.4/LICENSE.md",
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "Miew",
            "license": "MIT",
            "source": "https://github.com/epam/miew/blob/main/LICENSE.md"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It creates complete 2D chemistry documents with editable Ketcher structures, rich text, HTML saving, and PDF printing.",
      "summary": "Browser-based editor for chemistry articles, reaction equations, and embedded molecular structure drawings.",
      "website": "https://chemrise.ru/chemeditor/en",
      "repo": null,
      "docs": "https://chemrise.ru/chemeditor/help",
      "vendor": "ChemRise",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free hosted service; no Chemeditor-specific software license stated.",
        "source": "https://chemrise.ru/chemeditor/help"
      },
      "price": {
        "text": "Free (checked 2026-11-05)",
        "source": "https://chemrise.ru/chemeditor/en"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://chemrise.ru/chemeditor/en"
      },
      "engine": {
        "rendering": "SVG through Ketcher/Raphaël; Indigo generates SVG and PNG exports",
        "chemistry": "Indigo through embedded Ketcher",
        "ui": "CKEditor 4 with embedded Ketcher (React)",
        "source": "https://chemrise.ru/ketcher/static/js/main.e47c48ad.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-bonds",
          "note": "Drew single, double, and triple bonds.",
          "shot": {
            "image": "evidence/chemeditor-chemrise/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/chemeditor-chemrise/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts",
          "note": "Ketcher includes dative and hydrogen bond tools."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Placed benzene; common ring buttons are available.",
          "shot": {
            "image": "evidence/chemeditor-chemrise/f-rings.webp",
            "caption": "Benzene and ring buttons in the structure editor."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/templates/library.sdf#L8258",
          "note": "Chair templates in embedded Ketcher."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/editor/tool/chain.ts#L157",
          "note": "Dragging sets the number of chain segments."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chemrise.ru/chemeditor/help",
          "note": "Placed bicyclo[2.2.1]heptane from structure library."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Save structures into Ketcher's user template library."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#superatom-s-group",
          "note": "Ketcher superatom abbreviations retain underlying chemistry."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/modal/components/toolbox/Atom/Atom.tsx",
          "note": "Ketcher atom properties include labels, charges and isotopes.",
          "shot": {
            "image": "evidence/chemeditor-chemrise/f-atom-labels.webp",
            "caption": "Atom labels and charge controls in the structure editor."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/data/schema/struct-schema.ts",
          "note": "Ketcher offers monoradical and singlet/triplet diradical settings."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-atoms",
          "note": "Select an atom and type to change its element."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#changing-structure-display",
          "note": "Lasso, rotate and flip; document insertion controls whole-molecule resizing.",
          "shot": {
            "image": "evidence/chemeditor-chemrise/f-selection-tools.webp",
            "caption": "Rectangle selection and hand tools beside a caffeine structure."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://chemrise.ru/chemeditor/help",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/chemeditor-chemrise/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the drawing canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/action/tools.ts#L260",
          "note": "Drew a curved filled arrow.",
          "shot": {
            "image": "evidence/chemeditor-chemrise/f-mechanism-arrows.webp",
            "caption": "Curved arrow on the structure editor canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#reaction-specific-format-support",
          "note": "Ketcher stores reactants, products and reaction participants."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-reactions",
          "note": "Ketcher provides manual and automatic reaction atom mapping."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemrise.ru/images/buttons.png",
          "note": "Document toolbar provides fonts, subscripts and superscripts.",
          "shot": {
            "image": "evidence/chemeditor-chemrise/f-rich-text.webp",
            "caption": "Document editor toolbar with subscript and superscript controls."
          }
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-graphical-objects",
          "note": "Ketcher shapes plus S-group brackets."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#ketcher-molecules-mode",
          "note": "Ketcher cleanup standardizes bond lengths and angles.",
          "engine": {
            "library": "Indigo (WebAssembly through ketcher-standalone, clean2d)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L228"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#acs-american-chemical-society-style",
          "note": "ACS preset in embedded Ketcher."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/modal/components/meta/Settings/Settings.tsx#L88",
          "note": "Save and reload Ketcher font and bond settings."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Individually highlight Ketcher atoms and bonds in eight colors."
        },
        "pages": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Insert Page Break for Printing command."
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#adding-images-on-the-canvas",
          "note": "Ketcher supports inserting PNG and SVG images."
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://ckeditor.com/docs/ckeditor4/latest/features/table.html",
          "note": "Editable tables through the embedded CKEditor 4 document editor."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-atoms",
          "note": "Ketcher underlines atoms with invalid valence in red.",
          "engine": {
            "library": "Ketcher (TypeScript valence checks); Indigo (WebAssembly additional structure checks)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/state/server/index.js#L85"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#stereochemistry",
          "note": "Ketcher calculates R/S, r/s and E/Z descriptors.",
          "engine": {
            "library": "Indigo (WebAssembly through ketcher-standalone, calculateCip)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L170"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/state/server/index.js#L137",
          "note": "Caffeine: C8H10N4O2, molecular weight 194.194.",
          "engine": {
            "library": "Indigo (WebAssembly through ketcher-standalone, calculate)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L181"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Open structure rejected caffeine as a name."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in drawing or calculation controls."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-r-groups",
          "note": "Ketcher supports R-groups, atom lists and Markush logic."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#marking-s-groups",
          "note": "Ketcher represents SRU polymers and copolymer connectivity."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#ketcher-macromolecules-mode",
          "note": "Ketcher supports peptides, nucleic acids, sequences and HELM."
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts#L720",
          "note": "Embedded standalone Ketcher explicitly disables image recognition."
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#3d-viewer",
          "note": "SDF model rotated in Miew.",
          "shot": {
            "image": "evidence/chemeditor-chemrise/f-model-3d.webp",
            "caption": "Miew viewer showing a molecular model and 3D rotation note."
          },
          "engine": {
            "library": "Miew (JavaScript/WebGL through miew-react)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/modal/components/process/Miew/Miew.tsx#L44"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Exported CDXML and reopened it as a structure.",
          "engine": {
            "library": "Indigo (WebAssembly through ketcher-standalone)",
            "source": "https://github.com/epam/Indigo/blob/indigo-1.46.0/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L193"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Ketcher supports binary CDX and Base64 CDX.",
          "engine": {
            "library": "Indigo (WebAssembly through ketcher-standalone)",
            "source": "https://github.com/epam/Indigo/blob/indigo-1.46.0/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L197"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Opened MOL and SDF; saved MOL.",
          "engine": {
            "library": "Ketcher (TypeScript MOL V2000 parser/writer); Indigo (WebAssembly for SDF, MOL V3000 and query MOL)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L82"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Opened SMILES; generated SMILES shown in save preview.",
          "engine": {
            "library": "Indigo (WebAssembly through ketcher-standalone)",
            "source": "https://github.com/epam/Indigo/blob/indigo-1.46.0/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L137"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Ketcher supports InChI, AuxInfo and InChIKey.",
          "engine": {
            "library": "Indigo with InChI (C/C++ compiled to WebAssembly through ketcher-standalone)",
            "source": "https://github.com/epam/Indigo/blob/indigo-1.46.0/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L201"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/README.md#key-features",
          "note": "Ketcher loads and saves MDL RXN reactions."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#working-with-files",
          "note": "Downloaded SVG exports."
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chemrise.ru/chemeditor/help",
          "note": "Print preview opened; host did not invoke print dialog."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/data/schema/options-schema.ts#L38",
          "note": "PNG saved at 223 × 162; no DPI metadata."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://chemrise.ru/chemeditor/help",
          "note": "Hosted editor available; external embedding support unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Embedded Ketcher provides eight-color background highlights for atoms and bonds."
        }
      },
      "caveats": [
        "Document editing requires a desktop viewport at least 1100 pixels wide.",
        "Publishing requires an account; limits are 20 documents and 3 MB per document.",
        "Some typed arrow sequences can lose formatting when saved or printed."
      ],
      "github": null,
      "hands": {
        "testedVersion": "Ketcher 3.18.0 (build 2026-…",
        "canvas": "evidence/chemeditor-chemrise/canvas.webp",
        "canvasLight": "evidence/chemeditor-chemrise/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 835.85,
          "paclitaxelMb": 786.07,
          "baselineMb": 391.21,
          "rssIdleMb": 1467.3,
          "rssPaclitaxelMb": 1447.41,
          "runs": 3,
          "processes": 9,
          "method": "Headed Playwright Chromium; tree and crashpad phys_footprint medians, MiB.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://chemrise.ru/chemeditor/en",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemeditor-chemrise/simple.svg",
            "note": "SMILES layout; SVG and MOL saved at defaults.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemeditor-chemrise/complex.svg",
            "note": "SMILES layout includes an ABS stereochemistry label.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/chemeditor-chemrise/threed.png",
            "note": "SMILES viewer blank; SDF model rotates; SVG is projection.",
            "structure": "match"
          }
        ],
        "observations": [
          "Ketcher reports build 2026-09-02 13:33:46; parent script is chemeditor.js?26.",
          "Paclitaxel layout includes an ABS label and wedge bonds.",
          "Miew displayed explicit hydrogens from the supplied SDF.",
          "Downloads required a Chrome-like user agent in the isolated WebKit host.",
          "Print preview worked; the host did not open a print dialog."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 2382,
        "transferBytes": 1235357
      },
      "downloadBytes": null,
      "references": [
        "https://chemrise.ru/chemeditor/en",
        "https://chemrise.ru/chemeditor/en"
      ]
    },
    {
      "id": "p70",
      "slug": "moleditpy",
      "name": "MoleditPy",
      "rank": 29,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit"
        ],
        "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/molecule_scene.py#L28-L59",
        "note": "Custom Qt scene; RDKit supplies chemistry and molecular data conversion."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "MoleditPy Qt AtomItem/BondItem renderer",
        "language": "Python",
        "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/bond_item.py#L339-L459"
      },
      "enginesChecked": true,
      "languageNote": "HTML/CSS are website/docs; Inno Setup builds the Windows installer.",
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=ccWn9psgBlM",
        "embed": "https://www.youtube-nocookie.com/embed/ccWn9psgBlM",
        "title": "MoleditPy: introduction",
        "author": "HY",
        "linkedFrom": "https://hiroyokoyama.github.io/python_molecular_editor/",
        "poster": "https://img.youtube.com/vi/ccWn9psgBlM/hqdefault.jpg"
      },
      "embedding": {
        "methods": [],
        "package": "MoleditPy",
        "limit": "LGPL-3.0-or-later",
        "how": "Standalone Python package; no editor embedding API confirmed."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "Native RDKit chemistry"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-3.0 (PySide6/Qt/Shiboken6) and GPL-2.0-or-later with the PyInstaller bootloader exception; RDKit and VTK use BSD-3-Clause.",
        "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/THIRD_PARTY_NOTICES.md",
        "notice": "https://github.com/HiroYokoyama/python_molecular_editor/blob/main/THIRD_PARTY_NOTICES.md",
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It provides implemented 2D structure drawing and vector SVG export, with publication-figure layout tools available through Reaction Sketcher.",
      "summary": "A desktop editor for drawing chemical structures, editing 3D molecules, and preparing computational chemistry inputs.",
      "website": "https://hiroyokoyama.github.io/python_molecular_editor/",
      "repo": "https://github.com/HiroYokoyama/python_molecular_editor",
      "docs": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual",
      "vendor": "Hiromichi Yokoyama",
      "license": {
        "kind": "open-source",
        "spdx": "LGPL-3.0-or-later",
        "text": "GNU Lesser General Public License version 3 or later.",
        "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/README.md#license--disclaimer"
      },
      "price": {
        "text": "Free",
        "source": "https://hiroyokoyama.github.io/python_molecular_editor/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v5.1.3",
        "date": "2026-11-05",
        "source": "https://github.com/HiroYokoyama/python_molecular_editor/releases/tag/v5.1.3"
      },
      "engine": {
        "rendering": "Qt QGraphicsScene/QPainter for 2D; QSvgGenerator for SVG; PyVista/VTK for 3D.",
        "chemistry": "RDKit",
        "ui": "PySide6 (Qt 6)",
        "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/export_logic.py"
      },
      "languages": [
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#10-keyboard-shortcuts",
          "note": "Drew single, double, triple bonds; changed existing bond orders.",
          "shot": {
            "image": "evidence/moleditpy/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/bond_item.py#L396-L459",
          "note": "Solid and hashed wedges drawn; no wavy bond control found.",
          "shot": {
            "image": "evidence/moleditpy/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds on the drawing canvas."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/main_window_init.py#L901-L919",
          "note": "Placed cyclohexane and benzene with dedicated toolbar tools.",
          "shot": {
            "image": "evidence/moleditpy/f-rings.webp",
            "caption": "Cyclohexane and benzene on the canvas beneath ring tools."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#43-using-templates",
          "note": "Dragging the alkyl-chain tool created a zigzag chain."
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/HiroYokoyama/moleditpy_group_template/blob/92f96ac878e65b2394cc3888b7d4ebcb1a0f8e37/README.md#L8-L28",
          "note": "Ring templates work; User Templates contains no built-in structures.",
          "shot": {
            "image": "evidence/moleditpy/f-templates.webp",
            "caption": "Ring template tools and two rings on the canvas."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#43-using-templates",
          "note": "Save current structure as a reusable user template."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/moleditpy_group_template/blob/92f96ac878e65b2394cc3888b7d4ebcb1a0f8e37/group_template/builder.py#L28-L73",
          "note": "Requires Group Template plugin; abbreviations place expanded chemical structures."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#41-selecting-a-drawing-mode",
          "note": "Charges and periodic-table elements; isotope editing unverified.",
          "shot": {
            "image": "evidence/moleditpy/f-atom-labels.webp",
            "caption": "A structure with nitrogen and oxygen labels and element tools."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#41-selecting-a-drawing-mode",
          "note": "Toggle one or two radical electrons on an atom."
        },
        "keyboard-drawing": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#10-keyboard-shortcuts",
          "note": "N selected nitrogen mode; selected atom did not change."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/moleditpy_reaction_sketcher_plugin/blob/0f39338474011e01b294bf94d23365416963016a/reaction_sketcher/mode_manager.py#L3118-L3196",
          "note": "Rectangle selection; rotate and plugin flips; lasso and molecular resizing unverified."
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/moleditpy_3d-molecule-on-2d/#interactive-3d-rotation",
          "note": "Requires 3D Molecule on 2D plugin for canvas rotation."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/moleditpy_reaction_sketcher_plugin/#features",
          "note": "Requires Reaction Sketcher plugin: forward, equilibrium, resonance and retrosynthetic arrows."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/moleditpy_reaction_sketcher_plugin/#tips",
          "note": "Requires Reaction Sketcher plugin; editable full-head and fishhook curved arrows."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/moleditpy_reaction_sketcher_plugin/blob/0f39338474011e01b294bf94d23365416963016a/reaction_sketcher/mode_manager.py#L588-L640",
          "note": "Requires Reaction Sketcher plugin: fonts, subscript and superscript text formatting."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/moleditpy_reaction_sketcher_plugin/#tools-overview",
          "note": "Requires Reaction Sketcher plugin: editable shapes and square, round, curly brackets."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/moleditpy_reaction_sketcher_plugin/#features",
          "note": "Requires Reaction Sketcher plugin; align and distribute selected objects."
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/moleditpy_reaction_sketcher_plugin/#features",
          "note": "Requires Reaction Sketcher plugin; group and ungroup molecular items and annotations."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#46-other-editview-functions",
          "note": "Clean Up 2D tidies molecular drawing coordinates.",
          "shot": {
            "image": "evidence/moleditpy/f-cleanup.webp",
            "caption": "The Clean Up 2D button beneath a drawing."
          },
          "engine": {
            "library": "RDKit (Python rdDepictor; optional CoordGen backend)",
            "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/core/mol_geometry.py#L616-L657"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/moleditpy-plugins/blob/2ee63884f4cc5a67198074bc06b2a20dd4e09eed/plugins/Settings_Saver/settings_saver.py#L848-L886",
          "note": "Settings Saver plugin saves and reloads drawing-settings presets."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/moleditpy_reaction_sketcher_plugin/blob/0f39338474011e01b294bf94d23365416963016a/reaction_sketcher/mode_manager.py#L1378-L1402",
          "note": "Requires Reaction Sketcher plugin; individually colors text and annotation objects."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/compute_logic.py#L534-L567",
          "note": "Flags valence problems before 3D conversion.",
          "engine": {
            "library": "RDKit (Python Chem.SanitizeMol; custom atom highlighting)",
            "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/compute_logic.py#L521-L567"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#51-2d-to-3d-conversion",
          "note": "Computes R/S and E/Z; checks converted stereochemistry.",
          "engine": {
            "library": "RDKit (Python Chem stereochemistry and rdCIPLabeler)",
            "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/core/stereo_check.py#L48-L76"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#7-molecular-analysis",
          "note": "Cholesterol C27H46O; molecular weight 386.6640; exact mass 386.3549.",
          "shot": {
            "image": "evidence/moleditpy/f-formula-mass.webp",
            "caption": "Molecule analysis displays the formula, molecular weight, and exact mass."
          },
          "engine": {
            "library": "RDKit (Python Descriptors/rdMolDescriptors; atomic masses for XYZ-derived structures)",
            "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/analysis_window.py#L84-L148"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#7-molecular-analysis",
          "note": "Cholesterol LogP 7.389 and TPSA 20.23 displayed.",
          "shot": {
            "image": "evidence/moleditpy/f-properties.webp",
            "caption": "Molecule analysis displays LogP and TPSA values."
          },
          "engine": {
            "library": "RDKit (Python rdMolDescriptors; Crippen logP and TPSA)",
            "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/analysis_window.py#L143-L154"
          }
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/HiroYokoyama/moleditpy_opsin_name_to_structure/blob/6d677cdf8ab34f079286f5d3f74f6e2cff58e5b1/README.md#L7-L32",
          "note": "No naming tool; SMILES importer rejected ethanol."
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/moleditpy-plugins/blob/2ee63884f4cc5a67198074bc06b2a20dd4e09eed/plugins/PubChem_Structure_Identifier/pubchem_structure_identifier.py#L82-L127",
          "note": "PubChem Structure Identifier plugin retrieves IUPAC names for database matches.",
          "engine": {
            "library": "PubChem PUG REST web service (optional PubChem Structure Identifier Python plugin; matched IUPAC names)",
            "source": "https://github.com/HiroYokoyama/moleditpy-plugins/blob/2ee63884f4cc5a67198074bc06b2a20dd4e09eed/plugins/PubChem_Structure_Identifier/pubchem_structure_identifier.py#L79-L127"
          }
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/HiroYokoyama/moleditpy_nmr_predicator_nmrshiftdb2/blob/388c4b236fa96dfae920661016d9a3cd8f4c65d5/README.md#L8-L59",
          "note": "Requires NMR Predictor (nmrshiftdb2); coverage depends on reference data.",
          "engine": {
            "library": "Optional NMR Predictor (nmrshiftdb2) plugin (Python/RDKit; local reference matching); optional NMR Predictor (CASCADE) plugin (remote CASCADE web service)",
            "source": "https://github.com/HiroYokoyama/moleditpy-plugins/blob/2ee63884f4cc5a67198074bc06b2a20dd4e09eed/REGISTRY/plugins.json"
          }
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/moleditpy_DECIMER_plugin/blob/d8bba0faa39e8cddfa51885f6946c82fcc215919/decimer_plugin/dialog.py",
          "note": "Requires DECIMER Image Importer plugin and model dependencies.",
          "engine": {
            "library": "DECIMER (Python predict_SMILES; optional DECIMER Image Importer plugin)",
            "source": "https://github.com/HiroYokoyama/moleditpy_DECIMER_plugin/blob/d8bba0faa39e8cddfa51885f6946c82fcc215919/decimer_plugin/dialog.py#L43-L51"
          }
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/moleditpy-plugins/blob/2ee63884f4cc5a67198074bc06b2a20dd4e09eed/plugins/PubChem_Name_Ressolver/pubchem_ressolver.py#L144-L260",
          "note": "Requires PubChem Name Resolver plugin.",
          "engine": {
            "library": "PubChem PUG REST web service (optional PubChem Name Resolver Python plugin)",
            "source": "https://github.com/HiroYokoyama/moleditpy-plugins/blob/2ee63884f4cc5a67198074bc06b2a20dd4e09eed/plugins/PubChem_Name_Ressolver/pubchem_ressolver.py#L144-L180"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#54-3d-view-operations",
          "note": "SMILES conversion succeeded; dragging rotated cholesterol in depth.",
          "shot": {
            "image": "evidence/moleditpy/f-model-3d.webp",
            "caption": "A ball-and-stick 3D model in the viewer."
          },
          "engine": {
            "library": "PyVista/VTK (Python; PyVistaQt interactor)",
            "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/view_3d_logic.py#L551-L577"
          }
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/HiroYokoyama/moleditpy_cif_viewer/blob/e450073393bfbd3892abaef15980c270115b2c70/README.md#L33-L50",
          "note": "Requires CIF Viewer plugin; supports unit cells and supercells."
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Opening CDXML probe rejected; required PME project extension."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#6-file-operations",
          "note": "MOL round-trip succeeded; cholesterol SDF loaded in 3D.",
          "shot": {
            "image": "evidence/moleditpy/f-mol-sdf.webp",
            "caption": "A MOL file imported into the drawing canvas."
          },
          "engine": {
            "library": "RDKit (Python; MOL read/write and SDF import only)",
            "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/io_logic.py"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#7-molecular-analysis",
          "note": "Imported all fixtures; generated and copied cholesterol SMILES in Analysis.",
          "shot": {
            "image": "evidence/moleditpy/f-smiles.webp",
            "caption": "Molecule analysis displays a SMILES field and Copy button."
          },
          "engine": {
            "library": "RDKit (Python Chem.MolFromSmiles/MolToSmiles)",
            "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/string_importers.py#L130-L159"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#62-import",
          "note": "Analysis generated cholesterol InChI and InChIKey.",
          "shot": {
            "image": "evidence/moleditpy/f-inchi.webp",
            "caption": "Molecule analysis displays InChI and InChIKey fields."
          },
          "engine": {
            "library": "RDKit (Python InChI bindings; import and export)",
            "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/string_importers.py#L168-L197"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#63-export",
          "note": "Native transparent SVG exports saved for all fixtures."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "No PDF/Print command; Command-P opened no dialog."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/ui/export_logic.py#L688-L787",
          "note": "PNG saved at 918×522 pixels, 72 dpi; no resolution control."
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/moleditpy-plugins/blob/2ee63884f4cc5a67198074bc06b2a20dd4e09eed/plugins/Paste_from_ChemDraw/paste_chemdraw.py",
          "note": "Windows Paste from ChemDraw plugin imports only; no reverse copy."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/docs/PLUGIN_DEVELOPMENT_MANUAL_V5.md#L397-L456",
          "note": "Documented in-process Python PluginContext API drives the editor."
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/moleditpy/src/moleditpy/main.py#L232-L335",
          "note": "Launcher and plugin installer; no headless conversion or rendering."
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/HiroYokoyama/moleditpy-mcp_server/blob/3a292ab43d524baf62428a01920741b392686f07/README.md#L21-L61",
          "note": "Requires MCP Server plugin; controls the running editor."
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://hiroyokoyama.github.io/python_molecular_editor/manual/manual#9-plugin-system",
          "note": "Python plugins extend menus, file handling, analysis and rendering.",
          "shot": {
            "image": "evidence/moleditpy/f-plugins.webp",
            "caption": "Plugin Manager shows installation instructions and plugin controls."
          }
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/HiroYokoyama/python_molecular_editor/blob/914b9c2695d4a9bbce358c4c1d2f6fae3b921d54/docs/PLUGIN_DEVELOPMENT_MANUAL_V5.md",
          "note": "Standalone Python package; no editor embedding API confirmed."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/HiroYokoyama/moleditpy-plugins/blob/2ee63884f4cc5a67198074bc06b2a20dd4e09eed/plugins/Chat_with_Molecule_Neo_ChatGPT/chat_with_molecule_neo_chatGPT.py#L2166-L2193",
          "note": "Requires Chat with Molecule Neo plugin and configured model access."
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/HiroYokoyama/moleditpy_reaction_sketcher_plugin/blob/0f39338474011e01b294bf94d23365416963016a/reaction_sketcher/patcher.py#L1214-L1226",
          "note": "Reaction Sketcher plugin adds selection halos; PNG/SVG exports remove them."
        }
      },
      "caveats": [
        "Reaction layouts and several advanced chemistry functions require separately installed plugins.",
        "Standalone bundles cannot run plugins requiring additional Python packages.",
        "Core SDF is import-only; native export writes MOL despite broader README claims."
      ],
      "github": {
        "url": "https://github.com/HiroYokoyama/python_molecular_editor",
        "stars": 11,
        "checkedOn": "2026-11-06",
        "firstCommit": "2025-09-30",
        "commits": 2162,
        "contributors": 6,
        "pushedAt": "2026-11-05T05:12:38Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "5.1.3",
        "canvas": "evidence/moleditpy/canvas.webp",
        "canvasLight": "evidence/moleditpy/canvas-light.webp",
        "canvasDark": "evidence/moleditpy/canvas-dark.webp",
        "memory": {
          "idleMb": 576.36,
          "paclitaxelMb": 581.91,
          "baselineMb": null,
          "rssIdleMb": 535.2,
          "rssPaclitaxelMb": 548.68,
          "runs": 3,
          "processes": 1,
          "method": "Three fresh launches; SMILES import; 10-second waits; process-tree footprint phys_footprint medians; decimal MB.",
          "note": "Native Qt; no child processes; per-launch QT_QPA_PLATFORM=cocoa."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "follows system",
          "note": "Dark interface retains a white drawing canvas."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "zip",
        "artifact": "MoleditPy_5.1.3_macos_arm64.zip",
        "ran": true,
        "failure": null,
        "downloadBytes": 180053192,
        "installedBytes": 737583104,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/moleditpy/simple.svg",
            "note": "Automatic SMILES layout retained; no cleanup or manual repositioning.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/moleditpy/complex.svg",
            "note": "Automatic SMILES layout retained, including generated wedge and hashed bonds.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/moleditpy/threed.png",
            "note": "SMILES converted to rotatable 3D; default viewport saved as threed-view.png.",
            "structure": "match"
          }
        ],
        "observations": [
          "SMILES import automatically laid out and fitted all three 2D structures.",
          "Default 2D atom labels use blue nitrogen and red oxygen.",
          "Cholesterol generated a ball-and-stick model with explicit hydrogens.",
          "SVG export defaults to transparent background and can include hover highlights.",
          "Default PNG output was 918×522 pixels at 72 dpi."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 11039,
        "idleMb": 504,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 180053192,
      "references": [
        "https://github.com/HiroYokoyama/python_molecular_editor",
        "https://hiroyokoyama.github.io/python_molecular_editor/",
        "https://pypi.org/pypi/MoleditPy/json"
      ]
    },
    {
      "id": "p48",
      "slug": "chemcanvas",
      "name": "ChemCanvas",
      "rank": 30,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "ported": [
          "OASA"
        ],
        "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/canvas.py",
        "note": "Custom Qt canvas; chemistry includes adapted OASA source."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "ChemCanvas molecular drawing over Qt",
        "language": "Python",
        "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/bond.py"
      },
      "enginesChecked": true,
      "languageNote": "Excludes NSIS installers and shell build scripts.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-3.0-or-later copyleft",
        "how": "Standalone PyQt application; no editor integration API documented."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "Qt widgets and graphics via PyQt5"
        }
      ],
      "thirdParty": {
        "summary": "PyQt5 uses GPL-3.0 and Qt LGPL-3.0. Adapted OASA code is GPL-covered (upstream GPL-2.0-or-later; repository notices GPL-3.0).",
        "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/coords_generator.py",
        "notice": null,
        "libraries": [
          {
            "name": "OASA",
            "license": "GPL-2.0-or-later",
            "source": "https://bkchem.zirael.org/download/oasa-0.13.1.tar.gz"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Standalone drawing tools, multipage documents, rich text and vector export support publication-grade 2D chemical figures.",
      "summary": "A desktop editor for drawing 2D chemical structures, reaction schemes and mechanisms.",
      "website": "https://ksharindam.github.io/chemcanvas/",
      "repo": "https://github.com/ksharindam/chemcanvas",
      "docs": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/README.md",
      "vendor": "Arindam Chaudhuri",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-3.0-or-later",
        "text": "GNU General Public License version 3 or later.",
        "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/pyproject.toml#L14"
      },
      "price": {
        "text": "Free",
        "source": "https://flathub.org/en/apps/io.github.ksharindam.chemcanvas"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.14.8",
        "date": "2026-08-13",
        "source": "https://github.com/ksharindam/chemcanvas/releases/tag/v0.14.8"
      },
      "engine": {
        "rendering": "Qt QGraphicsScene and QPainter; custom SVG serialization",
        "chemistry": "Custom Python molecular graph, SMILES and aromaticity code",
        "ui": "PyQt5 (v0.14.8)",
        "source": "https://github.com/ksharindam/chemcanvas/tree/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas"
      },
      "languages": [
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L1157-L1166",
          "note": "Tools selected; computer-use drag failed with noWindowsAvailable.",
          "shot": {
            "image": "evidence/chemcanvas/f-bonds-core.webp",
            "caption": "Single, double, and triple bond tools above a caffeine drawing."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L2626-L2628",
          "note": "Imported wedges; manual drawing blocked by computer-use drag error.",
          "shot": {
            "image": "evidence/chemcanvas/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedges in a structure and the bond toolbar."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L2623-L2624",
          "note": "Coordinate and hydrogen bonds."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/bond.py#L544-L569",
          "note": "Left, right, centered and automatic placement."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/templates/basic_templates.cctf#L3-L60",
          "note": "Placed a benzene ring from the palette.",
          "shot": {
            "image": "evidence/chemcanvas/f-rings.webp",
            "caption": "Ring templates, including benzene, beside the canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/templates/basic_templates.cctf#L31-L44",
          "note": "Built-in cyclohexane chair template.",
          "shot": {
            "image": "evidence/chemcanvas/f-conformers.webp",
            "caption": "The template palette includes a cyclohexane chair."
          }
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L1324-L1376",
          "note": "Drag draws zigzag carbon chains with an atom count."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/template_manager.py#L37-L39",
          "note": "Selected Alanine from the library and inserted it."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/template_manager.py#L156-L181",
          "note": "Save named molecular templates with attachment atom and bond."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L149-L164",
          "note": "Groups including Ph, OAc and OCH3 expand into structures.",
          "shot": {
            "image": "evidence/chemcanvas/f-abbreviations.webp",
            "caption": "Functional group palette with Ph, COOH, OEt, and other labels."
          }
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/atom.py",
          "note": "Editable symbols, charges and isotope numbers.",
          "shot": {
            "image": "evidence/chemcanvas/f-atom-labels.webp",
            "caption": "Element palette and charge controls beside the drawing canvas."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L1823-L1897",
          "note": "Dedicated radical and lone-pair tools."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L2642-L2669",
          "note": "Lasso selection, resizing, molecule rotation, mirror and inversion."
        },
        "perspective": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L590-L607",
          "note": "Rotate drawing atom coordinates in three dimensions."
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L2696-L2703",
          "note": "Arrow tools selected; computer-use drag failed with noWindowsAvailable."
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L1685-L1737",
          "note": "Electron Pair Shift selected; computer-use drag failed with noWindowsAvailable."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/fileformat_mrv.py#L266-L282",
          "note": "Single-step reactions store reactant and product molecules in MRV."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L2446-L2455",
          "note": "Dedicated s, p, dxy and dz2 orbital tools."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L1903-L1992",
          "note": "Free-text fonts, size, subscripts, superscripts, bold, italic and underline."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L2042-L2103",
          "note": "Editable lines, rectangles, ellipses and brackets."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/settings_ui.py#L94-L161",
          "note": "Bond settings and atom font size persist across sessions."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://ksharindam.github.io/chemcanvas/#features",
          "note": "Atoms, bonds and other objects can be colored individually."
        },
        "pages": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/settings_ui.py#L344-L404",
          "note": "One to 200 pages, standard/custom sizes, orientation and margins."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass command found in inspected UI."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/template_manager.py#L697-L723",
          "note": "PubChem caffeine lookup returned and inserted a structure.",
          "engine": {
            "library": "PubChem PUG REST web service",
            "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/template_manager.py#L697-L723"
          }
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure-to-name command found in inspected UI."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/tools.py#L2552-L2554",
          "note": "R-group labels in the functional-group palette.",
          "shot": {
            "image": "evidence/chemcanvas/f-markush.webp",
            "caption": "The functional group palette includes an R label."
          }
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/releases/tag/v0.8.2",
          "note": "Fetched caffeine from PubChem and inserted the returned structure.",
          "engine": {
            "library": "PubChem PUG REST web service",
            "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/template_manager.py#L697-L723"
          }
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "3D SDF opened as flat drawing; no model viewport."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/fileformat_cdxml.py",
          "note": "Caffeine exported and imported successfully.",
          "engine": {
            "library": "In-house (Python CDXML reader/writer)",
            "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/fileformat_cdxml.py"
          }
        },
        "cdx": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "CDX absent from inspected file-format lists."
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/fileformat_molfile.py#L20-L22",
          "note": "MOL exported/reopened; cholesterol SDF imported as a flat drawing.",
          "shot": {
            "image": "evidence/chemcanvas/f-mol-sdf.webp",
            "caption": "An SDF file displayed as a flat molecular drawing."
          },
          "engine": {
            "library": "In-house (Python V2000 MOL reader/writer; SDF reader)",
            "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/fileformat_molfile.py"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/fileformat_smiles.py",
          "note": "SMILES files imported; Generate SMILES produced caffeine output.",
          "shot": {
            "image": "evidence/chemcanvas/f-smiles.webp",
            "caption": "A SMILES file displayed as a caffeine drawing."
          },
          "engine": {
            "library": "Ported from OASA (adapted Python SMILES reader/writer)",
            "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/fileformat_smiles.py"
          }
        },
        "inchi": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "InChI absent from inspected file-format lists."
        },
        "rxn": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "RXN absent from inspected file-format lists."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://ksharindam.github.io/chemcanvas/#features",
          "note": "Saved default cropped vector SVG for both fixtures."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/main.py#L851-L875",
          "note": "Saved caffeine PDF with default settings."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/settings_ui.py#L280-L291",
          "note": "Default PNG exported at 100 DPI; resolution control present."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/ksharindam/chemcanvas/blob/main/README.md",
          "note": "Standalone PyQt application; no editor integration API documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/ksharindam/chemcanvas/blob/2c62054be57e3d0f77ed0c980397995b1def6563/chemcanvas/atom.py#L356-L366",
          "note": "Atom and bond selection backgrounds are excluded from image exports."
        }
      },
      "caveats": [
        "Official packages target Windows and Linux.",
        "CDXML exchange omits free text, shapes and brackets.",
        "SMILES export takes one molecule and cannot encode disconnected compounds."
      ],
      "github": {
        "url": "https://github.com/ksharindam/chemcanvas",
        "stars": 59,
        "checkedOn": "2026-11-06",
        "firstCommit": "2021-07-21",
        "commits": 497,
        "contributors": 1,
        "pushedAt": "2026-11-05T15:10:17Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.14.8",
        "canvas": "evidence/chemcanvas/canvas.webp",
        "canvasLight": "evidence/chemcanvas/canvas-light.webp",
        "canvasDark": "evidence/chemcanvas/canvas-dark.webp",
        "memory": {
          "idleMb": 86.59,
          "paclitaxelMb": 95.91,
          "baselineMb": null,
          "rssIdleMb": 185.48,
          "rssPaclitaxelMb": 201.92,
          "runs": 3,
          "processes": 1,
          "method": "Three fresh native Qt launches; median summed tree phys_footprint, MiB; 10-second settles.",
          "note": "SMILES File/Open; declined existing autosave restoration; no child processes."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "follows system",
          "note": "Dark interface; drawing canvas remains white."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://github.com/ksharindam/chemcanvas/archive/refs/tags/v0.14.8.zip",
        "ran": true,
        "failure": null,
        "downloadBytes": 363881,
        "installedBytes": 156061696,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemcanvas/simple.svg",
            "note": "Automatic layout retained; window zoomed to 200%.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemcanvas/complex.svg",
            "note": "Automatic layout retained, including overlapping bonds and labels.",
            "structure": "mismatch"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": null
          }
        ],
        "observations": [
          "Caffeine SMILES import generated a complete 2D drawing.",
          "Paclitaxel automatic layout contains overlapping bonds and labels.",
          "Terminal carbons display CH3 labels by default.",
          "SVG exports crop to drawing bounds.",
          "Cholesterol SDF appears as a flat, hydrogen-labelled drawing."
        ]
      },
      "perf": null,
      "downloadBytes": 363881,
      "references": [
        "https://github.com/ksharindam/chemcanvas",
        "https://github.com/ksharindam/chemcanvas/blob/7393a5bf2118889529de17eafec930ee62c53304/README.md"
      ]
    },
    {
      "id": "p19",
      "slug": "molview-com",
      "name": "MolView.com",
      "rank": 31,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://molview.com/mission/",
        "note": "Vendor describes sketcher algorithms developed from scratch; third-party chemistry libraries are undisclosed."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "Free",
          "level": "free",
          "price": "$0; no sign-up (2026-11-06)"
        },
        {
          "name": "Student",
          "level": "paid",
          "price": "US$9/year; students only, tax included (2026-11-06)"
        },
        {
          "name": "Academic",
          "level": "paid",
          "price": "US$49/year or $19/quarter; tax included (2026-11-06)"
        },
        {
          "name": "Standard",
          "level": "paid",
          "price": "US$99/user/year or $19/user/month; excluding tax (2026-11-06)"
        },
        {
          "name": "Publisher",
          "level": "paid",
          "price": "US$250/user/year; excluding tax (2026-11-06)"
        },
        {
          "name": "Institution",
          "level": "paid",
          "price": "Contact vendor (2026-11-06)"
        },
        {
          "name": "Enterprise",
          "level": "paid",
          "price": "Contact vendor (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "MolView vector-outline renderer",
        "language": null,
        "source": "https://app.molview.com/asset/molpad-KGu363v3.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "link",
        "url": "https://molview.com/tutorial-caffeine",
        "embed": null,
        "title": "Sketch structural formula of caffeine",
        "author": null,
        "linkedFrom": "https://molview.com/tutorials/",
        "poster": "https://molview.com/_astro/caffeine.DOp_b5PN_ZKjrBU.webp"
      },
      "embedding": {
        "methods": [
          "web component",
          "script tag"
        ],
        "package": null,
        "limit": "Each user needs subscription, or license your production domain.",
        "how": "Load api.js with client ID, then insert <molview-sketcher>."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Browser UI and OpenChemLib worker"
        },
        {
          "language": "C++",
          "role": "RDKit cleanup compiled to WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": "Permissive licenses for third-party components, according to the vendor.",
        "source": "https://molview.com/terms-and-conditions/",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Its standalone web app draws molecular and reaction diagrams and exports publication-quality SVG figures on paid plans.",
      "summary": "Web application for drawing small molecules and reaction mechanisms, viewing 3D models, and exporting chemical figures.",
      "website": "https://molview.com/",
      "repo": null,
      "docs": "https://molview.com/api/",
      "vendor": "Bergwerf Labs",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary service with free sketching and viewing; saving and advanced features require subscriptions.",
        "source": "https://molview.com/terms-and-conditions/"
      },
      "price": {
        "text": "2026-11-05 (USD): Free; Student $9/year; Academic $49/year; Standard $99/user/year; Publisher $250/user/year. Commercial prices exclude tax.",
        "source": "https://molview.com/subscriptions/"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://molview.com/updates/"
      },
      "engine": {
        "rendering": "In-house vector-outline rendering algorithms (vendor statement)",
        "chemistry": null,
        "ui": null,
        "source": "https://molview.com/"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molview.com/doc/api/types/sketcher.Bond_Type.html",
          "note": "Single, double and triple bonds visible and drawn.",
          "shot": {
            "image": "evidence/molview-com/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds in the sketcher."
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://molview.com/doc/api/types/sketcher.Bond_Type.html",
          "note": "Solid wedge and hashed wedge drawn; wavy option not seen.",
          "shot": {
            "image": "evidence/molview-com/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds on a structure."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://molview.com/doc/api/types/sketcher.Bond_Type.html",
          "note": "Hydrogen/incipient types documented; dative absent from published bond-type model.",
          "shot": {
            "image": "evidence/molview-com/f-special-bonds.webp",
            "caption": "Bond menu lists delocalized and hydrogen bonds."
          }
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molview.com/doc/api/interfaces/sketcher.Toolset.html#template",
          "note": "Placed benzene; several other ring tools visible.",
          "shot": {
            "image": "evidence/molview-com/f-rings.webp",
            "caption": "Benzene on the canvas with ring tools visible."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Linear chain tool visible."
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Only ring templates visible in inspected toolbar."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Element palette visible; custom label tool has subscription marker.",
          "shot": {
            "image": "evidence/molview-com/f-atom-labels.webp",
            "caption": "Element palette and nitrogen and oxygen labels in the sketcher."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molview.com/doc/api/interfaces/sketcher.Toolset.html#atom",
          "note": "Lone pairs and unpaired electrons can be edited."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Pointer and lasso tools visible."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://molview.com/doc/api/types/sketcher.Arrow_Type.html",
          "note": "Forward arrow tool prompts for subscription.",
          "plan": "Student",
          "planLevel": "paid"
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://molview.com/doc/api/interfaces/sketcher.Arrow.html",
          "note": "Electron arrow tool prompts for subscription.",
          "plan": "Student",
          "planLevel": "paid"
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molview.com/features/",
          "note": "Vendor claim: automatic structure cleanup.",
          "engine": {
            "library": "RDKit.js (WebAssembly)",
            "source": "https://app.molview.com/asset/sketcher-GXTu5bnp.js"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Style controls have subscription marker."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molview.com/doc/api/interfaces/sketcher.Style.html#mark_colors",
          "note": "API supports per-object color marks; custom styling requires higher paid plans.",
          "plan": "Academic",
          "planLevel": "paid"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Caffeine Infocard shows C8H10N4O2 and molecular weight 194.19.",
          "shot": {
            "image": "evidence/molview-com/f-formula-mass.webp",
            "caption": "Caffeine Infocard shows molecular formula and weight."
          },
          "engine": {
            "library": "PubChem web service (formula and mass lookup)",
            "source": "https://app.molview.com/asset/global-C8t_KQe2.js"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molview.com/features/",
          "note": "Searched aspirin and selected exact result.",
          "shot": {
            "image": "evidence/molview-com/f-name-to-structure.webp",
            "caption": "Aspirin search and its structure in the sketcher."
          },
          "engine": {
            "library": "PubChem web service; OPSIN (remote server)",
            "source": "https://app.molview.com/asset/global-C8t_KQe2.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Caffeine SMILES Infocard returned common and IUPAC names via PubChem.",
          "shot": {
            "image": "evidence/molview-com/f-structure-to-name.webp",
            "caption": "Caffeine Infocard displays a common name and IUPAC name."
          },
          "engine": {
            "library": "PubChem web service (IUPAC-name lookup)",
            "source": "https://app.molview.com/asset/global-C8t_KQe2.js"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molview.com/doc/api/interfaces/sketcher.Toolset.html#atom",
          "note": "R-group atom labels, including optional numbering."
        },
        "polymers": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Bracket tool visible."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molview.com/terms-and-conditions/",
          "note": "Infocard identified caffeine using PubChem.",
          "shot": {
            "image": "evidence/molview-com/f-database-lookup.webp",
            "caption": "Caffeine Infocard includes a PubChem link and identifiers."
          },
          "engine": {
            "library": "PubChem web service",
            "source": "https://app.molview.com/asset/global-C8t_KQe2.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molview.com/features/",
          "note": "Generated and displayed cholesterol 3D from SMILES.",
          "shot": {
            "image": "evidence/molview-com/f-model-3d.webp",
            "caption": "Aspirin structure alongside a ball-and-stick 3D model."
          },
          "engine": {
            "library": "Mol* (JavaScript)",
            "source": "https://app.molview.com/asset/viewer-DPGOQ4fZ.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "crystals": {
          "status": "no",
          "evidence": "docs",
          "source": "https://molview.com/article/new-app/",
          "note": "New app explicitly excludes crystal-lattice viewing."
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML choice in inspected import or export menus."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://molview.com/doc/api/classes/Sketcher.html",
          "note": "MOL/SDF import and export both require subscription.",
          "shot": {
            "image": "evidence/molview-com/f-mol-sdf.webp",
            "caption": "Export menu lists 2D and 3D SDF/MOL files."
          },
          "engine": {
            "library": "In-house",
            "source": "https://app.molview.com/asset/molpad-KGu363v3.js"
          },
          "plan": "Student",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molview.com/doc/api/classes/Sketcher.html",
          "note": "Loaded SMILES; Infocard displays isomeric SMILES.",
          "shot": {
            "image": "evidence/molview-com/f-smiles.webp",
            "caption": "Caffeine Infocard displays canonical and isomeric SMILES."
          },
          "engine": {
            "library": "OpenChemLib (JavaScript, browser worker)",
            "source": "https://app.molview.com/asset/worker-BxejRJJn.js"
          },
          "plan": "Student",
          "planLevel": "paid"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molview.com/features/",
          "note": "Vendor claim: search accepts InChI and InChIKey.",
          "shot": {
            "image": "evidence/molview-com/f-inchi.webp",
            "caption": "Caffeine Infocard displays an InChI and InChI key."
          },
          "engine": {
            "library": "PubChem web service (identifier lookup and retrieval)",
            "source": "https://app.molview.com/asset/global-C8t_KQe2.js"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://molview.com/subscriptions/",
          "note": "SVG option requires subscription.",
          "shot": {
            "image": "evidence/molview-com/f-svg-export.webp",
            "caption": "SVG export selection shows a subscription required dialog."
          },
          "plan": "Academic",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF choice in inspected export menus."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Downloaded 480-pixel PNG; higher resolutions require subscription.",
          "shot": {
            "image": "evidence/molview-com/f-png-export.webp",
            "caption": "PNG export dialog shows 480p and a high-resolution subscription notice."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molview.com/api/",
          "note": "Documented JavaScript web-component API; subscription and client ID required.",
          "plan": "Student",
          "planLevel": "paid"
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molview.com/api/",
          "note": "Load api.js with client ID, then insert <molview-sketcher>.",
          "plan": "Student",
          "planLevel": "paid"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Free cannot save diagrams; Student excludes custom styling and SVG/SDF/XYZ export.",
        "Standard allows 10 SVG exports monthly; for-profit content creation requires Publisher.",
        "New MolView.com excludes legacy crystal-lattice and protein viewers."
      ],
      "github": null,
      "hands": {
        "testedVersion": "2026-11-02 (5ecc001a)",
        "canvas": "evidence/molview-com/canvas.webp",
        "canvasLight": "evidence/molview-com/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 357,
          "paclitaxelMb": 632,
          "baselineMb": 50.31,
          "rssIdleMb": 673.41,
          "rssPaclitaxelMb": 980.12,
          "runs": 3,
          "processes": 4,
          "method": "Fresh headless Chromium; summed process-tree physical footprints; three-run medians.",
          "note": "Paclitaxel footprints varied across runs: 374, 632, and 1,259 MiB."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "White sketcher and black 3D viewer are the defaults."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://app.molview.com/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molview-com/simple.png",
            "note": "Default PNG export; Infocard isomeric SMILES saved.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molview-com/complex.png",
            "note": "Zoomed to fit; default PNG export and Infocard isomeric SMILES saved.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molview-com/threed.png",
            "note": "Rotatable 3D model; Infocard isomeric SMILES saved.",
            "structure": "match"
          }
        ],
        "observations": [
          "Default sketcher shows colored heteroatoms beside a black-background 3D viewer.",
          "Paclitaxel initially exceeded the sketcher viewport at 200% zoom.",
          "Free PNG exports default to 480 by 480 pixels.",
          "Infocard isomeric SMILES matched all three inputs in RDKit."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 1430,
        "transferBytes": 1449702
      },
      "downloadBytes": null,
      "references": [
        "https://molview.com/subscriptions/",
        "https://molview.com/api/"
      ]
    },
    {
      "id": "p13",
      "slug": "ketcher",
      "name": "Ketcher",
      "rank": 32,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "Indigo",
          "Miew",
          "InChI",
          "Imago"
        ],
        "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/README.md",
        "note": "Own canvas; Miew supplies 3D; InChI via Indigo; optional Imago OCR service."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "In-house Ketcher SVG renderer on Raphaël; Indigo generated images",
        "language": "TypeScript",
        "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/application/render/raphaelRender.ts#L97"
      },
      "enginesChecked": true,
      "languageNote": "Less/CSS style interfaces; HTML/Python/Shell/Dockerfile support examples, tests and tooling.",
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=Op-9YDmXqF8",
        "embed": "https://www.youtube-nocookie.com/embed/Op-9YDmXqF8",
        "title": "Ketcher - Macromolecules mode overview, part 1",
        "author": "Life Sciences Open Source EPAM",
        "linkedFrom": "https://lifescience.opensource.epam.com/ketcher/",
        "poster": "https://i.ytimg.com/vi/Op-9YDmXqF8/hqdefault.jpg"
      },
      "embedding": {
        "methods": [
          "npm package",
          "iframe"
        ],
        "package": "ketcher-react",
        "limit": "Apache-2.0; retain license and notices.",
        "how": "Mount React Editor with a structServiceProvider; or iframe standalone release."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "Indigo chemistry, WebAssembly or native"
        },
        {
          "language": "C",
          "role": "InChI reference library through Indigo"
        },
        {
          "language": "JavaScript",
          "role": "Raphaël graphics and Miew 3D viewer"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-2.1, MPL-1.0 and AFL-3.0 components, alongside MIT/BSD/Apache/ISC and other permissive licenses.",
        "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/NOTICE",
        "notice": "https://github.com/epam/ketcher/blob/master/NOTICE",
        "libraries": [
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "Miew",
            "license": "MIT",
            "source": "https://github.com/epam/miew/blob/main/LICENSE.md"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          },
          {
            "name": "Imago",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Imago/blob/master/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "Ketcher is primarily an embeddable structure editor distributed as React components and an iframe-ready browser application.",
      "summary": "A web editor for drawing molecules, reactions, and biomolecules and embedding chemical structure input in applications.",
      "website": "https://lifescience.opensource.epam.com/ketcher/",
      "repo": "https://github.com/epam/ketcher",
      "docs": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md",
      "vendor": "EPAM Systems, Inc.",
      "license": {
        "kind": "open-source",
        "spdx": "Apache-2.0",
        "text": "Apache License 2.0; permits commercial use, modification and redistribution.",
        "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://lifescience.opensource.epam.com/ketcher/#license"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v3.18.0",
        "date": "2026-09-02",
        "source": "https://github.com/epam/ketcher/releases/tag/v3.18.0"
      },
      "engine": {
        "rendering": "SVG in the editor; Indigo renders generated PNG and SVG images.",
        "chemistry": "Indigo, through WebAssembly or a remote Indigo service",
        "ui": "React",
        "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/README.md"
      },
      "languages": [
        "TypeScript",
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#drawing-bonds",
          "note": "Drew single, double and triple bonds.",
          "shot": {
            "image": "evidence/ketcher/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-react/src/script/ui/data/schema/struct-schema.ts#L342",
          "note": "Drew solid, hashed and wavy bonds.",
          "shot": {
            "image": "evidence/ketcher/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-react/src/script/ui/data/schema/struct-schema.ts#L342",
          "note": "Dative and hydrogen bonds are available.",
          "shot": {
            "image": "evidence/ketcher/f-special-bonds.webp",
            "caption": "Bond tool menu with arrow and dashed bond options."
          }
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#templates-toolbar",
          "note": "Placed benzene and cyclohexane rings.",
          "shot": {
            "image": "evidence/ketcher/f-rings.webp",
            "caption": "Benzene and cyclohexane rings on the drawing canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-react/src/templates/library.sdf#L8258",
          "note": "Chair conformation templates are included."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-react/src/script/editor/tool/chain.ts#L167",
          "note": "Dragging sets the number of zigzag carbon-chain bonds."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#templates-toolbar",
          "note": "Placed L-alanine from the structure library.",
          "shot": {
            "image": "evidence/ketcher/f-templates.webp",
            "caption": "Structure Library with template categories and amino acid entries."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#templates-toolbar",
          "note": "Save to Templates creates reusable user templates.",
          "shot": {
            "image": "evidence/ketcher/f-custom-templates.webp",
            "caption": "Save Structure dialog with Save to Templates button."
          }
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#expandingcontracting-s-group",
          "note": "Functional groups expand, contract and retain underlying chemistry."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-react/src/script/ui/data/schema/struct-schema.ts#L91",
          "note": "Element labels, aliases, charge and isotope properties are editable."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-react/src/script/ui/data/schema/struct-schema.ts#L159",
          "note": "Mono- and diradical states are available."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://rc.test.lifescience.opensource.epam.com/ketcher/editing-tips.html#fast-atom-label-input",
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Lasso and fragment selection visible; transforms not verified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/domain/entities/rxnArrow.ts#L23",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/ketcher/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the drawing canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/application/editor/operations/rxn/RxnArrowResize.ts#L57",
          "note": "Drew an elliptical half-headed arrow.",
          "shot": {
            "image": "evidence/ketcher/f-mechanism-arrows.webp",
            "caption": "Curved half-headed arrow on the drawing canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/README.md#getrxn",
          "note": "RXN export stores reactants and products."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#drawing-reactions",
          "note": "Manual mapping, automatic mapping and unmapping tools."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-react/src/script/ui/views/modal/components/Text/SpecialSymbolsList/SpecialSymbolsList.tsx#L30",
          "note": "Special-symbol palette includes Greek letters, temperature and Angstrom symbols."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#adding-text-objects-on-the-canvas",
          "note": "Styled captions support subscripts and superscripts; font settings are global."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#drawing-graphical-objects",
          "note": "Ellipse, rectangle and line tools; S-groups provide brackets."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#ketcher-molecules-mode",
          "note": "Clean Up makes bond lengths and angles uniform.",
          "engine": {
            "library": "Indigo C++ (indigo-ketcher WebAssembly in standalone mode, or Indigo HTTP service in remote mode)",
            "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L215"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#acs-american-chemical-society-style",
          "note": "Built-in ACS settings.",
          "shot": {
            "image": "evidence/ketcher/f-journal-styles.webp",
            "caption": "Settings dialog with Set ACS Settings button."
          }
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-react/src/script/ui/state/options/index.ts#L184",
          "note": "Bond and font settings persist in browser storage."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Selected atoms and bonds can receive individual highlight colors."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#adding-images-on-the-canvas",
          "note": "PNG and SVG images can be placed on the canvas."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#drawing-atoms",
          "note": "Invalid valence is underlined in red.",
          "shot": {
            "image": "evidence/ketcher/f-valence-check.webp",
            "caption": "Settings dialog with Show valence warnings enabled."
          },
          "engine": {
            "library": "In-house TypeScript valence rules; Indigo C++ full structure checker via WebAssembly or HTTP service",
            "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/domain/entities/atom.ts#L445"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#stereochemistry",
          "note": "Calculate CIP assigns R/S, r/s and E/Z descriptors.",
          "engine": {
            "library": "Indigo C++ CIP calculation (indigo-ketcher WebAssembly or Indigo HTTP service)",
            "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L165"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/README.md#calculate",
          "note": "Caffeine: C8H10N4O2; molecular weight 194.194.",
          "shot": {
            "image": "evidence/ketcher/f-formula-mass.webp",
            "caption": "Calculated formula, molecular weight, exact mass, and elemental analysis."
          },
          "engine": {
            "library": "Indigo C++ (indigo-ketcher WebAssembly or Indigo HTTP service)",
            "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L177"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Pasting caffeine as a name produced a conversion error."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in inspected controls."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#drawing-r-groups",
          "note": "R-groups, atom lists, attachment points and R-group logic."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#marking-s-groups",
          "note": "SRU and copolymer S-groups encode repeating units and connectivity."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#ketcher-macromolecules-mode",
          "note": "Monomer library, sequence editing, FASTA and HELM."
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/infrastructure/services/struct/remoteStructService.ts#L432",
          "note": "Requires remote Imago service; unavailable in standalone mode.",
          "engine": {
            "library": "Imago OCR remote HTTP service (not available in standalone WebAssembly mode)",
            "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/infrastructure/services/struct/remoteStructService.ts#L432"
          }
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#3d-viewer",
          "note": "Rotated SDF coordinates; SMILES import remained planar.",
          "shot": {
            "image": "evidence/ketcher/f-model-3d.webp",
            "caption": "Miew window displaying a molecular model with explicit hydrogens."
          },
          "engine": {
            "library": "Miew JavaScript/WebGL viewer through the miew-react React component",
            "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-react/src/script/ui/views/modal/components/process/Miew/Miew.tsx#L48"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#working-with-files",
          "note": "Exported CDXML and reopened it.",
          "engine": {
            "library": "Indigo C++ conversion (indigo-ketcher WebAssembly or Indigo HTTP service)",
            "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L126"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#working-with-files",
          "note": null,
          "engine": {
            "library": "Indigo C++ conversion (indigo-ketcher WebAssembly or Indigo HTTP service)",
            "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L127"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#working-with-files",
          "note": "Opened MOL and SDF; exported MOL.",
          "shot": {
            "image": "evidence/ketcher/f-mol-sdf.webp",
            "caption": "Save Structure format menu listing MDL Molfile and SDF."
          },
          "engine": {
            "library": "In-house TypeScript MolSerializer for ordinary MOL V2000; Indigo WebAssembly or HTTP service for SDF, V3000 and query MOL",
            "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L93"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#working-with-files",
          "note": "Imported and exported SMILES.",
          "engine": {
            "library": "Indigo C++ conversion/layout (indigo-ketcher WebAssembly or Indigo HTTP service)",
            "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/application/formatters/serverFormatter.ts#L112"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#working-with-files",
          "note": null,
          "engine": {
            "library": "InChI library through Indigo's indigo-inchi module (WebAssembly or Indigo HTTP service)",
            "source": "https://github.com/epam/Indigo/blob/f50fdb74c4e95337ab002c8f4b5006a100032ed7/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L201"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/README.md#getrxn",
          "note": "RXN V2000 and V3000."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/README.md#exportimage",
          "note": "Exported SVG for all three fixtures."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF option in Save Structure format list."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-react/src/locales/en/dialogs.json#L89",
          "note": "Default PNG exported; high-resolution option not verified."
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/issues/3689",
          "note": "MOL-text exchange; direct ChemDraw OLE clipboard pasting is unsupported."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/README.md#ketcher-api",
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/README.md#custombutton",
          "note": "Custom toolbar buttons invoke application-defined handlers."
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/README.md#installation-and-usage",
          "note": "Mount React Editor with a structServiceProvider; or iframe standalone release."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Eight highlight colors add backgrounds behind atoms and bonds."
        }
      },
      "caveats": [
        "OCR requires a remote Imago service and is unavailable in standalone mode.",
        "Multistep reactions are flattened when saved outside KET, CDX or CDXML.",
        "Native ChemDraw OLE clipboard data cannot be pasted directly in the browser."
      ],
      "github": {
        "url": "https://github.com/epam/ketcher",
        "stars": 930,
        "checkedOn": "2026-11-06",
        "firstCommit": "2010-11-04",
        "commits": 7732,
        "contributors": 258,
        "pushedAt": "2026-11-05T16:57:06Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "3.18.0",
        "canvas": "evidence/ketcher/canvas.webp",
        "canvasLight": "evidence/ketcher/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 364.84,
          "paclitaxelMb": 339.94,
          "baselineMb": 50.33,
          "rssIdleMb": 669.8,
          "rssPaclitaxelMb": 668.31,
          "runs": 3,
          "processes": 4,
          "method": "Playwright headless Chromium; summed process-tree phys_footprint; medians of three runs.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://lifescience.opensource.epam.com/KetcherDemoSA/index.html",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/ketcher/simple.svg",
            "note": "Kekule SMILES imported with default layout.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/ketcher/complex.svg",
            "note": "Kekule SMILES imported with default layout and stereobonds.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/ketcher/threed.png",
            "note": "Rotatable 3D viewer displays SDF coordinates in its default style.",
            "structure": "match"
          }
        ],
        "observations": [
          "About reports Ketcher 3.18.0 and Indigo 1.46.0.0.",
          "SMILES import generated centered 2D structures without cleanup.",
          "Default 3D viewer uses faint lines on gray and shows explicit SDF hydrogens.",
          "Default caffeine PNG measured 223 by 162 pixels.",
          "The standalone open dialog reports image recognition unavailable."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 926,
        "transferBytes": 8598936
      },
      "downloadBytes": 35057618,
      "references": [
        "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/README.md",
        "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-core/src/application/ketcher.ts#L471",
        "https://github.com/epam/ketcher/blob/48af1b20d58607f9d77b148f09fa468202239f3f/packages/ketcher-standalone/package.json",
        "https://github.com/epam/Indigo/tree/master/api/wasm/indigo-ketcher"
      ]
    },
    {
      "id": "p113",
      "slug": "ai-chemical-drawing",
      "name": "AI Chemical Drawing (CubicZnS)",
      "rank": 33,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "Ketcher",
          "Indigo"
        ],
        "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/components/KetcherFrame.tsx#L92-L100",
        "note": "Embeds Ketcher standalone through an iframe; Indigo supplies chemistry."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher/Raphaël; Indigo SVG/PNG exports",
        "language": "TypeScript",
        "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/render/raphaelRender.ts#L110"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript supports tooling and tests; CSS styles the interface.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Host license unspecified; local application only",
        "how": "Embeds Ketcher internally; no host integration route documented."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Raphaël SVG and Miew 3D"
        },
        {
          "language": "C++",
          "role": "Indigo chemistry and image exports"
        },
        {
          "language": "C",
          "role": "InChI compiled to WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-3.0-or-later (optional Sharp/libvips) and CC-BY-4.0 (caniuse-lite data); other listed runtime dependencies use permissive licenses.",
        "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/package-lock.json",
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "The end-user app combines a full manual Ketcher editor, reaction drawing, styled text and SVG export for publication figures.",
      "summary": "A local web app for drafting molecules and reactions with AI, editing them in Ketcher, and exporting structures.",
      "website": "https://github.com/CubicZnS/ai-chemical-drawing",
      "repo": "https://github.com/CubicZnS/ai-chemical-drawing",
      "docs": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md",
      "vendor": "CubicZnS",
      "license": {
        "kind": "unclear",
        "spdx": null,
        "text": "No license declared for the host app; embedded Ketcher is Apache-2.0.",
        "source": "https://github.com/CubicZnS/ai-chemical-drawing/tree/d07af9cb02e79df13e93afc6d415217b091c7bf9"
      },
      "price": {
        "text": "Not published (2026-11-05); AI provider costs vary.",
        "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/CubicZnS/ai-chemical-drawing/releases"
      },
      "engine": {
        "rendering": "Ketcher SVG (Raphaël) in the browser; Indigo renders SVG/PNG exports",
        "chemistry": "Indigo WebAssembly through Ketcher standalone",
        "ui": "Next.js 16 and React 19 host; embedded Ketcher React editor",
        "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/Tech-Spec.md"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-bonds",
          "note": "Drew single, double, and triple bonds.",
          "shot": {
            "image": "evidence/ai-chemical-drawing/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the editor canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts#L26",
          "note": "Drew solid, hashed, and wavy bonds.",
          "shot": {
            "image": "evidence/ai-chemical-drawing/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts#L39",
          "note": "Dative and hydrogen bond tools in embedded Ketcher."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#hotkeys",
          "note": "Placed benzene and cyclohexane.",
          "shot": {
            "image": "evidence/ai-chemical-drawing/f-rings.webp",
            "caption": "Benzene and cyclohexane on the canvas above ring tools."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/templates/library.sdf#L8258",
          "note": "Embedded Ketcher library includes chair and boat templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/editor/tool/chain.ts#L174",
          "note": "Dragging determines the number of chain segments."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Placed alanine from structure library."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Save a drawn structure into Ketcher's User Templates library."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md#L99",
          "note": "Me/Et use chemically meaningful, contracted SUP S-groups."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/data/schema/struct-schema.ts#L83",
          "note": "Element labels, charge and isotope are editable atom properties."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/data/schema/struct-schema.ts#L131",
          "note": "Atom properties include mono- and diradical states."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/state/handleHotkeysOverItem.ts#L266",
          "note": "Hovering an atom allows keyboard element and charge changes."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/editor/tool/select/select.ts#L285",
          "note": "Lasso, rotate, flip; resizing applies to images and simple shapes."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md#L118",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/ai-chemical-drawing/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the editor canvas."
          }
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/leftToolbarOptions.ts#L41",
          "note": "Drew a curved arrow; editing not checked.",
          "shot": {
            "image": "evidence/ai-chemical-drawing/f-mechanism-arrows.webp",
            "caption": "A curved arrow on the editor canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md#L61",
          "note": "Reaction SMILES and RXN retain reactants, products and agents."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-reactions",
          "note": "Embedded Ketcher provides manual mapping, unmapping and automapping."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/modal/components/Text/SpecialSymbolsList/SpecialSymbolsList.tsx#L30",
          "note": "Text palette includes Greek, temperature, angstrom and reaction symbols."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#adding-text-objects-on-the-canvas",
          "note": "Ketcher canvas text supports formatting, subscripts and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-graphical-objects",
          "note": "Ellipse, rectangle and line tools; chemical brackets through S-groups."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#ketcher-molecules-mode",
          "note": "Ketcher Clean Up regularizes bond lengths and angles.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L224"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#acs-american-chemical-society-style",
          "note": "Embedded Ketcher includes an ACS settings preset."
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/settings/README.md#storage-adapters",
          "note": "Ketcher persists settings; host reapplies atom font sizes on loading."
        },
        "color": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Colored highlighting exists; host reports direct bond coloring unsupported."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#adding-images-on-the-canvas",
          "note": "Ketcher places PNG and SVG images on the canvas."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-atoms",
          "note": "Invalid atom valences are underlined in red.",
          "engine": {
            "library": "Ketcher 3.18.0 (TypeScript valence rules)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/domain/entities/atom.ts#L445"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#ketcher-molecules-mode",
          "note": "Calculate CIP determines R/S, r/s and E/Z configurations.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L170"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/README.md#calculate",
          "note": "Caffeine: C8H10N4O2, molecular weight 194.194.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L182"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md#用法",
          "note": "AI converts named molecules into editable structures; provider key required.",
          "engine": {
            "library": "Configurable LLM (remote server) via in-house TypeScript",
            "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/lib/llm-client.ts#L14"
          }
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No dedicated naming command found; AI requires a key."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-r-groups",
          "note": "Ketcher supports R-group labels, fragments, attachment points and logic."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#marking-s-groups",
          "note": "Semantic SRU and copolymer groups include repeat-connectivity options."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#ketcher-macromolecules-mode",
          "note": "Embedded Ketcher supports peptide and nucleic-acid monomers and sequences."
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts#L720",
          "note": "Recognition explicitly rejects requests in standalone mode."
        },
        "database-lookup": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/PRD.md#L79",
          "note": "Explicitly excludes name-to-structure databases and OPSIN/PubChem dependencies."
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#3d-viewer",
          "note": "SDF model rotated in depth in Miew viewer.",
          "shot": {
            "image": "evidence/ai-chemical-drawing/f-model-3d.webp",
            "caption": "Molecular model in the Miew viewer."
          },
          "engine": {
            "library": "Miew (JavaScript/WebGL, through miew-react 0.11.0)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/modal/components/process/Miew/Miew.tsx#L44"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/README.md#supported-formats",
          "note": "Exported and reopened a CDXML structure.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly)",
            "source": "https://github.com/epam/Indigo/blob/b36d38f5293470721fe02ee570d9f0e6488a5b8d/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L193"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/README.md#supported-formats",
          "note": "Embedded Ketcher reads and writes binary CDX.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly)",
            "source": "https://github.com/epam/Indigo/blob/b36d38f5293470721fe02ee570d9f0e6488a5b8d/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L197"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/README.md#supported-formats",
          "note": "Opened MOL and SDF; saved MOL and SDF.",
          "engine": {
            "library": "Ketcher 3.18.0 (TypeScript MOL V2000); Indigo 1.46.0 (WebAssembly MOL V3000/SDF)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L82"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md#用法",
          "note": "Imported SMILES and saved Daylight SMILES.",
          "engine": {
            "library": "Indigo 1.46.0 (WebAssembly)",
            "source": "https://github.com/epam/Indigo/blob/b36d38f5293470721fe02ee570d9f0e6488a5b8d/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L137"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md#用法",
          "note": "Host provides Copy InChI export.",
          "engine": {
            "library": "InChI (C library through Indigo 1.46.0 WebAssembly)",
            "source": "https://github.com/epam/Indigo/blob/b36d38f5293470721fe02ee570d9f0e6488a5b8d/api/wasm/indigo-ketcher/indigo-ketcher.cpp#L201"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md#用法",
          "note": "AI-generated RXN input and Copy RXN export."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md#用法",
          "note": "Downloaded SVG drawings.",
          "shot": {
            "image": "evidence/ai-chemical-drawing/f-svg-export.webp",
            "caption": "Export panel showing an SVG download confirmation."
          }
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF option in available export formats."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/lib/use-ketcher.ts#L262",
          "note": "PNG downloaded at 750×292 pixels, reported 72 dpi.",
          "shot": {
            "image": "evidence/ai-chemical-drawing/f-png-export.webp",
            "caption": "Export panel showing a PNG download confirmation."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/Tech-Spec.md#24-使用的-ketcher-api",
          "note": "Technical specification documents the embedded Ketcher JavaScript API."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md",
          "note": "Embeds Ketcher internally; no host integration route documented."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CubicZnS/ai-chemical-drawing/blob/d07af9cb02e79df13e93afc6d415217b091c7bf9/README.md#用法",
          "note": "Chat generates structures and revises current drawings through an AI provider.",
          "shot": {
            "image": "evidence/ai-chemical-drawing/f-ai-assistant.webp",
            "caption": "Structure request panel with example prompts and generation button."
          }
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Embedded Ketcher highlights selected atoms and bonds in eight colors."
        }
      },
      "caveats": [
        "No license or released version is declared for the host app.",
        "Requires separate local Ketcher setup; AI generation needs a provider key and manual chemistry checking.",
        "Ketcher documents colored highlighting, while the host README says bond coloring is unsupported."
      ],
      "github": {
        "url": "https://github.com/CubicZnS/ai-chemical-drawing",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-10-15",
        "commits": 1,
        "contributors": 1,
        "pushedAt": "2026-10-15T07:52:01Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.1.0",
        "canvas": "evidence/ai-chemical-drawing/canvas.webp",
        "canvasLight": null,
        "canvasDark": "evidence/ai-chemical-drawing/canvas-dark.webp",
        "memory": {
          "idleMb": 964.39,
          "paclitaxelMb": 893.04,
          "baselineMb": 375.02,
          "rssIdleMb": 1489.25,
          "rssPaclitaxelMb": 1447.23,
          "runs": 3,
          "processes": 7,
          "method": "Median fresh headed Chromium process-tree phys_footprint; published SMILES route; MiB.",
          "note": "Local source servers measured separately; excluded from browser totals."
        },
        "themes": {
          "light": false,
          "dark": true,
          "how": "fixed",
          "note": "Fixed dark interface; embedded Ketcher canvas stays white."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://github.com/CubicZnS/ai-chemical-drawing",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": 599539712,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/ai-chemical-drawing/simple.svg",
            "note": "Default SMILES layout; MOL saved separately.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/ai-chemical-drawing/complex.svg",
            "note": "Default layout has overlapping oxygen and hydroxyl labels.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/ai-chemical-drawing/threed.png",
            "note": "3D viewer rotates supplied coordinates; viewport saved as threed-view.png.",
            "structure": "match"
          }
        ],
        "observations": [
          "Source package 0.1.0 at commit d07af9c; embedded Ketcher About shows 3.18.0.",
          "Bun dependency transfer size was unavailable; downloadBytes is unknown.",
          "Paclitaxel's automatic layout overlaps some oxygen and hydroxyl labels.",
          "The SDF model displays explicit hydrogens in the 3D viewport.",
          "Natural-language generation requires a provider API key."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/CubicZnS/ai-chemical-drawing",
        "https://github.com/CubicZnS/ai-chemical-drawing",
        "https://github.com/CubicZnS/ai-chemical-drawing/blob/main/README.md"
      ]
    },
    {
      "id": "p98",
      "slug": "openreactions",
      "name": "OpenReactions",
      "rank": 34,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "OpenChemLib"
        ],
        "source": "https://openreactions.com/draw/assets/openchemlib-zeHud5Jx.js",
        "note": "OpenChemLib dependency confirmed by bundled license notice; editor provenance remains unestablished."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Custom Canvas/SVG renderer",
        "language": "JavaScript",
        "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Hosted editor found; no supported embedding route confirmed."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Includes BSD-3-Clause (OpenChemLib) and MIT (React).",
        "source": "https://openreactions.com/draw/assets/openchemlib-zeHud5Jx.js",
        "notice": null,
        "libraries": [
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Standalone drawing and figure workspaces implement editable chemistry, page composition, and vector SVG/PDF export.",
      "summary": "Browser editor for chemical structures, reaction mechanisms, animations, and composed scientific figures.",
      "website": "https://openreactions.com/",
      "repo": null,
      "docs": "https://openreactions.com/",
      "vendor": "Nathan Levy",
      "license": {
        "kind": "unclear",
        "spdx": null,
        "text": "No product license stated.",
        "source": "https://openreactions.com/"
      },
      "price": {
        "text": "Not published",
        "source": null
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://openreactions.com/"
      },
      "engine": {
        "rendering": "HTML Canvas 2D for drawings; SVG for figures and vector export; jsPDF/svg2pdf for PDF.",
        "chemistry": "OpenChemLib",
        "ui": "React",
        "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js"
      },
      "languages": [
        "JavaScript",
        "CSS",
        "HTML"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Drew single and triple; clicked single to make double.",
          "shot": {
            "image": "evidence/openreactions/f-bonds-core.webp",
            "caption": "Bond tools and a structure with single and double bonds"
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Placed solid, hashed, and wavy bonds.",
          "shot": {
            "image": "evidence/openreactions/f-stereo-bonds.webp",
            "caption": "Stereo bond tools and a structure with wedge and hashed bonds"
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Placed benzene; several ring sizes appear in toolbar.",
          "shot": {
            "image": "evidence/openreactions/f-rings.webp",
            "caption": "Ring tools and aromatic rings on the canvas"
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Dedicated chair and Newman tools."
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Placed a morpholine fragment from the library."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Structure fragments saved locally as SMILES."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Recognized groups can be expanded or contracted."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Charges and labels editable; isotopes imported through SMILES/MOL.",
          "shot": {
            "image": "evidence/openreactions/f-atom-labels.webp",
            "caption": "Element and charge controls beside a labeled structure"
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Lone-pair tool also supports single-electron dots."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://openreactions.com/",
          "note": "Hover over an atom and type its label."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Box selection, rotation, flipping; resizing only in Figure mode."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Placed forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/openreactions/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrow tools in the reaction toolbar"
          }
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Placed a curved electron-pair arrow; editing unverified.",
          "shot": {
            "image": "evidence/openreactions/f-mechanism-arrows.webp",
            "caption": "Curved arrow tools in the reaction toolbar"
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "RXN import and export preserve reactants and products."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/FigureEditor-10qncLgg.js",
          "note": "Figure symbol palette includes Greek letters, charges, and arrows."
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/FigureEditor-10qncLgg.js",
          "note": "Fonts and styling; sub/superscripts use limited Unicode symbols."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/FigureEditor-10qncLgg.js",
          "note": "Editable shapes and freehand brush paths."
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/FigureEditor-10qncLgg.js",
          "note": "Selected objects align left, top, or center."
        },
        "groups": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/FigureEditor-10qncLgg.js",
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Tidy structure regenerates coordinates with OpenChemLib.",
          "engine": {
            "library": "OpenChemLib (JavaScript)",
            "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/FigureEditor-10qncLgg.js",
          "note": null
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/FigureEditor-10qncLgg.js",
          "note": "Page-size presets; figure documents contain one page."
        },
        "pictures": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/FigureEditor-10qncLgg.js",
          "note": "PNG, JPEG, and WebP image insertion."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Basic structure check flags valence and stereochemistry issues.",
          "engine": {
            "library": "OpenChemLib (JavaScript)",
            "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Caffeine: C8H10N4O2 and 194.19 g/mol.",
          "engine": {
            "library": "OpenChemLib (JavaScript) + In-house JavaScript isotope and charge corrections",
            "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Caffeine entered as SMILES produced a parse error."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Info and menus showed no naming command."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "R atom tool appears; query behavior unverified."
        },
        "polymers": {
          "status": "no",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Repeat-unit brackets are graphical; chemical polymer export unsupported."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/MoleculeViewer-DqqJ3BPE.js",
          "note": "Generated cholesterol model and rotated it.",
          "shot": {
            "image": "evidence/openreactions/f-model-3d.webp",
            "caption": "3D molecular model with hydrogen and rotation controls"
          },
          "engine": {
            "library": "Three.js (JavaScript WebGL viewer) + OpenChemLib (JavaScript conformer-generation Web Worker)",
            "source": "https://openreactions.com/draw/assets/MoleculeViewer-DqqJ3BPE.js"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "CDXML probe rejected; no CDXML export shown."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Imported MOL and SDF; exported both formats.",
          "engine": {
            "library": "OpenChemLib (JavaScript)",
            "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Imported SMILES and copied generated SMILES.",
          "engine": {
            "library": "OpenChemLib (JavaScript)",
            "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Single reaction arrow required; agent structures rejected on import."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "Exported SVG drawings."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/pdfExport-W_f_5toa.js",
          "note": "Exported PDF; no raster images found inside."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://openreactions.com/draw/assets/index-CoJdvsa_.js",
          "note": "PNG exported at 760×812; no 300 dpi setting found.",
          "shot": {
            "image": "evidence/openreactions/f-png-export.webp",
            "caption": "PNG output showing the caffeine structure"
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://openreactions.com/",
          "note": "Hosted editor found; no supported embedding route confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://openreactions.com/draw/assets/FigureEditor-10qncLgg.js",
          "note": "Figure highlighter draws exportable translucent colored strokes across structure regions."
        }
      },
      "caveats": [
        "Browser-local drawings stay in that browser; cross-device saving requires sign-in.",
        "No product license, pricing, or release version found in official documentation.",
        "Interactive behavior was not tested; findings rely on documentation and served code."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": "evidence/openreactions/canvas.webp",
        "canvasLight": "evidence/openreactions/canvas-light.webp",
        "canvasDark": "evidence/openreactions/canvas-dark.webp",
        "memory": {
          "idleMb": 483,
          "paclitaxelMb": 499,
          "baselineMb": 410,
          "rssIdleMb": 1059.66,
          "rssPaclitaxelMb": 1105.61,
          "runs": 3,
          "processes": 7,
          "method": "Playwright Chromium process-tree physical footprint; three fresh sessions, medians.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://openreactions.com/draw/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/openreactions/simple.svg",
            "note": "Automatically laid out caffeine; MOL also saved.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/openreactions/complex.svg",
            "note": "Automatically laid out 62 atoms; MOL also saved.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/openreactions/threed.png",
            "note": "Generated rotatable model; 2D SVG and MOL also saved.",
            "structure": "match"
          }
        ],
        "observations": [
          "SMILES imports generated 2D layouts without a cleanup command.",
          "Caffeine, paclitaxel, and cholesterol MOL exports retained fixture stereochemistry in RDKit.",
          "The 3D viewer generated a ball-and-stick model with hydrogens shown.",
          "Image exports cropped to the drawing; PNG used a 2× canvas scale.",
          "No app version was shown in About; the served JavaScript filename supplies the build ID."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 407,
        "transferBytes": 780969
      },
      "downloadBytes": null,
      "references": [
        "https://openreactions.com/"
      ]
    },
    {
      "id": "p62",
      "slug": "pychem-pro",
      "name": "PyChem-Pro",
      "rank": 35,
      "builtOn": {
        "relation": "fork",
        "editor": "ChemCanvas",
        "libraries": [
          "ChemCanvas",
          "OASA"
        ],
        "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/molecule.py#L2",
        "note": "2D sketcher files are marked \"Adapted from ChemCanvas (GPLv3)\". OASA is vendored and credited in the README."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Adapted ChemCanvas sketcher; in-house QPainter views",
        "language": "Python",
        "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/bond.py#L1-L229"
      },
      "enginesChecked": true,
      "languageNote": "Shell and batch files handle setup and launching.",
      "video": null,
      "embedding": {
        "methods": [
          "desktop widget"
        ],
        "package": null,
        "limit": "Custom noncommercial; services prohibited; bundled OASA GPL-2.0-or-later; undocumented widget.",
        "how": "Import internal SketcherWidget into PySide6; no documented embedding API."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Includes GPL-3.0-or-later (ChemCanvas), GPL-2.0-or-later (OASA), LGPL-2.1 (Jmol data), and LGPL-3.0/GPL-3.0 or commercial terms (PySide6/Qt).",
        "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/vendors/oasa/__init__.py",
        "notice": null,
        "libraries": [
          {
            "name": "ChemCanvas",
            "license": "GPL-3.0-or-later",
            "source": "https://github.com/ksharindam/chemcanvas/blob/main/pyproject.toml"
          },
          {
            "name": "OASA",
            "license": "GPL-2.0-or-later",
            "source": "https://bkchem.zirael.org/download/oasa-0.13.1.tar.gz"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its implemented 2D sketcher combines editable structures, reaction arrows, captions, and print-resolution raster export to create chemical figures.",
      "summary": "A desktop chemistry application and Python library for molecular visualization, structure sketching, geometry optimization, and cheminformatics.",
      "website": "https://sites.google.com/view/pydescriptorcstar/pychem-pro",
      "repo": "https://github.com/vijaymasand/PyChem-Pro",
      "docs": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/PyChem_Manual.md",
      "vendor": "Vijay Masand and Gaurav Masand",
      "license": {
        "kind": "source-available",
        "spdx": null,
        "text": "Custom noncommercial terms labeled PolyForm; service use restricted; bundled OASA has separate GPL notices.",
        "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/LICENSE"
      },
      "price": {
        "text": "Free for personal and educational use (2026-11-05); commercial use prohibited.",
        "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/README.md#license"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v1.0.0",
        "date": "2026-07-05",
        "source": "https://github.com/vijaymasand/PyChem-Pro/releases/tag/v1.0.0"
      },
      "engine": {
        "rendering": "Qt QPainter for molecular views and raster exports; Qt QGraphicsScene sketcher; offline ray-tracing export.",
        "chemistry": "In-house Python/NumPy chemistry with vendored OASA for SMILES and 2D layout; optional RDKit plugin.",
        "ui": "PySide6 (Qt 6).",
        "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/README.md"
      },
      "languages": [
        "Python",
        "GLSL"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/tools.py#L258-L290",
          "note": "Tool selectable; drawing gestures produced no visible bond.",
          "shot": {
            "image": "evidence/pychem-pro/f-bonds-core.webp",
            "caption": "Bond tool and single and double bonds in a caffeine drawing."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py#L474-L481",
          "note": "Bond selector visible; stereo drawing could not be verified."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/tools.py#L74-L90",
          "note": "Ring tools selectable; placement attempts produced no visible ring.",
          "shot": {
            "image": "evidence/pychem-pro/f-rings.webp",
            "caption": "Benzene, hexane and pentane ring tools beside the canvas."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/tools.py#L598-L610",
          "note": "Naphthalene template constructs a fused second ring."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/tools.py#L242-L255",
          "note": "Recognized group labels expand into chemically connected atoms and bonds."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py#L458-L523",
          "note": "Charges and arbitrary labels editable; atom isotope editing unverified."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/tools.py#L1234-L1280",
          "note": "Atom tools add lone pairs and charged radical dots."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/tools.py#L20-L71",
          "note": "Typing changes the focused atom; element shortcuts are defined."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/tools.py#L894-L962",
          "note": "Select All works; rotate and flip controls visible.",
          "shot": {
            "image": "evidence/pychem-pro/f-selection-tools.webp",
            "caption": "Selected structure with rotate and flip controls in the sketcher."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/arrow.py#L16-L31",
          "note": "Forward/equilibrium tools selected; drags produced no visible arrows.",
          "shot": {
            "image": "evidence/pychem-pro/f-reaction-arrows.webp",
            "caption": "Reaction, equilibrium and reverse arrow controls beside the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/arrow.py#L54-L85",
          "note": "Curly tool selected; drags produced no visible arrows.",
          "shot": {
            "image": "evidence/pychem-pro/f-mechanism-arrows.webp",
            "caption": "Curly and fish arrow controls beside the canvas."
          }
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py#L591-L633",
          "note": "Free-text subscripts/superscripts supported; user font selection unverified."
        },
        "shapes": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/shapes.py#L89-L119",
          "note": "Editable rectangles/ellipses supported; brackets and unrestricted free curves unverified."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py#L543-L566",
          "note": "Command regenerates coordinates with normalized bond lengths and angles.",
          "engine": {
            "library": "OASA (vendored Python, coords_generator)",
            "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py#L543-L566"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py#L1130-L1176",
          "note": "Selected atoms, bonds and other drawable objects receive individual colors."
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py#L1039-L1128",
          "note": "Page dimensions, presets and orientation supported; multipage documents unverified."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/core/domain/models/molecule.py#L539-L572",
          "note": "Correct formula; descriptor mass omits implicit hydrogen contribution.",
          "shot": {
            "image": "evidence/pychem-pro/f-formula-mass.webp",
            "caption": "Molecular formula C27H46O above a two-dimensional structure."
          },
          "engine": {
            "library": "In-house (Python molecular formula and mass calculations)",
            "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/core/domain/models/molecule.py#L539-L572"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/cheminformatics/services/lipophilicity_service.py#L72-L83",
          "note": "Descriptor CSV reports cholesterol LogP 6.814388959638463.",
          "engine": {
            "library": "Ported from MLP_Tools (Python/NumPy fragment-based logP)",
            "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/cheminformatics/services/lipophilicity_service.py#L1-L83"
          }
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Entering caffeine produced an invalid-atom SMILES parsing error."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in inspected menus."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/visualization_3d/ui/mouse_controller.py#L78-L87",
          "note": "Built cholesterol from SMILES and rotated the model.",
          "shot": {
            "image": "evidence/pychem-pro/f-model-3d.webp",
            "caption": "Ball-and-stick molecular model in the 3D viewer."
          },
          "engine": {
            "library": "In-house (Python QPainter molecular viewer and rotation controller)",
            "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/visualization_3d/ui/mol_viewer_3d.py#L145-L217"
          }
        },
        "crystals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/services/loading/loader_service.py#L98-L100",
          "note": "Opens PDBx/mmCIF files; general crystallographic CIF support unverified."
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Import explicitly failed: Unsupported file format: .cdxml."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py#L873-L967",
          "note": "MOL import and SDF export worked; no MOL save command.",
          "engine": {
            "library": "In-house (Python V2000 MOL reader/writer and SDF record handling)",
            "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py#L873-L967"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py",
          "note": "Imports work; generated SMILES lose all specified stereocenters.",
          "shot": {
            "image": "evidence/pychem-pro/f-smiles.webp",
            "caption": "Molecular viewer with a SMILES input and 3D structure."
          },
          "engine": {
            "library": "OASA (vendored Python SMILES parser and writer); In-house (Python fallback SMILES writer)",
            "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/app/chemistry_actions.py#L185-L255"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": ".svg request saved .svg.png; no vector output."
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "System Print saves PDF containing rasterized molecular views.",
          "shot": {
            "image": "evidence/pychem-pro/f-pdf-export.webp",
            "caption": "Page showing two-dimensional and three-dimensional molecular views."
          }
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/visualization_2d/ui/mol_viewer_2d.py#L544-L587",
          "note": "300-DPI export works; sketcher metadata says 72 DPI.",
          "shot": {
            "image": "evidence/pychem-pro/f-png-export.webp",
            "caption": "Ball-and-stick molecular model on a white background."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/README.md#quick-start--python-api",
          "note": "Public pychem package supports scripting without Qt.",
          "shot": {
            "image": "evidence/pychem-pro/f-python-api.webp",
            "caption": "Embedded Python console above the molecular viewer."
          }
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/README.md#plugins",
          "note": "Documented Python plugin API with analysis, visualization, and I/O plugins."
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/sketcher_2d/ui/sketcher_widget.py#L19",
          "note": "Custom noncommercial; services prohibited; bundled OASA GPL-2.0-or-later; undocumented widget."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/src/features/visualization_2d/ui/mol_viewer_2d.py#L268-L355",
          "note": "Yellow atom selection halos remain visible in exported images."
        }
      },
      "caveats": [
        "Custom noncommercial license. Bundled components, including GPL-licensed code, carry their own terms.",
        "The sketcher saves molecules, not complete schemes."
      ],
      "github": {
        "url": "https://github.com/vijaymasand/PyChem-Pro",
        "stars": 401,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-03-18",
        "commits": 292,
        "contributors": 4,
        "pushedAt": "2026-10-18T04:22:52Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "1.0.0",
        "canvas": "evidence/pychem-pro/canvas.webp",
        "canvasLight": "evidence/pychem-pro/canvas-light.webp",
        "canvasDark": "evidence/pychem-pro/canvas-dark.webp",
        "memory": {
          "idleMb": 469.17,
          "paclitaxelMb": 486.51,
          "baselineMb": null,
          "rssIdleMb": 517.24,
          "rssPaclitaxelMb": 543.28,
          "runs": 3,
          "processes": 1,
          "method": "Three fresh open -n launches; 10-second rests; ps tree; footprint phys_footprint; median decimal MB.",
          "note": "Published 2D-Sketcher SMILES route; main viewer retained empty; no child processes; all instances quit."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Canvas stays white; Light leaves dark toolbars with low contrast."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "PyChem-Pro-v1.0.0.tar.gz",
        "ran": true,
        "failure": null,
        "downloadBytes": 1553102,
        "installedBytes": 1571659776,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/pychem-pro/simple.png",
            "note": "Default SMILES layout; zoomed for capture without cleanup.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/pychem-pro/complex.png",
            "note": "Default SMILES layout has overlapping labels and bonds; no cleanup.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/pychem-pro/threed.png",
            "note": "Built from SMILES; rotated and zoomed, retaining default Ball & Stick.",
            "structure": "stereo"
          }
        ],
        "observations": [
          "Caffeine is readable; paclitaxel's default layout has overlapping bonds and labels.",
          "Generated paclitaxel and cholesterol SMILES lose all specified stereocenters.",
          "Default 3D rendering uses green Ball & Stick and red oxygen.",
          "Cholesterol formula is C27H46O; descriptor molecular weight is 340.296.",
          "Manual drawing gestures produced no visible objects; automation limitations remain possible."
        ]
      },
      "perf": null,
      "downloadBytes": 1553102,
      "references": [
        "https://github.com/vijaymasand/PyChem-Pro",
        "https://github.com/vijaymasand/PyChem-Pro/blob/f0119603495fedff79afd3b5ccf3cb2c7cf6e7cd/README.md"
      ]
    },
    {
      "id": "p39",
      "slug": "chemfig",
      "name": "chemfig",
      "rank": 36,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://mirrors.ctan.org/macros/generic/chemfig/chemfig.tex",
        "note": "Original TeX molecular drawing macros over TikZ; no interactive canvas."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "chemfig molecular macros over TikZ/PGF",
        "language": "TeX",
        "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig.tex"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "TeX typesetting macros; no embeddable editor documented."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Its TeX workflow produces publication-grade 2D structures and reaction documents.",
      "summary": "A TeX package for typesetting 2D chemical structures, reaction schemes, and mechanisms in publication documents.",
      "website": "https://www.ctan.org/pkg/chemfig",
      "repo": null,
      "docs": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf",
      "vendor": "Christian Tellechea",
      "license": {
        "kind": "open-source",
        "spdx": "LPPL-1.3c",
        "text": "LaTeX Project Public License version 1.3c or later.",
        "source": "https://www.ctan.org/tex-archive/macros/generic/chemfig"
      },
      "price": {
        "text": "Free",
        "source": "https://www.ctan.org/pkg/chemfig"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.82",
        "date": "2026-09-19",
        "source": "https://www.ctan.org/pkg/chemfig"
      },
      "engine": {
        "rendering": "TikZ/PGF vector graphics through TeX",
        "chemistry": null,
        "ui": null,
        "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=5"
      },
      "languages": [
        "TeX"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=8",
          "note": "Single, double and triple bonds rendered from drawing code.",
          "shot": {
            "image": "evidence/chemfig/f-bonds-core.webp",
            "caption": "Single, double and triple carbon bonds."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=12",
          "note": "Wedge, hash and TikZ-decorated wavy bonds rendered.",
          "shot": {
            "image": "evidence/chemfig/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge and wavy bonds."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=26",
          "note": "Explicit upper, lower and centered double-bond strokes rendered."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=16",
          "note": "Three-, five-, six-membered and aromatic circle rings rendered.",
          "shot": {
            "image": "evidence/chemfig/f-rings.webp",
            "caption": "Three-, five-, six-membered and aromatic rings."
          }
        },
        "conformers": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=38",
          "note": "Chair/Haworth examples require explicit bond angles."
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Undefined built-in Ph alias produced an empty page."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=27",
          "note": "Saved ester submolecule code expanded twice in different structures."
        },
        "abbreviations": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=27",
          "note": "Custom submolecule expansion worked; built-in Ph was absent."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=31",
          "note": "Carbon isotope and positive nitrogen charge rendered.",
          "shot": {
            "image": "evidence/chemfig/f-atom-labels.webp",
            "caption": "Carbon isotope and positively charged nitrogen labels."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=33",
          "note": "Oxygen radical dot and lone pair rendered.",
          "shot": {
            "image": "evidence/chemfig/f-radicals.webp",
            "caption": "Oxygen with a radical dot and lone pair."
          }
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=44",
          "note": "Rotation, flipping and scaling are specified through TeX code."
        },
        "perspective": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=38",
          "note": "Perspective constructed manually with bond angles and lengths."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=47",
          "note": "Forward and equilibrium reaction arrows rendered.",
          "shot": {
            "image": "evidence/chemfig/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium reaction arrows."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=20",
          "note": "Curved full-head arrow rendered through chemmove and TikZ.",
          "shot": {
            "image": "evidence/chemfig/f-mechanism-arrows.webp",
            "caption": "Curved arrow above a carbon–oxygen double bond."
          }
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=45",
          "note": "TeX captions and positioned TikZ text."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=34",
          "note": "TikZ shapes and curves; expandable chemfig brackets."
        },
        "align": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=29",
          "note": "Code-based alignment and spacing, without selecting canvas objects."
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=52",
          "note": "Subschemes are positioned as single entities."
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=25",
          "note": "Reusable TeX settings for bonds and atom fonts."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=41",
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Six-bond carbon rendered without a chemical validation warning."
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Direct caffeine input printed its name as a label."
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=72",
          "note": "Graphical R-group label only; query semantics were not tested.",
          "shot": {
            "image": "evidence/chemfig/f-markush.webp",
            "caption": "Structure with a graphical R-group label."
          }
        },
        "polymers": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=43",
          "note": "Node-anchored delimiters and indices; graphical repeat representation only."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Direct CDXML through TeX input failed; no native importer."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Direct MOL input failed; conversion required external mol2chemfig."
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Direct SMILES produced overlapping labels; external conversion required."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Native output-format request rejected SVG."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=6",
          "note": "Vector PDFs compiled with Tectonic using default drawing settings.",
          "shot": {
            "image": "evidence/chemfig/f-pdf-export.webp",
            "caption": "A rendered structure in a PDF viewer."
          }
        },
        "png-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Native request rejected PNG; pdftoppm rasterization was external."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=6",
          "note": "Rendered through a TeX compiler without an editor GUI."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://tug.ctan.org/macros/generic/chemfig/chemfig-en.pdf#page=56",
          "note": "Custom arrow definitions and atom-rendering macros."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://ctan.org/pkg/chemfig",
          "note": "TeX typesetting macros; no embeddable editor documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://tex.stackexchange.com/questions/123967/fill-the-background-of-functional-groups-in-chemfig",
          "note": "TikZ overlays add translucent backgrounds behind chosen atoms and bonds."
        }
      },
      "caveats": [
        "Requires TeX source editing and a compatible TeX/TikZ installation.",
        "Complex drawings require manually specified geometry.",
        "Some mechanism overlays require two compilation passes."
      ],
      "github": null,
      "hands": {
        "testedVersion": "1.82",
        "canvas": "evidence/chemfig/canvas.webp",
        "canvasLight": "evidence/chemfig/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": null,
          "paclitaxelMb": null,
          "baselineMb": null,
          "rssIdleMb": null,
          "rssPaclitaxelMb": null,
          "runs": 3,
          "processes": 0,
          "method": "Three scripted TeX runs; process trees empty at both 10-second settled checks.",
          "note": "Paclitaxel compiled successfully; CLI exits, so persistent idle and loaded memory are unavailable."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "No GUI; fixed white TeX output shown in Preview."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "tex",
        "artifact": "chemfig.zip",
        "ran": true,
        "failure": null,
        "downloadBytes": 1733375,
        "installedBytes": 2199552,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemfig/simple.png",
            "note": "SMILES converted by mol2chemfig; chemfig rendered default layout.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemfig/complex.png",
            "note": "SMILES converted by mol2chemfig; default layout retained, including overlapping core bonds.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "No interactive 3D view; cholesterol not loaded.",
            "structure": null
          }
        ],
        "observations": [
          "No GUI; window captures show an isolated Preview viewer.",
          "Chemfig does not read SMILES; mol2chemfig supplied drawing code and layout.",
          "Caffeine required MOL fallback after the original SMILES conversion failed.",
          "Paclitaxel phenyl rings became wavy through an external converter defect.",
          "No interactive 3D view; PNGs were converted externally from TeX PDFs.",
          "Redraw: current Kekule SMILES converted successfully for caffeine and paclitaxel; previous converter failures no longer occur.",
          "Redraw: mol2chemfig supplied layout without manual geometry or style changes; paclitaxel central bonds overlap.",
          "Redraw: both standalone PDFs were rasterized with pdftoppm at 300 dpi; PNGs contain only the drawings."
        ]
      },
      "perf": null,
      "downloadBytes": 1733375,
      "references": [
        "https://www.ctan.org/pkg/chemfig"
      ]
    },
    {
      "id": "p78",
      "slug": "molecule-builder",
      "name": "Molecule Builder (OvOHongYu)",
      "rank": 37,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit"
        ],
        "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/components/Canvas.tsx#L300-L342",
        "note": "Custom SVG editor with RDKit WebAssembly chemistry."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Molecule Builder SVG renderer",
        "language": "TypeScript",
        "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/render/bonds.tsx#L116-L217"
      },
      "enginesChecked": true,
      "languageNote": "CSS/HTML are presentation; JavaScript and Batchfile are setup or vendored code.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Standalone React app; no supported embedding interface found."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "RDKit WebAssembly loader and bindings"
        },
        {
          "language": "C++",
          "role": "RDKit chemistry compiled to WebAssembly"
        },
        {
          "language": "C",
          "role": "InChI compiled into RDKit WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": "Bundled RDKit WebAssembly is BSD-3-Clause; React, React DOM and Zustand are MIT.",
        "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/package-lock.json",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A standalone 2D molecule editor with cleanup and vector figure export, despite its limited chemistry scope.",
      "summary": "A browser-based workbench for drawing small organic molecules and assembling reaction schemes.",
      "website": "https://github.com/OvOHongYu/molecule-builder",
      "repo": "https://github.com/OvOHongYu/molecule-builder",
      "docs": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md",
      "vendor": "OvOHongYu",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT license; free to use, modify and redistribute.",
        "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/LICENSE"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.1.0",
        "date": "2026-09-13",
        "source": "https://github.com/OvOHongYu/molecule-builder/releases/tag/v0.1.0"
      },
      "engine": {
        "rendering": "Custom SVG rendering; serialized SVG, browser-print PDF, and HTML canvas rasterization for PNG.",
        "chemistry": "RDKit.js (WebAssembly), with in-house graph editing, valence, layout and naming rules.",
        "ui": "React 18 with Zustand.",
        "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88.md#L34-L44"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L95-L102",
          "note": "Added and changed single, double and triple bonds.",
          "shot": {
            "image": "evidence/molecule-builder/f-bonds-core.webp",
            "caption": "Selected bond with single, double and triple bond controls."
          }
        },
        "stereo-bonds": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88.md#L27-L30",
          "note": "Stereochemistry editing is explicitly unsupported; stereo fields are reserved."
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/types/molecule.ts#L6-L44",
          "note": "Bond model supports only single, double, triple and aromatic bonds."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L95-L120",
          "note": "Phenyl group inserts a benzene ring; no ring-size tools visible.",
          "shot": {
            "image": "evidence/molecule-builder/f-rings.webp",
            "caption": "Ethylbenzene drawing with an aromatic ring."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L95-L102",
          "note": "Fixed functional groups and phenyl insert; no broader template library.",
          "shot": {
            "image": "evidence/molecule-builder/f-templates.webp",
            "caption": "Ethylbenzene drawing beside functional-group replacement controls."
          }
        },
        "custom-templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L213-L220",
          "note": "Library saves and reloads whole molecules, replacing the drawing.",
          "shot": {
            "image": "evidence/molecule-builder/f-custom-templates.webp",
            "caption": "Ethane drawing and save-to-molecule-library button."
          }
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L95-L102",
          "note": "Ph group expands into a chemically recognized phenyl ring.",
          "shot": {
            "image": "evidence/molecule-builder/f-abbreviations.webp",
            "caption": "Ethylbenzene drawing and Ph group replacement control."
          }
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/components/RightPanel.tsx#L119-L176",
          "note": "Fixed element buttons; no charge or isotope editing controls.",
          "shot": {
            "image": "evidence/molecule-builder/f-atom-labels.webp",
            "caption": "Selected atom and element replacement buttons."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Individual atom and bond selection; no lasso or transforms visible.",
          "shot": {
            "image": "evidence/molecule-builder/f-selection-tools.webp",
            "caption": "Selected bond with its properties and bond-order controls."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/components/SchemeCanvas.tsx#L195-L219",
          "note": "Source checkout; equilibrium/resonance become forward arrows in SVG/PNG exports."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow control found."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L322-L333",
          "note": "Source checkout; chemical graphs, RXN and reaction SMILES."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/components/ReactionView.tsx#L215-L229",
          "note": "Plain reaction captions only; no font controls; source checkout."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L156-L177",
          "note": null,
          "shot": {
            "image": "evidence/molecule-builder/f-cleanup.webp",
            "caption": "Automatic layout button beside an ethylbenzene drawing."
          },
          "engine": {
            "library": "In-house (TypeScript ring and chain layout, alignment and spacing)",
            "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/layout/arrange.ts#L609-L684"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L104-L112",
          "note": "Attempted overvalent carbon flagged and rejected.",
          "engine": {
            "library": "In-house (TypeScript valence tables and bond-order checks)",
            "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/engine/valence.ts#L89-L123"
          }
        },
        "stereo-perception": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88.md#L265-L268",
          "note": "R/S and E/Z support is listed as future work."
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/engine/descriptors.ts#L25-L53",
          "note": "Formula updates; molecular mass is not displayed.",
          "shot": {
            "image": "evidence/molecule-builder/f-formula-mass.webp",
            "caption": "Ethylbenzene drawing and molecular formula C8H10."
          },
          "engine": {
            "library": "In-house (TypeScript; molecular formula only, no mass calculation)",
            "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/engine/descriptors.ts#L13-L44"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Typing caffeine into the name field left ethane unchanged."
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L192-L209",
          "note": "Changing ethane to ethene updated the IUPAC name.",
          "shot": {
            "image": "evidence/molecule-builder/f-structure-to-name.webp",
            "caption": "Ethylbenzene drawing and IUPAC name."
          },
          "engine": {
            "library": "In-house (TypeScript IUPAC and Chinese naming rules); PubChem PUG REST and NCI CACTUS (remote server fallbacks)",
            "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/engine/naming.ts#L39-L61"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L13-L18",
          "note": "Polymerization hints only; no editable polymer repeat-unit representation."
        },
        "biomolecules": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L13-L18",
          "note": "Biomacromolecules are explicitly outside the supported scope."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view control found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML import or export control found."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L224-L235",
          "note": "MOL exports, but RDKit rejects coordinates; no import or SDF control.",
          "shot": {
            "image": "evidence/molecule-builder/f-mol-sdf.webp",
            "caption": "MOL export button beside an ethylbenzene drawing."
          },
          "engine": {
            "library": "In-house (TypeScript V2000 MOL writer; user export only, no SDF workflow)",
            "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/engine/serialize.ts#L34-L74"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L224-L235",
          "note": "SMILES exports; pasting fixture SMILES did not import.",
          "shot": {
            "image": "evidence/molecule-builder/f-smiles.webp",
            "caption": "Ethylbenzene drawing and its SMILES identifier."
          },
          "engine": {
            "library": "RDKit.js @rdkit/rdkit 2025.3.4-1.0.0 (browser WebAssembly canonical SMILES); In-house (TypeScript fallback writer; user export only)",
            "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/engine/naming.ts#L25-L37"
          }
        },
        "inchi": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/layout/rdkitLayout.ts#L32-L81",
          "note": "InChI and InChIKey displayed and updated; no import found.",
          "shot": {
            "image": "evidence/molecule-builder/f-inchi.webp",
            "caption": "Ethane drawing with InChI and InChIKey fields."
          },
          "engine": {
            "library": "RDKit.js @rdkit/rdkit 2025.3.4-1.0.0 (browser WebAssembly with bundled InChI; InChI/InChIKey generation only)",
            "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/layout/rdkitLayout.ts#L30-L64"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L322-L333",
          "note": "Source checkout; RXN V2000 export."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L224-L235",
          "note": "Downloaded SVG of a manually built ethylbenzene.",
          "shot": {
            "image": "evidence/molecule-builder/f-svg-export.webp",
            "caption": "SVG export button beside an ethylbenzene drawing."
          }
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C.md#L322-L333",
          "note": "Source checkout; browser Print to PDF preserves vectors."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/lib/exportFile.ts#L63-L87",
          "note": "PNG exports at 447×471; no DPI metadata or resolution control.",
          "shot": {
            "image": "evidence/molecule-builder/f-png-export.webp",
            "caption": "PNG export button beside an ethylbenzene drawing."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/OvOHongYu/molecule-builder/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E5%8D%8F%E8%AE%AE%E8%A7%84%E8%8C%83.md",
          "note": "Documented TypeScript layout function."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/OvOHongYu/molecule-builder/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E5%8F%8D%E5%BA%94%E6%A8%A1%E5%9D%97%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88.md",
          "note": "User-supplied HTTP prediction backends only."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/docs/%E5%8D%8F%E8%AE%AE%E8%A7%84%E8%8C%83.md",
          "note": "Standalone React app; no supported embedding interface found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/OvOHongYu/molecule-builder/blob/4e260930e92e80f115aa174b184ee76889e5ed02/src/render/hitareas.tsx#L27-L72",
          "note": "Fixed blue selection halos only; no persistent highlight styling."
        }
      },
      "caveats": [
        "Small organic molecules only; stereochemistry editing, biomacromolecules and organometallic complexes are unsupported.",
        "ZIP requires HTTP hosting; v0.1.0 omits source-only reactions/PDF described by the newer manual.",
        "Source predictions ignore entered temperature; SVG/PNG lose reaction arrow types; fallback InChI is unavailable despite manual claims."
      ],
      "github": {
        "url": "https://github.com/OvOHongYu/molecule-builder",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-09-13",
        "commits": 4,
        "contributors": 1,
        "pushedAt": "2026-09-18T13:10:21Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.1.0",
        "canvas": "evidence/molecule-builder/canvas.webp",
        "canvasLight": "evidence/molecule-builder/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 507.99,
          "paclitaxelMb": null,
          "baselineMb": 417.56,
          "rssIdleMb": 1088.44,
          "rssPaclitaxelMb": null,
          "runs": 3,
          "processes": 7,
          "method": "Three-run median; dedicated headed Chromium; summed process-tree phys_footprint; 10-second waits; MiB.",
          "note": "Idle is default ethane; no empty-document control; paclitaxel SMILES paste and MOL drop failed."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Paclitaxel import unsupported; default ethane shown. Fixed light appearance."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "zip",
        "artifact": "molecule-builder-0.1.0-dist.zip",
        "ran": true,
        "failure": null,
        "downloadBytes": 2168382,
        "installedBytes": 7299072,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "SMILES paste and MOL drop did nothing; no import control found.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "SMILES paste and MOL drop did nothing; no import control found.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No 3D view found; cholesterol test skipped.",
            "structure": null
          }
        ],
        "observations": [
          "Version comes from the release archive; the app shows no version.",
          "The editor starts and resets to ethane; no blank-document control found.",
          "Default ethylbenzene export showed an expanded aromatic ring.",
          "MOL export failed RDKit parsing: cannot process coordinates on line 5.",
          "Editor status says hover edits, but clicking opened editing controls."
        ]
      },
      "perf": null,
      "downloadBytes": 2168382,
      "references": [
        "https://github.com/OvOHongYu/molecule-builder",
        "https://github.com/OvOHongYu/molecule-builder/blob/main/README.md"
      ]
    },
    {
      "id": "p53",
      "slug": "ketchdraw",
      "name": "KetchDraw",
      "rank": 38,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "RDKit",
          "Indigo"
        ],
        "source": "https://github.com/GSmithOfficial/Ketchdraw/blob/9efda4862c52c0d38765f8dc287edd8647be5d0d/index.html#L612",
        "note": "Embedded Ketcher supplies drawing; RDKit calculates properties and Indigo handles chemistry."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher; Indigo exports; RDKit previews",
        "language": "TypeScript",
        "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/render/restruct/reatom.ts#L282"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript embedded in HTML; presentation markup and bundled Ketcher excluded.",
      "video": null,
      "embedding": {
        "methods": [
          "iframe"
        ],
        "package": null,
        "limit": "Bundled Ketcher only (Apache-2.0); full wrapper embedding undocumented.",
        "how": "Self-host bundled ketcher/index.html iframe; use same-origin contentWindow.ketcher API."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Wrapper and molecule analysis interface"
        },
        {
          "language": "C++",
          "role": "Indigo exports and RDKit previews"
        }
      ],
      "thirdParty": {
        "summary": "Ketcher/Indigo Apache-2.0; RDKit BSD-3-Clause; Chart.js/React MIT. Indigo rendering bundles Cairo (LGPL-2.1 OR MPL-1.1) and Noto Sans fonts (OFL-1.1).",
        "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/NOTICE",
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "Its main interface combines an embedded Ketcher structure-input editor with RDKit property cards.",
      "summary": "Browser-based molecular drawing editor combining Ketcher structure editing with RDKit property calculations.",
      "website": "https://gsmithofficial.github.io/Ketchdraw/",
      "repo": "https://github.com/GSmithOfficial/Ketchdraw",
      "docs": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md",
      "vendor": "GSmithOfficial",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT stated in README without a separate license file; bundled Ketcher uses Apache-2.0.",
        "source": "https://github.com/GSmithOfficial/Ketchdraw/blob/9efda4862c52c0d38765f8dc287edd8647be5d0d/README.md#license"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/GSmithOfficial/Ketchdraw/blob/9efda4862c52c0d38765f8dc287edd8647be5d0d/README.md"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/GSmithOfficial/Ketchdraw/releases"
      },
      "engine": {
        "rendering": "SVG in the Ketcher editor and RDKit.js previews; Indigo renders SVG/PNG exports",
        "chemistry": "RDKit.js and Indigo through Ketcher standalone WebAssembly",
        "ui": "HTML/CSS/JavaScript wrapper around a React-based Ketcher iframe",
        "source": "https://github.com/GSmithOfficial/Ketchdraw/blob/9efda4862c52c0d38765f8dc287edd8647be5d0d/index.html"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-bonds",
          "note": "Drew single, double and triple bonds.",
          "shot": {
            "image": "evidence/ketchdraw/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts",
          "note": "Drew wedge, hash and wavy bonds.",
          "shot": {
            "image": "evidence/ketchdraw/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts",
          "note": "Dative and hydrogen bonds."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#templates-toolbar",
          "note": "Placed benzene; multiple ring sizes available.",
          "shot": {
            "image": "evidence/ketchdraw/f-rings.webp",
            "caption": "A benzene ring alongside bond examples on the canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/templates/library.sdf#L8254",
          "note": "Built-in chair and boat templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-bonds",
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#templates-toolbar",
          "note": null,
          "shot": {
            "image": "evidence/ketchdraw/f-templates.webp",
            "caption": "Structure library lists sugars, bicycles, amino acids, and other templates."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#templates-toolbar",
          "note": null,
          "shot": {
            "image": "evidence/ketchdraw/f-custom-templates.webp",
            "caption": "Save Structure dialog with a disabled Save to Templates button."
          }
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#functional-groups",
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/modal/components/toolbox/Atom/Atom.tsx",
          "note": null,
          "shot": {
            "image": "evidence/ketchdraw/f-atom-labels.webp",
            "caption": "Caffeine drawing with nitrogen and oxygen labels and element controls."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/data/schema/struct-schema.js#L80",
          "note": "Monoradical and singlet/triplet diradical atom settings."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/state/handleHotkeysOverItem.ts",
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/editor/tool/select.ts#L202",
          "note": "Lasso, rotate, flip; resizing covers images, shapes and arrows.",
          "shot": {
            "image": "evidence/ketchdraw/f-selection-tools.webp",
            "caption": "Selection palette with rectangle, lasso, and fragment icons."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/leftToolbarOptions.ts",
          "note": "Placed forward and equilibrium arrows on separate canvases.",
          "shot": {
            "image": "evidence/ketchdraw/f-reaction-arrows.webp",
            "caption": "Reaction arrow palette with forward and equilibrium arrow styles."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/editor/operations/rxn/RxnArrowResize.ts#L65",
          "note": "Placed curved half-headed arrow.",
          "shot": {
            "image": "evidence/ketchdraw/f-mechanism-arrows.webp",
            "caption": "Curved half-headed arrow on the drawing canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/README.md#ketcher-api",
          "note": "RXN reaction serialization."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-reactions",
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#creating-text-objects-on-the-canvas",
          "note": "Font size, bold, italic, subscript and superscript."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-graphical-objects",
          "note": "Ellipse, rectangle and line tools; S-groups provide brackets.",
          "shot": {
            "image": "evidence/ketchdraw/f-shapes.webp",
            "caption": "Shape palette with ellipse, rectangle, and line icons."
          }
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#functional-groups",
          "note": "Chemical groups move together; mixed text/shape grouping unverified."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#ketcher-overview",
          "note": null,
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L208"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/state/options/index.js",
          "note": "Font and bond settings persist in browser storage."
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#adding-images-on-the-canvas",
          "note": "PNG and SVG images."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-atoms",
          "note": "Invalid atom valences are underlined in red.",
          "engine": {
            "library": "Ketcher (TypeScript); Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/state/server/index.js#L61"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#ketcher-overview",
          "note": "Calculate CIP assigns R/S and E/Z.",
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-standalone/src/infrastructure/services/struct/indigoWorker.ts#L158"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/modal/components/process/Analyse/Analyse.jsx",
          "note": "Caffeine: C8H10N4O2, molecular weight 194.191.",
          "shot": {
            "image": "evidence/ketchdraw/f-formula-mass.webp",
            "caption": "Calculated formula, molecular weight, and exact mass."
          },
          "engine": {
            "library": "Indigo (WebAssembly); RDKit.js (WebAssembly mass descriptors)",
            "source": "https://github.com/GSmithOfficial/Ketchdraw/blob/9efda4862c52c0d38765f8dc287edd8647be5d0d/index.html#L891-L916"
          }
        },
        "properties": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/GSmithOfficial/Ketchdraw/blob/9efda4862c52c0d38765f8dc287edd8647be5d0d/index.html",
          "note": "Wrapper property panel stayed empty after importing molecules."
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Entering caffeine in structure import produced conversion error."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in inspected controls."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#drawing-r-groups",
          "note": null
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#marking-s-groups",
          "note": "SRU repeat units with head-to-tail or head-to-head connectivity."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-standalone/src/infrastructure/services/struct/standaloneStructService.ts",
          "note": "Recognition explicitly rejects requests in standalone mode."
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#3d-viewer",
          "note": "Imported 3D SDF rotates in Miew viewer.",
          "shot": {
            "image": "evidence/ketchdraw/f-model-3d.webp",
            "caption": "Miew viewer displaying a molecular model with coordinate axes."
          },
          "engine": {
            "library": "Miew (JavaScript)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/modal/components/process/Miew/Miew.tsx#L125"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/identifyStructFormat.ts",
          "note": "Exported and reopened caffeine CDXML.",
          "shot": {
            "image": "evidence/ketchdraw/f-cdxml.webp",
            "caption": "Open Structure dialog containing CDXML text."
          },
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L108"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/utils/fileOpener.js",
          "note": "Binary CDX import; binary and Base64 CDX export.",
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L109"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/views/modal/components/document/Save/Save.jsx",
          "note": "Imported MOL and SDF; exported MOL.",
          "shot": {
            "image": "evidence/ketchdraw/f-mol-sdf.webp",
            "caption": "Save Structure dialog with MDL Molfile V2000 selected."
          },
          "engine": {
            "library": "Ketcher (TypeScript); Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L84"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/README.md#key-features",
          "note": "Imported and exported SMILES.",
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L104"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/README.md#ketcher-api",
          "note": null,
          "engine": {
            "library": "Indigo (WebAssembly)",
            "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-core/src/application/formatters/formatterFactory.ts#L101"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/README.md#ketcher-api",
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/documentation/help.md#working-with-files",
          "note": "SVG downloads saved successfully."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF option in save format list."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/epam/ketcher/issues/5152",
          "note": "PNG exported at 553 by 392 pixels; no resolution control."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/utils/fileOpener.js",
          "note": "Imports embedded ChemDraw objects from PowerPoint; editable Office insertion unverified."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/README.md#ketcher-api",
          "note": "Underlying Ketcher JavaScript API is accessible through the iframe."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/GSmithOfficial/Ketchdraw/blob/9efda4862c52c0d38765f8dc287edd8647be5d0d/ketcher/iframe.html",
          "note": "Bundled Ketcher only (Apache-2.0); full wrapper embedding undocumented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/2d60cb9c3ad9f604a3d9392346632980f8c083a9/packages/ketcher-react/src/script/ui/utils/fileOpener.js#L72-L90",
          "note": "Office support only imports ChemDraw objects from PowerPoint."
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/GSmithOfficial/Ketchdraw/blob/9efda4862c52c0d38765f8dc287edd8647be5d0d/ketcher/static/js/main.67cb654b.js",
          "note": "API highlights display colored halos; exports omit them."
        }
      },
      "caveats": [
        "README calls it KetchDraw; the hosted interface calls it BoltzDraw.",
        "RDKit and Chart.js load from public CDNs; pKa calculations use a remote API.",
        "Property cards use exact mass for MW and hardcode unspecified stereocenters to zero."
      ],
      "github": {
        "url": "https://github.com/GSmithOfficial/Ketchdraw",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2025-12-24",
        "commits": 18,
        "contributors": 2,
        "pushedAt": "2026-03-28T21:22:43Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "2.24.0",
        "canvas": "evidence/ketchdraw/canvas.webp",
        "canvasLight": "evidence/ketchdraw/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 661.95,
          "paclitaxelMb": 734.12,
          "baselineMb": 423.26,
          "rssIdleMb": 1376.25,
          "rssPaclitaxelMb": 1463.33,
          "runs": 3,
          "processes": 7,
          "method": "Fresh Playwright Chromium; summed process-tree physical footprints; medians in MiB.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://gsmithofficial.github.io/Ketchdraw/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/ketchdraw/simple.svg",
            "note": "Caffeine imported from the current SMILES and was laid out automatically.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/ketchdraw/complex.svg",
            "note": "Paclitaxel imported; central labels and bonds are crowded.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/ketchdraw/threed.png",
            "note": "SDF model rotates in depth; SMILES-derived model was flat.",
            "structure": "match"
          }
        ],
        "observations": [
          "The hosted page identifies itself as BoltzDraw; About identifies Ketcher 2.24.0.",
          "Imported SMILES produced centered drawings with colored heteroatom labels.",
          "Paclitaxel's central labels and bonds overlap in the automatic layout.",
          "The wrapper property panel continued to show zero molecules after imports.",
          "The SMILES-derived 3D view looked flat; the supplied SDF showed depth."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 447,
        "transferBytes": 8864852
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/GSmithOfficial/Ketchdraw",
        "https://github.com/GSmithOfficial/Ketchdraw/blob/9efda4862c52c0d38765f8dc287edd8647be5d0d/README.md"
      ]
    },
    {
      "id": "p69",
      "slug": "chemvas",
      "name": "Chemvas",
      "rank": 39,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/ui/canvas/canvas_view_setup.py#L23-L46",
        "note": "Custom Qt canvas and molecular model; RDKit backend removed before v0.28.0."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Chemvas Qt bond/label renderer",
        "language": "Python",
        "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/ui/molecule/bond_renderer.py#L33"
      },
      "enginesChecked": true,
      "languageNote": "Shell, PowerShell, Inno Setup and Makefile support packaging and checks.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": "chemvas",
        "limit": null,
        "how": "Desktop package; browser adapter retired, editor embedding undocumented."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Includes GPL-3.0 (PyQt6) and LGPL-3.0 (Qt).",
        "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/pyproject.toml",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Its implemented desktop canvas, scheme layout, annotations and vector exports support publication-grade 2D chemical drawing documents.",
      "summary": "Desktop editor for drawing molecular structures and reaction schemes and exporting publication figures.",
      "website": "https://github.com/dhsohn/Chemvas",
      "repo": "https://github.com/dhsohn/Chemvas",
      "docs": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md",
      "vendor": "daehyupsohn",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT License",
        "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/LICENSE"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.28.0",
        "date": "2026-11-04",
        "source": "https://github.com/dhsohn/Chemvas/releases/tag/v0.28.0"
      },
      "engine": {
        "rendering": "Qt QPainter and QGraphicsScene; QSvgGenerator and QPdfWriter for vector export",
        "chemistry": "In-house atom/bond model; no external chemistry backend",
        "ui": "PyQt6 (Qt Widgets)",
        "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/docs/ARCHITECTURE.md"
      },
      "languages": [
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#drawing-features",
          "note": "Drew single, double and triple bonds manually.",
          "shot": {
            "image": "evidence/chemvas/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/ui/window/main_window_config.py#L365",
          "note": "Drew wedge and hash bonds; no wavy bond control found.",
          "shot": {
            "image": "evidence/chemvas/f-stereo-bonds.webp",
            "caption": "Solid wedge and hashed bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#keyboard-shortcuts",
          "note": "Left, center and right bond-position shortcuts."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#drawing-features",
          "note": "Placed benzene with the ring tool.",
          "shot": {
            "image": "evidence/chemvas/f-rings.webp",
            "caption": "A benzene ring on the canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/AGENT_CLI.md#native-ring-templates",
          "note": "Placed cyclohexane chair template.",
          "shot": {
            "image": "evidence/chemvas/f-conformers.webp",
            "caption": "A cyclohexane chair on the canvas."
          }
        },
        "chains": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#keyboard-shortcuts",
          "note": "Keyboard chain sprouting; continuous zigzag dragging is not documented."
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Placed ring and chair templates; no broader library found."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/CDXML_EXPORT.md#atom-labels",
          "note": "Me, Ph and tBu carry CDXML graphs; other aliases stay labels."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/domain/document/model.py#L5",
          "note": "Charges and arbitrary labels; molecular model lacks isotope fields.",
          "shot": {
            "image": "evidence/chemvas/f-atom-labels.webp",
            "caption": "Nitrogen and oxygen labels in a caffeine structure."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/ui/window/main_window_config.py#L310",
          "note": "Dedicated Radical mark tool."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#keyboard-shortcuts",
          "note": "Hover shortcuts change atom labels and bond types."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/ui/selection/select_tool.py#L42",
          "note": "Marquee selection and transform handles; no freehand selection mode.",
          "shot": {
            "image": "evidence/chemvas/f-selection-tools.webp",
            "caption": "Selection toolbar and a selected curved arrow."
          }
        },
        "perspective": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/ui/tools/perspective_tool.py#L56",
          "note": "Drag-based perspective rotation with optional axis locking."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#drawing-features",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/chemvas/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/ui/tools/handle_mutation_service.py#L56",
          "note": "Drew curved arrows and selected their editing handles.",
          "shot": {
            "image": "evidence/chemvas/f-mechanism-arrows.webp",
            "caption": "Curved arrows on the canvas, with one selected."
          }
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/AGENT_CLI.md#stored-calculation-plans",
          "note": "Reaction mapping was removed; no mapping panel remains."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#drawing-features",
          "note": "s, p, hybrid, d and molecular-orbital shapes."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#drawing-features",
          "note": "Font family, size, weight, subscript and superscript."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/ui/window/main_window_config.py#L252",
          "note": "Shape and bracket drawing tools."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#drawing-features",
          "note": "Six alignment directions and horizontal/vertical distribution.",
          "shot": {
            "image": "evidence/chemvas/f-align.webp",
            "caption": "Alignment and distribution controls in the selection toolbar."
          }
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#drawing-features",
          "note": "Group and ungroup commands."
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/features/rendering/acs1996_style.py#L6",
          "note": "Default drawing style approximates ACS 1996."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#running",
          "note": "Saved document styling is reused by New Canvas."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#drawing-features",
          "note": "Atoms, bonds, notes and charge marks color independently."
        },
        "pages": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#canvas-size",
          "note": "Standard/custom paper sizes; multipage CDXML unsupported."
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/IMAGE_OBJECTS.md#gui-operations",
          "note": "Embed PNG/JPEG images; adjust size, opacity and layering."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#drawing-features",
          "note": "Flags questionable valences for H, B, C, N, O and F.",
          "engine": {
            "library": "In-house (Python conservative valence warnings)",
            "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/features/rendering/valence.py#L65"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass command in inspected menus or tools."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name conversion command in inspected menus or tools."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure naming command in inspected menus or tools."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/CDXML_EXPORT.md#atom-labels",
          "note": "Explicit generic-aryl bindings export native CDXML queries."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/adr/0055-retire-rdkit-chemistry-provider.md#decision",
          "note": "No model view command; cholesterol SDF opening rejected."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/DOCUMENT_COMPATIBILITY.md",
          "note": "Saved caffeine CDXML, closed it, then successfully reloaded it.",
          "engine": {
            "library": "In-house (Python CDXML import and native writer using standard-library ElementTree; single-page subset)",
            "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/features/cdxml_document.py#L64"
          }
        },
        "cdx": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/DOCUMENT_COMPATIBILITY.md",
          "note": "Binary CDX is explicitly unsupported."
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#chemistry-io",
          "note": "MOL import/export worked; SDF opening rejected by extension warning.",
          "shot": {
            "image": "evidence/chemvas/f-mol-sdf.webp",
            "caption": "A caffeine structure displayed in the simple.mol document."
          },
          "engine": {
            "library": "In-house (Python MOL V2000 reader and writer; no SDF)",
            "source": "https://github.com/dhsohn/Chemvas/blob/705548f397f1cc14253fed496e95821576f751f4/app/chemvas/core/molfile.py#L116"
          }
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/adr/0055-retire-rdkit-chemistry-provider.md#decision",
          "note": "Paste timed out; canvas stayed empty; no SMILES import command."
        },
        "inchi": {
          "status": "no",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/dhsohn/Chemvas/4a2db522392e205427e626d0581ab1b162c88b24/CHANGELOG.md",
          "note": "Former Molecule Info identifier generation was removed."
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#figure-export",
          "note": "Saved both fixtures with default transparent Plain SVG settings."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/REFERENCE.md#figure-export",
          "note": "Exported paclitaxel as vector PDF."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/AGENT_CLI.md#headless-document-rendering",
          "note": "Exported paclitaxel PNG at default 300 DPI."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/CDXML_EXPORT.md#atom-labels",
          "note": "Documented Python CDXML serialization and typed label-binding functions."
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/AGENT_CLI.md",
          "note": "Headless document composition, inspection, patching, layout and rendering."
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/docs/AGENT_CLI.md",
          "note": "Documented agent CLI accepts structured JSON composition and patch requests."
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/dhsohn/Chemvas/blob/main/docs/adr/0068-retire-browser-adapter.md",
          "note": "Desktop package; browser adapter retired, editor embedding undocumented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/dhsohn/Chemvas/blob/v0.28.0/app/chemvas/ui/tools/hover_rendering.py#L35-L75",
          "note": "Colored hover halos are transient and excluded from figure exports."
        }
      },
      "caveats": [
        "Alpha software distributed through PyPI; standalone installer acceptance remains pending.",
        "CDXML is limited to single pages; external edits can reduce some objects to images.",
        "Some guides retain obsolete CDXML export-menu entries and describe MOL as import-only."
      ],
      "github": {
        "url": "https://github.com/dhsohn/Chemvas",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-01-03",
        "commits": 683,
        "contributors": 3,
        "pushedAt": "2026-11-05T11:35:31Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.28.0",
        "canvas": "evidence/chemvas/canvas.webp",
        "canvasLight": "evidence/chemvas/canvas-light.webp",
        "canvasDark": "evidence/chemvas/canvas-dark.webp",
        "memory": {
          "idleMb": 114.54,
          "paclitaxelMb": 130.45,
          "baselineMb": null,
          "rssIdleMb": 212.65,
          "rssPaclitaxelMb": 230.23,
          "runs": 3,
          "processes": 1,
          "method": "Three fresh launches; ps trees; footprint phys_footprint; MOL import; 10-second waits; medians in decimal MB.",
          "note": "Qt automation wrapper included; startup warning dismissed before waiting; no child processes."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "follows system",
          "note": "Dark native title bar; canvas and toolbar backgrounds remain light."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "pypi",
        "artifact": "https://files.pythonhosted.org/packages/d4/fa/6bc2e4b4a61298ab822fd3c0e5a065506a48013176a0ee1c46581a549569/chemvas-0.28.0-py3-none-any.whl",
        "ran": true,
        "failure": null,
        "downloadBytes": 950091,
        "installedBytes": 268062720,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/chemvas/simple.svg",
            "note": "SMILES paste inserted nothing; imported MOL without cleanup.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/chemvas/complex.svg",
            "note": "Preserved imported coordinates; nearby oxygen labels remain close.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "No 3D view; SDF opening rejected by extension warning.",
            "structure": null
          }
        ],
        "observations": [
          "Black bonds and atom labels on a white canvas.",
          "Default SVG export has a transparent background and outlined labels.",
          "MOL import preserves the supplied two-dimensional layout.",
          "Paclitaxel has closely spaced oxygen labels.",
          "Exported MOL atom, bond and stereo records match both fixtures."
        ]
      },
      "perf": null,
      "downloadBytes": 950091,
      "references": [
        "https://github.com/dhsohn/Chemvas",
        "https://pypi.org/project/chemvas/"
      ]
    },
    {
      "id": "p47",
      "slug": "schrodinger-sketcher",
      "name": "Schrödinger Sketcher",
      "rank": 40,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit",
          "InChI"
        ],
        "source": "https://github.com/schrodinger/sketcher/blob/ff14609b2b365269e05a9a05131d09368b7511f8/CMakeLists.txt#L276-L309",
        "note": "Original Qt editor with RDKit; InChI import/export runs through RDKit."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Sketcher Qt graphics-item renderer",
        "language": "C++",
        "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/molviewer/bond_item.cpp#L810-L858"
      },
      "enginesChecked": true,
      "languageNote": "Other languages support bindings, tests, builds and browser packaging.",
      "video": {
        "provider": "file",
        "url": "https://www.schrodinger.com/sites/default/files/s3/public/2D-Sketcher/2023-2/Content/Resources/Videos/2D_Sketcher.mp4",
        "embed": null,
        "title": "Training and Video Walkthrough",
        "author": null,
        "linkedFrom": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/README.md",
        "poster": null
      },
      "embedding": {
        "methods": [
          "npm package",
          "iframe",
          "desktop widget"
        ],
        "package": "@schrodinger/sketcher",
        "limit": "BSD-3-Clause; npm package targets authenticated GitHub Packages.",
        "how": "React iframe wrapper requires self-hosted WASM assets; native Qt SketcherWidget available."
      },
      "otherLanguages": [
        {
          "language": "TypeScript",
          "role": "Browser React wrapper and API"
        },
        {
          "language": "JavaScript",
          "role": "Qt WebAssembly browser loader and glue"
        },
        {
          "language": "C",
          "role": "InChI identifier library"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-3.0-only (Qt), MPL-2.0 (Eigen), and OFL-1.1 (bundled Arimo fonts).",
        "source": "https://github.com/schrodinger/sketcher/blob/4cf7582e947d7de8522fdf80575247c05d6103ce/external/versions.json",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "Its Qt widget and React wrapper provide chemical structure input for larger applications.",
      "summary": "An open-source editor for drawing molecules, reactions, and biomolecular sequences in desktop and web applications.",
      "website": "https://www.schrodinger.com/platform/products/schrodinger-sketcher/",
      "repo": "https://github.com/schrodinger/sketcher",
      "docs": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/README.md",
      "vendor": "Schrödinger, Inc.",
      "license": {
        "kind": "open-source",
        "spdx": "BSD-3-Clause",
        "text": "Permissive BSD 3-Clause license.",
        "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/README.md#access-and-training"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v2026-4",
        "date": "2026-10-30",
        "source": "https://github.com/schrodinger/sketcher/releases/tag/v2026-4"
      },
      "engine": {
        "rendering": "Qt QGraphicsScene and QPainter; QSvgGenerator for SVG and QImage for PNG",
        "chemistry": "RDKit",
        "ui": "Qt Widgets, compiled to WebAssembly for the browser",
        "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/image_generation.cpp"
      },
      "languages": [
        "C++"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/menu/bond_context_menu.cpp#L26",
          "note": "Drew single and double; changed double to triple.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-bonds-core.webp",
            "caption": "Bond menu lists single, double and triple bond orders."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/molviewer/bond_item.cpp#L188",
          "note": "Drew solid/hash wedges; set unknown stereo to zigzag.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-stereo-bonds.webp",
            "caption": "Wavy, solid wedge and hashed wedge bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/widget/bond_order_popup.cpp#L21",
          "note": "Dative and zero-order bonds.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-special-bonds.webp",
            "caption": "Bond type menu lists coordinate and zero-order bonds."
          }
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/widget/ring_tool_widget.cpp#L20",
          "note": "Placed cyclohexane and benzene with dedicated tools.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-rings.webp",
            "caption": "Cyclohexane and benzene rings alongside the ring toolbar."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/tool/draw_chain_scene_tool.cpp#L66",
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/widget/monomer_tool_widget.cpp#L160",
          "note": "Placed an alanine monomer from the amino-acid library.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-templates.webp",
            "caption": "A monomer on the canvas beside the amino acid library."
          }
        },
        "custom-templates": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/widget/sketcher_top_bar.cpp#L143",
          "note": "General custom-fragment saving is explicitly unimplemented."
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/dialog/edit_atom_properties.cpp#L435",
          "note": null,
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-atom-labels.webp",
            "caption": "Atom menu offers element and charge controls."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/menu/atom_context_menu.cpp#L61",
          "note": "Unpaired-electron controls; lone pairs unverified.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-radicals.webp",
            "caption": "Atom menu includes Add Unpaired Electron."
          }
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/sketcher_widget.cpp#L1501",
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/widget/selection_tool_popup.cpp#L35",
          "note": "Lasso, rotate and flip; structure resizing unverified.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-selection-tools.webp",
            "caption": "Modify menu offers horizontal and vertical flips."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/molviewer/non_molecular_item.cpp#L82",
          "note": "Placed forward arrow; other arrow styles unverified.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-reaction-arrows.webp",
            "caption": "A forward arrow on the drawing canvas."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved electron-arrow tool found in inspected toolbar or menus."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/model/mol_model.h#L188",
          "note": "RDKit reactions and reaction SMILES/RXN exchange."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/ui/reaction_popup.ui#L107",
          "note": "Manual mapping by dragging between matching reactant and product atoms."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/dialog/bracket_subgroup_dialog.cpp#L21",
          "note": "Chemical subgroup brackets; general shapes and curves unverified."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/model/mol_model.cpp#L1632",
          "note": null,
          "engine": {
            "library": "RDKit RDDepictor (C++; WebAssembly in browser build); In-house monomer layout",
            "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/rdkit_extensions/coord_utils.cpp#L33-L67"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/dialog/rendering_settings_dialog.cpp#L68",
          "note": "Element palettes; individual object coloring unverified.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-color.webp",
            "caption": "2D settings show heteroatom coloring and a color mode."
          }
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/molviewer/atom_item.cpp#L912",
          "note": null,
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-valence-check.webp",
            "caption": "View menu shows Valence Errors enabled."
          },
          "engine": {
            "library": "RDKit (C++; WebAssembly in browser build)",
            "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/molviewer/atom_item.cpp#L912-L915"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/rdkit/mol_update.cpp#L138",
          "note": "R/S labels appeared automatically on imported paclitaxel and cholesterol.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-stereo-perception.webp",
            "caption": "R and S labels appear on a stereochemical structure."
          },
          "engine": {
            "library": "RDKit CIPLabeler and MolOps (C++; WebAssembly in browser build)",
            "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/rdkit/mol_update.cpp#L92-L195"
          }
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula/mass command found in action menus or property dialog."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Importing caffeine as text returned Unable to determine format."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command in conversion menus; chemical formats only."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/dialog/edit_atom_properties.cpp#L456",
          "note": "R-groups, element lists and query constraints."
        },
        "polymers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/dialog/bracket_subgroup_dialog.cpp#L21",
          "note": "SRU polymers, copolymers and repeat patterns."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/dialog/file_import_export.cpp#L45",
          "note": "Placed alanine monomer; amino-acid and nucleic-acid libraries visible.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-biomolecules.webp",
            "caption": "A monomer on the canvas beside amino acid and nucleic tabs."
          }
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D viewer found; imported 3D SDF displayed on 2D canvas."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/test/schrodinger/rdkit_extensions/test_convert.cpp#L199",
          "note": "Imported methanol CDXML; no CDXML option in export formats.",
          "engine": {
            "library": "RDKit CDXMLToMols (C++; WebAssembly in browser build; import only)",
            "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/rdkit_extensions/convert.cpp#L650-L660"
          }
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/dialog/file_import_export.cpp#L20",
          "note": "Imported V2000 MOL and 3D SDF; exported V3000 MOL.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-mol-sdf.webp",
            "caption": "Format menu lists MDL SD V3000."
          },
          "engine": {
            "library": "RDKit SDMolSupplier and SDWriter (C++; WebAssembly in browser build)",
            "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/rdkit_extensions/convert.cpp"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/rdkit_extensions/convert.cpp#L563",
          "note": "Pasted fixture SMILES; exported imported methanol as CO.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-smiles.webp",
            "caption": "Format menu lists SMILES and Extended SMILES."
          },
          "engine": {
            "library": "RDKit (C++; WebAssembly in browser build)",
            "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/rdkit_extensions/convert.cpp"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/rdkit_extensions/convert.cpp#L611",
          "note": "InChI import and export; InChIKey export.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-inchi.webp",
            "caption": "Format menu lists InChI and InChIKey."
          },
          "engine": {
            "library": "InChI via RDKit RDInchiLib (native C/C++; WebAssembly in browser build)",
            "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/rdkit_extensions/convert.cpp"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/rdkit_extensions/convert.cpp#L903",
          "note": "RXN import and V3000 export."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/image_generation.cpp#L361",
          "note": "Saved svg-test.svg using SVG image format."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/include/schrodinger/sketcher/image_generation.h#L30",
          "note": "Only PNG/SVG formats; Command-P opened no print dialog."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/schrodinger/sketcher/dialog/file_save_image_dialog.cpp#L46",
          "note": "Default 400×400 PNG, approximately 72 dpi; higher resolution unverified.",
          "shot": {
            "image": "evidence/schrodinger-sketcher/f-png-export.webp",
            "caption": "Caffeine structure on a white background."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://learn.schrodinger.com/public/python_api/2026-4/api/schrodinger.ui.sketcher.html",
          "note": "Documented SIP wrapper sets and retrieves molecular structures."
        },
        "ts-api": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/wasm/package/src/Sketcher.tsx#L57",
          "note": "Typed React/WASM API for structure and image exchange."
        },
        "cli": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/src/utils/smiles_to_helm.cpp#L48",
          "note": "Bundled headless SMILES-to-HELM converter."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/schrodinger/sketcher/tree/main/wasm/package",
          "note": "React iframe wrapper requires self-hosted WASM assets; native Qt SketcherWidget available."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/include/schrodinger/sketcher/image_generation.h#L76-L85",
          "note": "Per-atom and per-bond colored halos through rendering APIs."
        }
      },
      "caveats": [
        "CDXML import is supported; CDXML export is unsupported.",
        "Native image export is limited to PNG and SVG.",
        "General custom-fragment saving is not implemented."
      ],
      "github": {
        "url": "https://github.com/schrodinger/sketcher",
        "stars": 43,
        "checkedOn": "2026-11-06",
        "firstCommit": "2009-09-22",
        "commits": 2340,
        "contributors": 64,
        "pushedAt": "2026-11-05T15:48:25Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "Release 2026-4 (build 131)",
        "canvas": "evidence/schrodinger-sketcher/canvas.webp",
        "canvasLight": "evidence/schrodinger-sketcher/canvas-light.webp",
        "canvasDark": "evidence/schrodinger-sketcher/canvas-dark.webp",
        "memory": {
          "idleMb": 63.342,
          "paclitaxelMb": 102.647,
          "baselineMb": null,
          "rssIdleMb": 166.38,
          "rssPaclitaxelMb": 214.368,
          "runs": 3,
          "processes": 1,
          "method": "Median of three fresh open -n launches; whole-tree phys_footprint; SMILES paste; 10-second settling.",
          "note": "Decimal MB; native Qt; no child or WebKit helpers observed."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "follows system",
          "note": "Native window frame changes; canvas and toolbars remain white."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "zip",
        "artifact": "sketcher-2026-4-macos-26-arm64.zip",
        "ran": true,
        "failure": null,
        "downloadBytes": 19120979,
        "installedBytes": 48451584,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/schrodinger-sketcher/simple.png",
            "note": "Current Kekule SMILES; automatic layout preserved; Fit to Screen used.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/schrodinger-sketcher/complex.png",
            "note": "Current Kekule SMILES; automatic layout preserved; Fit to Screen used.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": "match"
          }
        ],
        "observations": [
          "SMILES paste generated a 2D layout automatically.",
          "Default heteroatom colors and stereo annotations were enabled.",
          "Paclitaxel required Fit to Screen to show the whole drawing.",
          "Default PNG export was white, 400 × 400 pixels, approximately 72 dpi.",
          "The app uses one canvas; Clear Sketcher started each fresh fixture."
        ]
      },
      "perf": null,
      "downloadBytes": 19120979,
      "references": [
        "https://github.com/schrodinger/sketcher",
        "https://github.com/schrodinger/sketcher/blob/8586db9dc70a23740f737168b9d533ef4dfed06b/README.md"
      ]
    },
    {
      "id": "p20",
      "slug": "molsketch-desktop",
      "name": "Molsketch",
      "rank": 41,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "Open Babel"
        ],
        "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/molview.cpp#L58",
        "note": "Custom canvas; optional Open Babel handles chemical formats and 2D coordinate generation."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Molsketch libmolsketch (Qt QPainter)",
        "language": "C++",
        "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/bond.cpp#L502"
      },
      "enginesChecked": true,
      "languageNote": "Other languages provide license text, tests, build scripts and installer support.",
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=ac0EX96HZT0",
        "embed": "https://www.youtube-nocookie.com/embed/ac0EX96HZT0",
        "title": "Nitrogen 0 6 0",
        "author": "Molsketch",
        "linkedFrom": "https://sourceforge.net/projects/molsketch/",
        "poster": "https://i.ytimg.com/vi/ac0EX96HZT0/hqdefault.jpg"
      },
      "embedding": {
        "methods": [
          "desktop library"
        ],
        "package": "libmolsketch",
        "limit": "GPL-2.0-or-later; Qt/C++ integration undocumented.",
        "how": "Link libmolsketch and add MolView(MolScene*) to a Qt layout."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Optional native InChI library"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-3.0 (Qt and Oxygen icons), GPL-2.0 (optional Open Babel), and GPL runtimes with linking exceptions.",
        "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/molsketch/licensedialog.cpp",
        "notice": null,
        "libraries": [
          {
            "name": "Open Babel",
            "license": "GPL-2.0-only",
            "source": "https://github.com/openbabel/openbabel/blob/master/COPYING"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A standalone 2D editor with reaction diagrams, captions, alignment, and vector output can produce publication figures.",
      "summary": "Desktop editor for drawing two-dimensional molecular structures, reaction schemes, and mechanism diagrams.",
      "website": "https://sourceforge.net/projects/molsketch/",
      "repo": "https://github.com/hvennekate/Molsketch",
      "docs": "https://www.youtube.com/channel/UCIYnNzSnI9AHpB_c48BR7fQ",
      "vendor": "Hendrik Vennekate and contributors",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-2.0-or-later",
        "text": "GPLv2 or later in source; application metadata instead says GPL-2.0-only.",
        "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/molsketch/mainwindow.cpp#L385"
      },
      "price": {
        "text": "Free",
        "source": "https://sourceforge.net/projects/molsketch/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "0.8.4",
        "date": "2025-10-11",
        "source": "https://sourceforge.net/p/molsketch/news/2025/10/084-fluorine-16/"
      },
      "engine": {
        "rendering": "Qt QPainter on QGraphicsScene; QSvgGenerator for SVG and QPrinter for printing.",
        "chemistry": "In-house molecular model with an optional Open Babel adapter.",
        "ui": "Qt Widgets (Qt 5 or Qt 6)",
        "source": "https://github.com/hvennekate/Molsketch/tree/b8725eee1037b811be235ede66712c48fcc5c569"
      },
      "languages": [
        "C++"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/actions/bondtypewidget.cpp#L32",
          "note": "Single, double, and triple bonds drawn; features-test.png.",
          "shot": {
            "image": "evidence/molsketch-desktop/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds in an exported drawing."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/bond.cpp#L338",
          "note": "Wedge, hash, and wavy bonds drawn; features-test.png.",
          "shot": {
            "image": "evidence/molsketch-desktop/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds in an exported drawing."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/actions/bondtypewidget.cpp#L38",
          "note": "Dotted/dashed dative styles; no additional specialist bond category in controls."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/actions/bondtypewidget.cpp#L42",
          "note": "Symmetric, asymmetric, and inverted asymmetric double bonds."
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/actions/ringaction.cpp#L148",
          "note": "Triangle drawn; other ring sizes and aromatic options untested.",
          "shot": {
            "image": "evidence/molsketch-desktop/f-rings.webp",
            "caption": "A triangular ring alongside straight and curved arrows."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "tested",
          "source": "https://sourceforge.net/p/molsketch/news/2017/01/new-release-beryllium-040/",
          "note": "Library refresh remained empty; interface requests user-defined library folders."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/moleculepopup.cpp#L87",
          "note": "Save molecules as MSM files for reuse in folder-based libraries."
        },
        "abbreviations": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/actions/drawaction.cpp#L247",
          "note": "Labels supported; chemical abbreviation handling remains a TODO."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/atompopup.ui#L40",
          "note": "Charges and custom labels; no dedicated isotope field."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/atompopup.cpp#L152",
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/molscene.cpp#L626",
          "note": "Rectangular selection and rotation; full free-selection transforms are not provided."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/actions/arrowtypewidget.cpp#L29",
          "note": "Forward arrow drawn; alternate arrow styles not exercised.",
          "shot": {
            "image": "evidence/molsketch-desktop/f-reaction-arrows.webp",
            "caption": "A straight reaction arrow alongside a ring and curved arrow."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/actions/mechanismarrowaction.cpp#L25",
          "note": "Curved full-head arrow drawn and exported.",
          "shot": {
            "image": "evidence/molsketch-desktop/f-mechanism-arrows.webp",
            "caption": "A curved arrow alongside a ring and straight arrow."
          }
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sourceforge.net/p/molsketch/news/2017/03/new-release-beryllium-7-041/",
          "note": "Paste formatted text from another application."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/actions/frameaction.cpp#L97",
          "note": "Rectangular and rounded frames, square and curly brackets."
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/molsketch/actioncontainer.cpp#L227",
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/molsketch/optimizestructureaction.cpp#L37",
          "note": "Requires the Open Babel adapter and gen2D operation.",
          "engine": {
            "library": "Open Babel gen2D (native C++ through optional obabeliface shared library)",
            "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/obabeliface/obabeliface.cpp#L203"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/molsketch/settingsdialog.cpp#L100",
          "note": "Bond and font preferences persist for reuse."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/actions/coloraction.cpp#L51",
          "note": null
        },
        "pages": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Print preview offers page setup; multipage editing not verified."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/molecule.cpp#L384",
          "note": "Selection displayed C47H51NO14; no mass readout found."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/molsketch/wikiquerywidget.cpp#L90",
          "note": "Caffeine Wikidata query failed with network error 499."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Only editable Name field; no naming command found."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/molsketch/wikiquerywidget.cpp#L147",
          "note": "Caffeine Wikidata query failed with network error 499."
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D command in File, Edit, View, or Help."
        },
        "crystals": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/obabeliface/obabeliface.cpp#L156",
          "note": "Open Babel imports atoms/bonds; crystal unit-cell information is discarded."
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://openbabel.org/docs/FileFormats/ChemDraw_CDXML_format.html",
          "note": "Export re-imported; reaction and mechanism arrows absent from CDXML.",
          "engine": {
            "library": "Open Babel ChemDrawXMLFormat (native C++ through optional obabeliface shared library; chemical structures only)",
            "source": "https://github.com/openbabel/openbabel/blob/9be528bcdb31a219637ae3d1699170a8aaa5be6d/src/formats/xml/cdxmlformat.cpp#L54"
          }
        },
        "cdx": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "CDX import listed; no CDX save format listed."
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/obabeliface/obabeliface.cpp#L138",
          "note": "Caffeine MOL opened and saved; SDF listed in formats.",
          "engine": {
            "library": "Open Babel MDL MOL/SDF format plugin (native C++ through optional obabeliface shared library; one record)",
            "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/obabeliface/obabeliface.cpp#L241"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/molsketch/mainwindow.cpp#L172",
          "note": "Imported both fixtures; paclitaxel round-trip altered stereochemistry.",
          "engine": {
            "library": "Open Babel SMILES format plugin (native C++ through optional obabeliface shared library)",
            "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/obabeliface/obabeliface.cpp#L138"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/obabeliface/obabeliface.cpp#L319",
          "note": "Requires Open Babel's InChI support.",
          "engine": {
            "library": "Open Babel InChI format plugin (native C++ adapter to native InChI C library)",
            "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/obabeliface/obabeliface.cpp#L319"
          }
        },
        "rxn": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/obabeliface/obabeliface.cpp#L156",
          "note": "Open Babel 3 imports components; reaction roles and mapping are discarded."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/molscene.cpp#L350",
          "note": "Native SVG export wrote features-test.svg."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/libmolsketch/fileio.cpp#L105",
          "note": "Saved through Print Preview and macOS PDF save."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/hvennekate/Molsketch/blob/b8725eee1037b811be235ede66712c48fcc5c569/molsketch/settingsdialog.ui#L226",
          "note": "Default 10× scaling; 1850×1750 caffeine PNG; no DPI control.",
          "shot": {
            "image": "evidence/molsketch-desktop/f-png-export.webp",
            "caption": "Preferences show bitmap export scaling set to 10.0×."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/hvennekate/Molsketch/blob/main/libmolsketch/CMakeLists.txt",
          "note": "GPL-2.0-or-later; Qt/C++ integration undocumented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/hvennekate/Molsketch/blob/main/libmolsketch/bond.cpp#L574-L580",
          "note": "Blue selection outlines highlight atoms and bonds; exports clear selection."
        }
      },
      "caveats": [
        "macOS requires a source build; Apple Silicon build issues remain open.",
        "Chemistry file exchange, cleanup, and Wikidata lookup require Open Babel.",
        "App metadata advertises weight and bundled templates; current code and release notes differ."
      ],
      "github": {
        "url": "https://github.com/hvennekate/Molsketch",
        "stars": 20,
        "checkedOn": "2026-11-06",
        "firstCommit": "2009-07-07",
        "commits": 1217,
        "contributors": 9,
        "pushedAt": "2025-10-11T09:42:47Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.8.4",
        "canvas": "evidence/molsketch-desktop/canvas.webp",
        "canvasLight": "evidence/molsketch-desktop/canvas-light.webp",
        "canvasDark": "evidence/molsketch-desktop/canvas-dark.webp",
        "memory": {
          "idleMb": 272.56,
          "paclitaxelMb": 275.83,
          "baselineMb": null,
          "rssIdleMb": 374.23,
          "rssPaclitaxelMb": 380.42,
          "runs": 3,
          "processes": 1,
          "method": "Median three fresh-process pairs; footprint phys_footprint tree sums, MiB; SMILES; 10-second waits.",
          "note": "Idle and loaded measured in separate fresh launches; native dialog automation was unreliable."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "follows system",
          "note": "Dark canvas retains black bonds, reducing contrast."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://downloads.sourceforge.net/project/molsketch/Molsketch/Molsketch-0.8.4-src.tar.gz",
        "ran": true,
        "failure": null,
        "downloadBytes": 1855977,
        "installedBytes": 12021760,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molsketch-desktop/simple.png",
            "note": "Automatic SMILES layout; unchanged default styling.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molsketch-desktop/complex.png",
            "note": "Automatic layout; exported SMILES changed or omitted stereochemistry.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "No 3D model view found in menus; cholesterol test skipped.",
            "structure": null
          }
        ],
        "observations": [
          "SMILES imports generated 2D coordinates without manual cleanup.",
          "Default canvas showed black structures on a dark background.",
          "Default PNG export used white background and 10× pixel scaling.",
          "Caffeine round-trip matched; paclitaxel output changed and omitted stereochemical assignments.",
          "Template library was empty after refresh."
        ]
      },
      "perf": null,
      "downloadBytes": 1855977,
      "references": [
        "https://sourceforge.net/projects/molsketch/",
        "https://github.com/hvennekate/Molsketch"
      ]
    },
    {
      "id": "p79",
      "slug": "chemable",
      "name": "Chemable",
      "rank": 42,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit",
          "3Dmol.js",
          "nmr-simulation"
        ],
        "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/renderer.ts#L34-L40",
        "note": "Custom 2D canvas; RDKit chemistry, 3Dmol.js 3D views, nmr-simulation spectra."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Chemable Canvas 2D renderer",
        "language": "TypeScript",
        "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/draw.ts#L232-L324"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript generates element data; HTML/CSS provide interface presentation.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "PolyForm Noncommercial license.",
        "how": "Standalone Electron app; no embeddable editor library confirmed."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "Local RDKit geometry helper"
        },
        {
          "language": "C++",
          "role": "RDKit native chemistry core"
        },
        {
          "language": "JavaScript",
          "role": "3D viewer and spectral simulation"
        }
      ],
      "thirdParty": {
        "summary": "MIT components (Electron, jsPDF, svg2pdf.js) and BSD-3-Clause RDKit.",
        "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/THIRD-PARTY-NOTICES.md",
        "notice": "https://github.com/joreitz/chemable/blob/main/THIRD-PARTY-NOTICES.md",
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "3Dmol.js",
            "license": "BSD-3-Clause",
            "source": "https://github.com/3dmol/3Dmol.js/blob/master/LICENSE"
          },
          {
            "name": "nmr-simulation",
            "license": "MIT",
            "source": "https://github.com/cheminfo-js/nmr-simulation/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Implemented desktop drawing, captions, reaction graphics and PNG export support standalone chemical figures, with incomplete vector export and UI connections.",
      "summary": "A desktop application for drawing chemical structures, reaction graphics and annotated molecular figures.",
      "website": null,
      "repo": "https://github.com/joreitz/chemable",
      "docs": null,
      "vendor": "Joshua Reitz",
      "license": {
        "kind": "source-available",
        "spdx": "PolyForm-Noncommercial-1.0.0",
        "text": "Source available under the PolyForm Noncommercial License 1.0.0.",
        "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/LICENSE"
      },
      "price": {
        "text": "Free for permitted noncommercial use (2026-11-05)",
        "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/LICENSE"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v1.1.9",
        "date": "2026-08-18",
        "source": "https://github.com/joreitz/chemable/releases/tag/v1.1.9"
      },
      "engine": {
        "rendering": "Custom HTML Canvas 2D renderer and SVG exporter; 3Dmol.js for 3D views.",
        "chemistry": "RDKit (Python and WebAssembly), plus in-house graph, SMILES and valence logic.",
        "ui": "Electron with HTML/CSS and vanilla DOM controls.",
        "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/renderer.ts"
      },
      "languages": [
        "TypeScript",
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/core/mouse-interactions.ts#L499-L513",
          "note": "Drew single bond and cycled through double and triple.",
          "shot": {
            "image": "evidence/chemable/f-bonds-core.webp",
            "caption": "A triple bond on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/draw.ts#L278-L314",
          "note": "Drew solid and hashed wedges; no wavy tool found.",
          "shot": {
            "image": "evidence/chemable/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/templates.ts",
          "note": "Inserted benzene from Templates."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/templates.ts",
          "note": "Only benzene, cyclohexane and cyclopentane are bundled."
        },
        "custom-templates": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/core/mouse-interactions.ts",
          "note": "Template-saving code exists, but canvas context-menu activation is unwired."
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/types.ts#L1-L23",
          "note": "Charges and custom labels; no isotope property in atom model."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/core/hotkeys.ts#L56-L76",
          "note": "Radical dots can be toggled on hovered atoms."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/core/hotkeys.ts#L56-L76",
          "note": "Hover shortcuts change charges and radicals."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/core/mouse-interactions.ts",
          "note": "Lasso and rotation only; no flip or selection resize controls."
        },
        "perspective": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/core/projection-3d.ts",
          "note": "Canvas atoms rotate around horizontal and vertical axes."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/graphics/shapes.ts#L49-L69",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/chemable/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/graphics/shapes.ts#L75-L90",
          "note": "Drew a curved electron-pair arrow.",
          "shot": {
            "image": "evidence/chemable/f-mechanism-arrows.webp",
            "caption": "A curved arrow on the drawing canvas."
          }
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/draw.ts",
          "note": "Free text supports font selection and subscript/superscript syntax."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/graphics/shapes.ts#L91-L124",
          "note": "Editable boxes, ellipses, square brackets and parentheses."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/ui/toolbar.ts#L146-L167",
          "note": "Auto-Layout regenerates 2D coordinates through RDKit.",
          "engine": {
            "library": "RDKit (local Python/PyInstaller sidecar; Compute2DCoords with 3D embedding fallback)",
            "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/engine_3d.py#L20-L35"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/core/ui-state.ts",
          "note": "Font, bond length, spacing and line width persist locally."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/ui/style-menu.ts#L53-L62",
          "note": "Selection color applies to atoms and internal bonds."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/chemistry.ts#L82-L101",
          "note": "Flags excess valence; transition metals are exempt.",
          "engine": {
            "library": "In-house (TypeScript valence-table checks; transition metals exempt)",
            "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/chemistry.ts#L82-L101"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/plugins/analyzer.ts#L155-L199",
          "note": "Cholesterol: C27H46O and 386.618 g/mol.",
          "shot": {
            "image": "evidence/chemable/f-formula-mass.webp",
            "caption": "Analysis dialog showing C27H46O and 386.618 g/mol."
          },
          "engine": {
            "library": "In-house (TypeScript element counting, implicit hydrogens and atomic-mass table)",
            "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/plugins/analyzer.ts#L155-L197"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/plugins/knowitall.ts#L170-L187",
          "note": "Caffeine search result inserted a structure.",
          "engine": {
            "library": "PubChem PUG REST (remote server name-to-SMILES lookup); RDKit (local Python/PyInstaller sidecar; SMILES-to-2D conversion)",
            "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/plugins/knowitall.ts#L155-L179"
          }
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in menus, analyzer, or data hub."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/plugins/knowitall.ts#L113-L145",
          "note": "KnowItAll returned caffeine matches and imported the first.",
          "engine": {
            "library": "PubChem autocomplete and PUG REST (remote server APIs); RDKit (local Python/PyInstaller sidecar for importing results)",
            "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/plugins/knowitall.ts#L113-L179"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/viewer3d.ts#L46-L75",
          "note": "Cholesterol generated from SMILES and rotated in depth.",
          "shot": {
            "image": "evidence/chemable/f-model-3d.webp",
            "caption": "A ball-and-stick model in the 3D structure viewer."
          },
          "engine": {
            "library": "3Dmol.js (JavaScript/WebGL viewer loaded from CDN); RDKit (local Python/PyInstaller sidecar; ETKDGv3 conformers and UFF optimization)",
            "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/viewer3d.ts#L47-L67"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Opening minimal CDXML produced Error while loading file."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/io/file-manager.ts",
          "note": "Opening simple.mol produced Error while loading file."
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/smiles.ts",
          "note": "Imported and exported all fixtures; stereochemistry markers were lost.",
          "engine": {
            "library": "In-house (TypeScript SMILES export without stereochemistry); RDKit (local Python/PyInstaller sidecar for SMILES import)",
            "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/plugins/knowitall.ts#L67-L161"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/export.ts#L37-L245",
          "note": "Caffeine SVG has 32 NaN coordinates in 16 line elements."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/io/file-manager.ts#L115-L145",
          "note": "Command-P did nothing; File offers SVG and PNG only."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/export.ts#L274-L336",
          "note": "Large transparent PNG exports; no DPI metadata or resolution control."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/engine_3d.py",
          "note": "Internal helper converts SMILES into 2D or 3D MOL blocks."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/package.json",
          "note": "Standalone Electron app; no embeddable editor library confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/joreitz/chemable/blob/e1c03d64d3f2526ca2996b60b46e60e821617fef/src/draw.ts#L402-L415",
          "note": "Selection rings only; PNG and SVG omit them."
        }
      },
      "caveats": [
        "PolyForm Noncommercial permits only specified noncommercial purposes.",
        "SVG omits annotation shapes and can emit invalid coordinates for labeled bonds.",
        "SMILES loses stereochemistry; PDF export and custom-template saving lack connected UI controls."
      ],
      "github": {
        "url": "https://github.com/joreitz/chemable",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2025-11-29",
        "commits": 81,
        "contributors": 4,
        "pushedAt": "2026-08-18T04:05:25Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "1.1.9",
        "canvas": "evidence/chemable/canvas.webp",
        "canvasLight": "evidence/chemable/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 196.69,
          "paclitaxelMb": 227.13,
          "baselineMb": null,
          "rssIdleMb": 512.48,
          "rssPaclitaxelMb": 515.44,
          "runs": 3,
          "processes": 4,
          "method": "Three fresh open -n launches; SMILES UI import; full-tree phys_footprint medians; 10-second waits; MiB.",
          "note": "Electron main, renderer, GPU, network included; isolated profiles; CDP automation; RSS cross-check."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Editor stays light; native title bar remains dark under both overrides."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "Chemable-1.1.9-arm64.dmg",
        "ran": true,
        "failure": null,
        "downloadBytes": 179326133,
        "installedBytes": 499785728,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemable/simple.png",
            "note": "Default PNG retained; SVG contains NaN bond coordinates.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemable/complex.png",
            "note": "Automatic layout retained; input stereochemistry annotations were dropped.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemable/threed.png",
            "note": "Rotatable model generated from SMILES; default viewport saved as threed-view.png.",
            "structure": "stereo"
          }
        ],
        "observations": [
          "Default floating toolbar covers the menu bar; moved panels to access commands.",
          "SMILES imports automatically generate black 2D drawings without cleanup.",
          "Paclitaxel and cholesterol imports and output SMILES lose stereo annotations.",
          "Default PNG exports are transparent; caffeine SVG has invalid bond coordinates.",
          "Cholesterol opens as a rotatable ball-and-stick model with explicit hydrogens."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 372,
        "idleMb": 153,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 179326133,
      "references": [
        "https://github.com/joreitz/chemable",
        "https://github.com/joreitz/chemable/blob/main/index.html"
      ]
    },
    {
      "id": "p136",
      "slug": "wavespeed-ai-chemical-structure-drawer",
      "name": "WaveSpeed AI Chemical Structure Drawer",
      "rank": 43,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "RDKit",
          "OpenChemLib",
          "3Dmol.js",
          "InChI",
          "CoordGen",
          "maeparser"
        ],
        "source": "https://wavespeed.ai/static/third-party-licenses",
        "note": "Vendor notices identify chemistry and 3D libraries; drawing canvas provenance remains unestablished."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Custom SVG editor; RDKit.js exports",
        "language": "JavaScript",
        "source": "https://wavespeed.ai/_next/static/chunks/77134.7ba20c5fb809f820.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "No documented editor embed; headers alone do not confirm framing support."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "RDKit WebAssembly chemistry and export rendering"
        }
      ],
      "thirdParty": {
        "summary": "RDKit, CoordGen, OpenChemLib JS and 3Dmol.js BSD-3-Clause; InChI 1.07 and maeparser MIT. Chemistry components load unmodified at runtime.",
        "source": "https://wavespeed.ai/static/third-party-licenses",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          },
          {
            "name": "3Dmol.js",
            "license": "BSD-3-Clause",
            "source": "https://github.com/3dmol/3Dmol.js/blob/master/LICENSE"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          },
          {
            "name": "CoordGen",
            "license": "BSD-3-Clause",
            "source": "https://github.com/schrodinger/coordgenlibs/blob/master/LICENSE"
          },
          {
            "name": "maeparser",
            "license": "MIT",
            "source": "https://github.com/schrodinger/maeparser/blob/master/LICENSE.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A standalone molecular drawing editor with documented vector SVG export for publication figures.",
      "summary": "Browser editor for drawing molecules, calculating properties, exporting images and structure files, and viewing 3D models.",
      "website": "https://wavespeed.ai/free-tools/chemical-structure-drawer",
      "repo": null,
      "docs": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
      "vendor": "WaveSpeedAI",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Proprietary browser tool, free to use under WaveSpeedAI terms.",
        "source": "https://wavespeed.ai/static/terms"
      },
      "price": {
        "text": "Free",
        "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer"
      },
      "engine": {
        "rendering": null,
        "chemistry": "RDKit MinimalLib; OpenChemLib JS for 3D conformers and MMFF94",
        "ui": null,
        "source": "https://wavespeed.ai/static/third-party-licenses"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-tool",
          "note": "Drew all three orders and changed a single bond.",
          "shot": {
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/f-bonds-core.webp",
            "caption": "Single, double, and triple bond tools beside the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-tool",
          "note": "Placed wedge, hashed, and wavy bonds.",
          "shot": {
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/f-stereo-bonds.webp",
            "caption": "Wedge, hashed, and wavy bond tools beside a structure."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-tool",
          "note": "Placed benzene and cyclohexane.",
          "shot": {
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/f-rings.webp",
            "caption": "Aromatic and ring-size tools beside a caffeine structure."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-tool",
          "note": "Placed carboxylic acid from functional groups."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-tool",
          "note": null,
          "shot": {
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/f-atom-labels.webp",
            "caption": "Element labels and charge controls beside a caffeine structure."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-tool",
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-tool",
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Select and move tool visible."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": null
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-tool",
          "note": null,
          "shot": {
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/f-cleanup.webp",
            "caption": "Clean up command above the drawing canvas."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly; CoordGen 2D layout)",
            "source": "https://wavespeed.ai/_next/static/chunks/80076.e761f423c867abdd.js"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Individual colour overrides unverified."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": null,
          "engine": {
            "library": "In-house",
            "source": "https://wavespeed.ai/_next/static/chunks/77134.7ba20c5fb809f820.js"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-tool",
          "note": "Paclitaxel stereocentres displayed R/S labels.",
          "shot": {
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/f-stereo-perception.webp",
            "caption": "Molecular structure with R and S stereochemical labels."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly)",
            "source": "https://wavespeed.ai/_next/static/chunks/80076.e761f423c867abdd.js"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": "Caffeine: C8H10N4O2, 194.194 g/mol.",
          "shot": {
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/f-formula-mass.webp",
            "caption": "Caffeine structure with its formula and molecular weight."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly masses and implicit hydrogens); In-house (formula assembly)",
            "source": "https://wavespeed.ai/_next/static/chunks/80076.e761f423c867abdd.js"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": "Caffeine logP and TPSA displayed.",
          "shot": {
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/f-properties.webp",
            "caption": "Caffeine structure with logP and TPSA values."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly)",
            "source": "https://wavespeed.ai/_next/static/chunks/80076.e761f423c867abdd.js"
          }
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": "Caffeine entered as text was rejected."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Name field is manually entered; no naming command found."
        },
        "nmr-prediction": {
          "status": "no",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "no",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": "SDF displayed as rotatable ball-and-stick model.",
          "shot": {
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/f-model-3d.webp",
            "caption": "Ball-and-stick structure in the 3D viewer."
          },
          "engine": {
            "library": "OpenChemLib JS (JavaScript conformers and MMFF94); 3Dmol.js (JavaScript viewer)",
            "source": "https://wavespeed.ai/static/third-party-licenses"
          }
        },
        "crystals": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer",
          "note": "Protein mmCIF viewing documented; general crystal editing unestablished."
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "CDXML file rejected as unsupported."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": "Opened MOL and 3D SDF; exported MOL and SDF.",
          "engine": {
            "library": "RDKit.js (WebAssembly); In-house (MOL/SDF parsing and SDF writing)",
            "source": "https://wavespeed.ai/_next/static/chunks/77134.7ba20c5fb809f820.js"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": "Loaded SMILES and exported canonical SMILES.",
          "engine": {
            "library": "RDKit.js (WebAssembly)",
            "source": "https://wavespeed.ai/_next/static/chunks/80076.e761f423c867abdd.js"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": null,
          "engine": {
            "library": "RDKit.js (WebAssembly, including InChI; export only)",
            "source": "https://wavespeed.ai/_next/static/chunks/80076.e761f423c867abdd.js"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer#structure-drawer-faq",
          "note": "Downloaded default SVG drawings."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Export menu has no PDF option."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "PNG exported at 3×; no DPI control found."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://wavespeed.ai/free-tools/chemical-structure-drawer",
          "note": "No documented editor embed; headers alone do not confirm framing support."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://wavespeed.ai/_next/static/chunks/77134.7ba20c5fb809f820.js",
          "note": "Selection halos only; exported images omit them."
        }
      },
      "caveats": [
        "No reactions or drawing arrows.",
        "No name-to-structure, NMR prediction, or database search.",
        "Full offline use and ChemDraw interoperability are undocumented."
      ],
      "github": null,
      "hands": {
        "testedVersion": "cBQ3oDFlZ9g0696A_FKvj",
        "canvas": "evidence/wavespeed-ai-chemical-structure-drawer/canvas.webp",
        "canvasLight": "evidence/wavespeed-ai-chemical-structure-drawer/canvas-light.webp",
        "canvasDark": "evidence/wavespeed-ai-chemical-structure-drawer/canvas-dark.webp",
        "memory": {
          "idleMb": 477,
          "paclitaxelMb": 506,
          "baselineMb": 273,
          "rssIdleMb": 1168.9,
          "rssPaclitaxelMb": 1042.4,
          "runs": 3,
          "processes": 7,
          "method": "Fresh Playwright Edge; summed browser process-tree physical footprints; median of three.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://wavespeed.ai/free-tools/chemical-structure-drawer",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/simple.svg",
            "note": null,
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/complex.svg",
            "note": "Canvas shows R/S labels; default SVG export omits them.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "ok",
            "input": "sdf",
            "image": "evidence/wavespeed-ai-chemical-structure-drawer/threed.png",
            "note": "SMILES build remained pending; 3D SDF opened and rotated.",
            "structure": "match"
          }
        ],
        "observations": [
          "Hosted build identifier comes from the page's Next.js payload.",
          "Default canvas uses a dark background and element colors.",
          "Paclitaxel shows R/S labels on canvas, omitted from default SVG.",
          "Cholesterol SMILES-to-3D remained pending before SDF fallback.",
          "Default 3D view uses ball-and-stick, colored by element."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 173,
        "transferBytes": 1326595
      },
      "downloadBytes": null,
      "references": [
        "https://wavespeed.ai/free-tools/chemical-structure-drawer",
        "https://wavespeed.ai/free-tools/chemical-structure-drawer"
      ]
    },
    {
      "id": "p24",
      "slug": "cdraw",
      "name": "cDraw",
      "rank": 44,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "MCDL",
          "CDK",
          "InChI",
          "Beam"
        ],
        "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar",
        "note": "Custom Java2D canvas; MCDL supplies coordinates, with CDK-derived chemistry and identifier toolkits."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "cDraw ChemPanel/drawingobjects (Java2D)",
        "language": "Java",
        "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar"
      },
      "enginesChecked": true,
      "languageNote": "Excludes third-party native libraries and XML data.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "AGPL-3.0-only",
        "how": "Standalone Java editor; no project-offered embedding component confirmed."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Native InChI and Ghostscript libraries"
        }
      ],
      "thirdParty": {
        "summary": "LGPL copyleft CDK code, JNI-InChI and ghost4j; proprietary Sun-licensed JAI; BSD Beam, Apache components and SIL-OFL Liberation Sans font.",
        "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=17",
        "notice": null,
        "libraries": [
          {
            "name": "MCDL",
            "license": "Public Domain",
            "source": "https://sourceforge.net/projects/mcdl/"
          },
          {
            "name": "Chemistry Development Kit",
            "license": "LGPL-2.1-or-later",
            "source": "https://github.com/cdk/cdk/blob/main/pom.xml"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          },
          {
            "name": "Beam",
            "license": "BSD-2-Clause-Views",
            "source": "https://github.com/johnmay/beam/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It creates styled 2D structures and reaction figures with text, layout tools and vector export.",
      "summary": "A Java desktop editor for creating publication-quality 2D chemical structures and reaction schemes.",
      "website": "https://www.structuralchemistry.org/pcsb/cdraw.php",
      "repo": null,
      "docs": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf",
      "vendor": "Hofmann Laboratory",
      "license": {
        "kind": "open-source",
        "spdx": "AGPL-3.0-only",
        "text": "GNU Affero General Public License version 3.",
        "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=19"
      },
      "price": {
        "text": "Free",
        "source": "https://zenodo.org/records/6814919"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.4.1",
        "date": "2019-10-21",
        "source": "https://zenodo.org/records/6814919"
      },
      "engine": {
        "rendering": "Java2D in ChemPanel; custom SVG/PostScript generators; Ghostscript converts PostScript to PDF.",
        "chemistry": "In-house PCSB code with CDK modules, MCDL, JNI-InChI and Beam.",
        "ui": "Java Swing",
        "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar"
      },
      "languages": [
        "Java"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=5",
          "note": "Tools selected; canvas input produced no visible marks during automation.",
          "shot": {
            "image": "evidence/cdraw/f-bonds-core.webp",
            "caption": "Single, double and triple bond tools above a structure."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=6",
          "note": "Tools selected; canvas input produced no visible marks during automation.",
          "shot": {
            "image": "evidence/cdraw/f-stereo-bonds.webp",
            "caption": "A molecular drawing with solid and hashed wedge bonds."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=5",
          "note": "Cycles both offset positions and a symmetric double bond."
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=7",
          "note": "Tools selected; canvas input produced no visible marks during automation.",
          "shot": {
            "image": "evidence/cdraw/f-rings.webp",
            "caption": "Ring tools above benzene and cyclohexane chair drawings."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=7",
          "note": "Two cyclohexane chair templates.",
          "shot": {
            "image": "evidence/cdraw/f-conformers.webp",
            "caption": "Chair presets and a cyclohexane chair on the canvas."
          }
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=7",
          "note": "Drag to draw an alkane chain with 120-degree angles."
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=7",
          "note": "Ring and chair presets; insertion attempt produced no visible drawing.",
          "shot": {
            "image": "evidence/cdraw/f-templates.webp",
            "caption": "Ring and chair presets above two drawings."
          }
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar",
          "note": "Labels and charges supported; isotope metadata is not saved or copied."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=10",
          "note": "Radical dots and atom-localized, rotatable electron pairs."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Freehand Select and Rotation Mode tools; resizing unverified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=9",
          "note": "Tools selected; canvas input produced no visible marks during automation."
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=9",
          "note": "Tools selected; canvas input produced no visible marks during automation."
        },
        "reaction-data": {
          "status": "partial",
          "evidence": "source",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar",
          "note": "Reaction SMILES imports as molecules and graphics, without retained reaction roles."
        },
        "atom-mapping": {
          "status": "no",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=12",
          "note": "Manual explicitly states atom mapping is unsupported."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar",
          "note": "TextInputDialog provides subscripts, superscripts, font sizing and text formatting."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=10",
          "note": "Editable lines, rectangles, ellipses and bracket pairs."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=11",
          "note": "Alignment and equal-spacing commands for selected objects."
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=12",
          "note": "Grouped components translate and align as a fixed assembly."
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=15",
          "note": "ACS and RSC presets."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=16",
          "note": "Save and load bond, font and page settings."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=4",
          "note": "Right-click objects to edit their individual colors."
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar",
          "note": "Custom page dimensions on a single-page drawing canvas."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=13",
          "note": "R/S labels for tetrahedral carbons require four explicit substituents.",
          "engine": {
            "library": "Ported from CDK 2.0 CIPTool/stereo (Java), with in-house CalculateCIPchirality",
            "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar"
          }
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or molecular mass command found."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Insert menu offers SMILES, InChI, MCDL; no chemical-name entry."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=14",
          "note": "Get IUPAC Name failed: missing jniinchi-1.03_1-UNKNOWN library."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=11",
          "note": "Experimental optical recognition of GIF, PNG and TIFF structure images.",
          "engine": {
            "library": "In-house ChemOSR (Java); OCR ported from Dombi Attila optical_character_recognition (Java)",
            "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar"
          }
        },
        "database-lookup": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=14",
          "note": "Opens matching PubChem pages instead of importing structures into the editor."
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view command in menus or toolbars."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=11",
          "note": "Basic CDXML import and export.",
          "engine": {
            "library": "In-house CDXMLparser/CDXMLgenerator (Java SAX parser and XML writer)",
            "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar"
          }
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar",
          "note": "MOL selection blocked by automation; Save offers SDF only.",
          "engine": {
            "library": "In-house SDFparser/SDFgenerator (Java; MOL/SDF input, SDF output)",
            "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=3",
          "note": "Both fixtures imported; output failed because JNI-InChI library was missing.",
          "engine": {
            "library": "Ported from CDK SmilesParser/CDKToBeam/InChINumbersTools (Java); Beam 1.3.2 (bundled Java); JNI-InChI 0.7 (local native canonical numbering); MCDL 1.00 (bundled Java coordinate generation)",
            "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=3",
          "note": "InChI input and InChI/InChIKey output through JNI-InChI.",
          "engine": {
            "library": "JNI-InChI 0.7 (bundled Java/JNI and native InChI 1.03); import adapter ported from CDK InChIToStructure",
            "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=11",
          "note": "Caffeine SVG exported successfully with default settings."
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar",
          "note": "Export opened Save panel; automation could not enter filename."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=15",
          "note": "Command invoked on empty canvas; no PNG produced; meaningful export unverified."
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "source",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1_source.jar",
          "note": "External clipboard exposes imageFlavor only, without ChemDraw structure data."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://www.structuralchemistry.org/pcsb/cdraw.php",
          "note": "Standalone Java editor; no project-offered embedding component confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://zenodo.org/records/6814919/files/cdraw_v1.4_manual.pdf#page=5",
          "note": "Only temporary blue hover halos around individual atoms."
        }
      },
      "caveats": [
        "Requires Java; bundled InChI native binaries do not include macOS ARM64.",
        "Website groups MOL/SDF exchange together; source exports SDF only.",
        "EPS/PDF export supports only Latin and Greek character sets."
      ],
      "github": null,
      "hands": {
        "testedVersion": "1.4.1",
        "canvas": "evidence/cdraw/canvas.webp",
        "canvasLight": "evidence/cdraw/canvas-light.webp",
        "canvasDark": "evidence/cdraw/canvas-dark.webp",
        "memory": {
          "idleMb": 198.63,
          "paclitaxelMb": 562.85,
          "baselineMb": null,
          "rssIdleMb": 228.24,
          "rssPaclitaxelMb": 597.05,
          "runs": 2,
          "processes": 1,
          "method": "Median two GUI runs; summed process-tree phys_footprint; 10-second waits; footprint bytes converted to MiB.",
          "note": "Two complete GUI runs; three import attempts failed from intermittent keyboard focus."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "follows system",
          "note": "Dark titlebar and menus; canvas and toolbars remain light."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "jar",
        "artifact": "https://zenodo.org/records/6814919/files/cdraw_v1.4.1.jar",
        "ran": true,
        "failure": "Automation lost keyboard and canvas input focus; complex export and file round-trips remain unverified.",
        "downloadBytes": 9633851,
        "installedBytes": 9789440,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/cdraw/simple.svg",
            "note": "Current Kekule SMILES; default layout retained; SVG saved; structure output unavailable.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/cdraw/complex.svg",
            "note": "Current Kekule SMILES; overlapping bonds and labels retained; SVG saved; stereo warning.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": null,
            "image": null,
            "note": "No rotatable 3D view; cholesterol skipped.",
            "structure": null
          }
        ],
        "observations": [
          "Default heteroatom labels are blue for nitrogen and red for oxygen.",
          "Generated structures appear near the upper-left canvas corner at 200% zoom.",
          "Paclitaxel default layout contains overlapping bonds and atom labels.",
          "Isomeric SMILES import warns users to check chiral-centre depiction.",
          "Default SVG exports a 215.9 by 279.4 mm page.",
          "Redraw successfully saved both current Kekule-SMILES fixtures as default SVG exports; paclitaxel overlaps remain."
        ]
      },
      "perf": null,
      "downloadBytes": 9633851,
      "references": [
        "https://www.structuralchemistry.org/pcsb/cdraw.php"
      ]
    },
    {
      "id": "p66",
      "slug": "bondcraft",
      "name": "BondCraft",
      "rank": 45,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit",
          "CoordGen"
        ],
        "source": "https://zenodo.org/records/21078713/files/BondCraft_Manual_v0.2.0.pdf#page=31",
        "note": "Custom canvas; RDKit and CoordGen provide SMILES parsing and imported coordinates."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "BondCraft Canvas, SVG and EPS renderer",
        "language": "JavaScript",
        "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript is generated; WebAssembly belongs to third-party chemistry libraries.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Free academic/personal use; proprietary.",
        "how": "No embed documentation found; framing headers absent, functionality unconfirmed."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "RDKit and CoordGen WebAssembly chemistry"
        }
      ],
      "thirdParty": {
        "summary": "BSD-3-Clause (RDKit/CoordGen); Apache-2.0 (bundled Arimo/Tinos fonts).",
        "source": "https://zenodo.org/records/21078713/files/BondCraft_Manual_v0.2.0.pdf#page=31",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "CoordGen",
            "license": "BSD-3-Clause",
            "source": "https://github.com/schrodinger/coordgenlibs/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It creates editable 2D structures and reaction schemes with journal styles and vector exports for publication figures.",
      "summary": "Browser-based editor for drawing chemical structures, reaction mechanisms, and publication figures, with stereochemistry checks and SMILES conversion.",
      "website": "https://www.bondcraft.net/",
      "repo": null,
      "docs": "https://www.bondcraft.net/#manual",
      "vendor": "Dr. Marcel Heinz",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Proprietary; free for academic and personal use. Copying, modification and redistribution are restricted.",
        "source": "https://www.bondcraft.net/"
      },
      "price": {
        "text": "Free for academic and personal use (2026-11-05)",
        "source": "https://www.bondcraft.net/#citation"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": "0.2.1",
        "date": "2026-08-15",
        "source": "https://www.bondcraft.net/"
      },
      "engine": {
        "rendering": "HTML Canvas 2D for screen and PNG; custom SVG and PostScript EPS exporters",
        "chemistry": "In-house valence, CIP and SMILES engine; RDKit with CoordGen for SMILES import",
        "ui": "React",
        "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Drew a bond and cycled single, double, and triple.",
          "shot": {
            "image": "evidence/bondcraft/f-bonds-core.webp",
            "caption": "A triple bond drawn on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/stereochemistry-drawing-tool",
          "note": "Bond cycling produced solid wedge and hashed wedge.",
          "shot": {
            "image": "evidence/bondcraft/f-stereo-bonds.webp",
            "caption": "Structure on the canvas with solid and hashed wedge bonds."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Dative and dashed bonds; no dedicated hydrogen or quadruple bond types."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Placed benzene ring from the template selector.",
          "shot": {
            "image": "evidence/bondcraft/f-rings.webp",
            "caption": "Structure selector with benzene and other ring templates."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.bondcraft.net/#manual",
          "note": "Cyclohexane chair template."
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/#manual",
          "note": "Benzene template placed and generated aromatic SMILES.",
          "shot": {
            "image": "evidence/bondcraft/f-templates.webp",
            "caption": "Structure selector with cubane, adamantane, fullerene, and porphyrin templates."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Saved JSON/SVG projects can be reimported as movable placement templates."
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.bondcraft.net/#manual",
          "note": "Atom properties set custom symbols, formal charges and isotopes."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.bondcraft.net/#manual",
          "note": "Single radicals, paired dots and lone-pair bars."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Number keys change hovered bonds; plus/minus changes hovered atom charges."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Lasso, rotation and flipping; bracket resizing, without whole-structure scaling."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/#manual",
          "note": "Placed a straight reaction arrow by dragging.",
          "shot": {
            "image": "evidence/bondcraft/f-reaction-arrows.webp",
            "caption": "Arrow selector with reaction, equilibrium, resonance, and retrosynthesis options."
          }
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/#manual",
          "note": "Curved-arrow option available; drag and clicks produced no visible arrow.",
          "shot": {
            "image": "evidence/bondcraft/f-mechanism-arrows.webp",
            "caption": "Arrow selector with one- and two-electron mechanism options."
          }
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Chemical text symbols include reaction arrows, Å and Greek letters."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Mixed fonts, bold, italic, subscripts and superscripts in canvas text."
        },
        "shapes": {
          "status": "partial",
          "evidence": "source",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Editable brackets and curved arrows; no general shape objects."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.bondcraft.net/#manual",
          "note": "Selected objects align left, center, right, top, middle or bottom."
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.bondcraft.net/#manual",
          "note": "Grouped objects move together; grouping and ungrouping are supported."
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.bondcraft.net/acs-style-chemical-editor",
          "note": "ACS, Nature, Beilstein and Royal Society of Chemistry presets."
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Custom bond/font settings are session-only, omitted from saved projects."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.bondcraft.net/#manual",
          "note": "Individually color atoms, bonds, arrows and text."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.bondcraft.net/#manual",
          "note": "Octet violations receive red wavy halos.",
          "engine": {
            "library": "In-house",
            "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.bondcraft.net/stereochemistry-drawing-tool",
          "note": "Automatic R/S labels; alkene geometry encoded in isomeric SMILES.",
          "engine": {
            "library": "In-house",
            "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Caffeine displayed C8H10N4O2 and mass 194.19.",
          "shot": {
            "image": "evidence/bondcraft/f-formula-mass.webp",
            "caption": "Caffeine structure with its molecular formula and mass."
          },
          "engine": {
            "library": "In-house",
            "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name import command found in editor controls."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name generation command found in editor controls."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Numeric repeats expand formula, mass and SMILES beyond graphical brackets.",
          "shot": {
            "image": "evidence/bondcraft/f-polymers.webp",
            "caption": "Bracket templates include brackets marked with a repeating-unit n."
          }
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Amino-acid and DNA/RNA monomer templates provide directional connection anchors."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view found in menus or toolbars."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/cdxml-viewer",
          "note": "Exported and reimported caffeine CDXML; formula and SMILES matched.",
          "shot": {
            "image": "evidence/bondcraft/f-cdxml.webp",
            "caption": "ChemDraw panel with CDXML export and import options."
          },
          "engine": {
            "library": "In-house",
            "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js"
          }
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Project opener rejected MOL; picker accepts JSON and SVG."
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/smiles-to-structure",
          "note": "Imported and copied both fixture SMILES.",
          "shot": {
            "image": "evidence/bondcraft/f-smiles.webp",
            "caption": "Benzene on the canvas with its SMILES string."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly, import, with CoordGen layout); In-house (export)",
            "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/chemical-structure-export",
          "note": "Downloaded SVGs for both 2D fixtures.",
          "shot": {
            "image": "evidence/bondcraft/f-svg-export.webp",
            "caption": "Image export panel listing SVG, PNG, and EPS options."
          }
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Image export offers PNG, SVG, and EPS."
        },
        "png-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://www.bondcraft.net/chemical-structure-export",
          "note": "Downloaded caffeine PNG from export dialog.",
          "shot": {
            "image": "evidence/bondcraft/f-png-export.webp",
            "caption": "Image export panel listing PNG, SVG, and EPS options."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://www.bondcraft.net/",
          "note": "No embed documentation found; framing headers absent, functionality unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.bondcraft.net/assets/index-Pb2z6oOc.js",
          "note": "Blue atom backgrounds and bond halos indicate selection; exports omit them."
        }
      },
      "caveats": [
        "Free usage terms specify academic and personal use.",
        "CDXML exchange may omit unsupported graphical elements.",
        "Custom drawing styles are not included in saved project files."
      ],
      "github": null,
      "hands": {
        "testedVersion": "0.2.1",
        "canvas": "evidence/bondcraft/canvas.webp",
        "canvasLight": "evidence/bondcraft/canvas-light.webp",
        "canvasDark": "evidence/bondcraft/canvas-dark.webp",
        "memory": {
          "idleMb": 751.57,
          "paclitaxelMb": 773.07,
          "baselineMb": 410.4,
          "rssIdleMb": 1305.39,
          "rssPaclitaxelMb": 1328.44,
          "runs": 3,
          "processes": 7,
          "method": "Fresh headed Playwright Chromium; summed process-tree phys_footprint; medians in MiB.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Dark mode changes the interface; the canvas remains white."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://www.bondcraft.net/#editor",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/bondcraft/simple.svg",
            "note": "Imported current SMILES and placed the generated structure on the canvas.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/bondcraft/complex.svg",
            "note": "Imported current SMILES and placed the generated structure on the canvas.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": null,
            "image": null,
            "note": "No 3D view found in the editor controls.",
            "structure": null
          }
        ],
        "observations": [
          "Default caffeine formula and mass displayed as C8H10N4O2 and 194.19.",
          "Paclitaxel appeared with wedge bonds and stereochemical labels.",
          "Copied SMILES matched both fixtures by RDKit isomeric canonicalization.",
          "SMILES import required a click to place each generated structure."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 1986,
        "transferBytes": 3190710
      },
      "downloadBytes": null,
      "references": [
        "https://www.bondcraft.net/",
        "https://www.linkedin.com/posts/marcel-heinz_chemistry-organicchemistry-cheminformatics-activity-7460337969649053697-qoEf",
        "https://www.biophys.mpg.de/2205691/marcel-heinz"
      ]
    },
    {
      "id": "p21",
      "slug": "jchempaint",
      "name": "JChemPaint",
      "rank": 46,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "CDK",
          "InChI"
        ],
        "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/RenderPanel.java",
        "note": "Own canvas and controllers; CDK provides chemistry and rendering, with InChI for identifiers."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "CDK StandardGenerator",
        "language": "Java",
        "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/RenderPanel.java#L319"
      },
      "enginesChecked": true,
      "languageNote": "HTML/CSS docs; C/Swift clipboard bindings and utilities; Shell/Makefile packaging.",
      "video": null,
      "embedding": {
        "methods": [
          "desktop widget"
        ],
        "package": null,
        "limit": "Java/Swing only; LGPL-2.1-or-later obligations.",
        "how": "Add JChemPaintPanel(IChemModel) to Swing containers; getMenuForEmbedded supplies menus."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Native InChI and macOS clipboard bridge"
        },
        {
          "language": "Swift",
          "role": "macOS native clipboard"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-2.1-or-later CDK/JNA-InChI, LGPL-2.1 XOM, GPL-2.0 with Classpath exception vecmath, and Apache-2.0 libraries.",
        "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/pom.xml",
        "notice": "https://github.com/JChemPaint/jchempaint/blob/master/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/license.html",
        "libraries": [
          {
            "name": "Chemistry Development Kit",
            "license": "LGPL-2.1-or-later",
            "source": "https://github.com/cdk/cdk/blob/main/pom.xml"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "The standalone editor creates 2D structures and reactions with vector SVG and PDF export for publication figures.",
      "summary": "A Java desktop editor for drawing and exporting two-dimensional chemical structures and reactions.",
      "website": "https://jchempaint.github.io/",
      "repo": "https://github.com/JChemPaint/jchempaint",
      "docs": "https://github.com/JChemPaint/jchempaint/wiki",
      "vendor": "JChemPaint Developers",
      "license": {
        "kind": "open-source",
        "spdx": "LGPL-2.1-or-later",
        "text": "GNU Lesser General Public License 2.1 or later.",
        "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/license.html"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/JChemPaint/jchempaint/wiki#features"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/JChemPaint/jchempaint/releases"
      },
      "engine": {
        "rendering": "CDK rendering via Java2D/AWT; CDK DepictionGenerator for SVG and PDF",
        "chemistry": "Chemistry Development Kit (CDK)",
        "ui": "Java Swing",
        "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/RenderPanel.java"
      },
      "languages": [
        "Java"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/contextMenuBond.html",
          "note": "Drew single, double, and triple bonds by clicking atoms.",
          "shot": {
            "image": "evidence/jchempaint/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/contextMenuBond.html",
          "note": "Solid wedge, hashed wedge, and wavy bonds drawn successfully.",
          "shot": {
            "image": "evidence/jchempaint/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/JCPGUI_application.properties",
          "note": "Quadruple bonds exposed; coordination bonds lack a default UI binding."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/bottomButtons.html",
          "note": "Inserted benzene using the dedicated ring tool.",
          "shot": {
            "image": "evidence/jchempaint/f-rings.webp",
            "caption": "A benzene ring on the canvas beside the ring toolbar."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/drawingButtons.html",
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/wiki/Templates",
          "note": "Inserted Morphine from the built-in template library."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/dialog/EnterElementSwingModule.java",
          "note": "Recognized group abbreviations expand into connected atoms during insertion."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/contextMenuAtom.html",
          "note": null
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/contextMenuAtom.html",
          "note": "Single-electron radicals can be added and removed."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/hotkeys.properties",
          "note": "Context-sensitive atom and bond keyboard shortcuts."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/controller/MoveModule.java",
          "note": "Lasso selection, rotation, flipping and coordinate-based resizing."
        },
        "perspective": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/controller/Rotate3DModule.java",
          "note": "Quasi-3D projection transforms selected two-dimensional drawing coordinates."
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/render/src/main/java/org/openscience/jchempaint/renderer/generators/ReactionArrowGenerator.java",
          "note": "Forward reaction arrow worked; no alternative arrow styles found.",
          "shot": {
            "image": "evidence/jchempaint/f-reaction-arrows.webp",
            "caption": "A forward reaction arrow on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved electron-pushing tool found in menus or toolbars."
        },
        "reaction-data": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/reactions.html",
          "note": "Reaction tool assigned reactants and products while drawing forward arrow."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/SnapGuides.java",
          "note": "Snap guides align molecule bounds and centers during dragging."
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/menuTools.html",
          "note": null,
          "engine": {
            "library": "CDK StructureDiagramGenerator (Java)",
            "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/controller/ControllerHub.java#L1986"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/dialog/editor/PropertiesModelEditor.java",
          "note": "Bond settings persist; font-selection controls are disabled."
        },
        "color": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Element coloring and background color controls visible; individual colors unverified."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/RenderPanel.java#L557",
          "note": "Formula displayed in status bar; no mass command found.",
          "shot": {
            "image": "evidence/jchempaint/f-formula-mass.webp",
            "caption": "A molecular structure and its formula in the status bar."
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Direct entry lists CAS, SMILES, InChI; no name command."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Tools offers SMILES/InChI generation; no naming command found."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/rgroup_tutorial.html",
          "note": "R-group queries, attachment points, logic and enumeration."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/InsertTextPanel.java#L189",
          "note": "CAS lookup uses legacy PubChem endpoints; service availability unverified.",
          "engine": {
            "library": "PubChem Entrez/E-utilities (remote HTTP), In-house Java client, and CDK SmilesParser (Java; legacy endpoints)",
            "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/InsertTextPanel.java#L189"
          }
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "3D SDF rejected: cannot display without 2D coordinates."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Absent from inspected Open and Save As format lists."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/whatIs.html",
          "note": "MOL round-trip succeeded; SDF parser requested 2D layout.",
          "engine": {
            "library": "CDK MDLV2000Reader and MDLV2000Writer (Java; general SDF import only)",
            "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/io/FileHandler.java#L101"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/wiki#jchempaint-editor-applet",
          "note": "Caffeine paste and generation worked; paclitaxel file autodetection failed.",
          "engine": {
            "library": "CDK SmilesParser, SMILESReader, SmilesGenerator and SMILESWriter (Java)",
            "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/action/SaveAsAction.java#L417"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/menuTools.html",
          "note": "Generates InChI; insertion also accepts InChI.",
          "engine": {
            "library": "CDK cdk-inchi (Java) through JNA-InChI to native InChI (C)",
            "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/inchi-jni/src/main/java/org/openscience/jchempaint/inchi/JNIInChIHandler.java#L19"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/action/SaveAsAction.java#L232",
          "note": "Reads and writes MDL RXN reaction files."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/resources/org/openscience/jchempaint/resources/userhelp_jcp/en_US/contain/menuFile.html",
          "note": null
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/RenderPanel.java#L374",
          "note": "Print-to-PDF succeeded; default A4 output clipped the rightmost structure."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/RenderPanel.java#L392",
          "note": "Image-save attempt failed: no file type chosen; automation limitation."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/core/src/main/java/org/openscience/jchempaint/controller/ControllerHub.java#L234",
          "note": "Custom Java controller modules can receive editor mouse events."
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JChemPaint/jchempaint/blob/master/core/src/main/java/org/openscience/jchempaint/JChemPaintMenuBar.java",
          "note": "Add JChemPaintPanel(IChemModel) to Swing containers; getMenuForEmbedded supplies menus."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/JChemPaint/jchempaint/blob/1494ae4f90316e4fa215e7a125f9ffa7406c74e1/render/src/main/java/org/openscience/jchempaint/renderer/generators/HighlightAtomGenerator.java",
          "note": "Hover halos are temporary and omitted from SVG/PDF exports."
        }
      },
      "caveats": [
        "Official downloads are nightly builds; the JAR requires an installed Java runtime.",
        "Legacy browser applets are obsolete and absent from the current source.",
        "Bundled documentation has outdated export, transform, bond-tool and Java-version descriptions."
      ],
      "github": {
        "url": "https://github.com/JChemPaint/jchempaint",
        "stars": 149,
        "checkedOn": "2026-11-06",
        "firstCommit": "2008-03-21",
        "commits": 1584,
        "contributors": 18,
        "pushedAt": "2026-10-30T09:50:54Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "3.2.0",
        "canvas": "evidence/jchempaint/canvas.webp",
        "canvasLight": "evidence/jchempaint/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 165.58,
          "paclitaxelMb": 397.06,
          "baselineMb": null,
          "rssIdleMb": 246.5,
          "rssPaclitaxelMb": 377.55,
          "runs": 1,
          "processes": 1,
          "method": "macOS footprint phys_footprint summed over owned process tree; 10-second idle and post-render waits.",
          "note": "One manual GUI run; Direct Entry SMILES; focus workaround opened dialogs; MiB."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "follows system",
          "note": "Dark chrome observed; molecule entry failed, so dark capture remains unverified."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "jar",
        "artifact": "https://downloads.sourceforge.net/project/cdk/JChemPaint/3.2.0/jchempaint-3.2.0.jar",
        "ran": true,
        "failure": "Latest historical stable 3.3-1210 JAR returned 404; available archived stable 3.2.0 tested. GUI automation could not commit PNG/SVG format selection.",
        "downloadBytes": 6563317,
        "installedBytes": 6717440,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/jchempaint/simple.png",
            "note": "Kekule SMILES imported; default layout retained; cropped canvas, native SVG and MOL saved.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/jchempaint/complex.png",
            "note": "Kekule SMILES imported; overlapping auto-layout retained; cropped canvas, native SVG and MOL saved.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "3D SDF requires 2D coordinates; no rotatable 3D view.",
            "structure": null
          }
        ],
        "observations": [
          "Caffeine paste auto-layout shows aromatic ring bonds as single lines.",
          "Default heteroatoms are colored; hydrogens are largely implicit.",
          "Paclitaxel MOL displays wedge and hashed stereo bonds.",
          "Default PDF printing clips the rightmost template at the page boundary.",
          "The app explicitly requires 2D coordinates to display cholesterol.",
          "Current Kekule SMILES imported successfully for both caffeine and paclitaxel through Direct Entry.",
          "Paclitaxel SMILES auto-layout contains overlapping bonds and labels; no cleanup or repositioning was applied.",
          "Native SVG and MOL saving succeeded after keyboard format selection was committed with Enter.",
          "Generating SMILES from imported paclitaxel failed: Comparison method violates its general contract!"
        ]
      },
      "perf": null,
      "downloadBytes": 6563317,
      "references": [
        "https://jchempaint.github.io/",
        "https://github.com/JChemPaint/jchempaint"
      ]
    },
    {
      "id": "p32",
      "slug": "molsoft-html5-molecule-editor",
      "name": "Molsoft HTML5 Molecule Editor",
      "rank": 47,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://molsoft.com/lib/moledit.js",
        "note": "Molsoft-authored canvas loads libchem; third-party chemistry dependencies could not be established."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Molsoft ChemicalView canvas renderer",
        "language": "JavaScript",
        "source": "https://molsoft.com/lib/moledit.js"
      },
      "enginesChecked": true,
      "languageNote": "HTML and CSS provide embedding examples; native core language is undisclosed.",
      "video": null,
      "embedding": {
        "methods": [
          "script tag"
        ],
        "package": null,
        "limit": "Free academic/personal use; commercial licensing by inquiry",
        "how": "Load moledit.js and instantiate ChemicalView inside a div."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "WebAssembly and asm.js chemistry core"
        },
        {
          "language": "C",
          "role": "Embedded InChI library"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "Its documented purpose is embedding a structure-input editor in web pages, with MOL and SMILES exchange.",
      "summary": "An embeddable browser editor for sketching chemical structures and exchanging MOL, SMILES and InChI data.",
      "website": "https://molsoft.com/moledit.html",
      "repo": null,
      "docs": "https://molsoft.com/moledit.html",
      "vendor": "Molsoft LLC",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Proprietary; free for academic and personal use, commercial terms by inquiry.",
        "source": "https://molsoft.com/moledit.html"
      },
      "price": {
        "text": "Free for academic/personal use; commercial terms by inquiry (2026-11-05).",
        "source": "https://molsoft.com/moledit.html"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": true,
        "offline": false
      },
      "version": {
        "name": "v1.6.0",
        "date": null,
        "source": "https://molsoft.com/lib/moledit.js"
      },
      "engine": {
        "rendering": "HTML canvas (Canvas 2D)",
        "chemistry": "Molsoft Chemical / Module.chem library",
        "ui": "Vanilla JavaScript, HTML DOM and CSS",
        "source": "https://molsoft.com/lib/moledit.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Drew all three orders and changed a single bond.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the editor canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Cycled solid wedge, hashed wedge and wavy bond.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-stereo-bonds.webp",
            "caption": "A structure with solid and hashed wedge bonds."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Placed benzene and cyclopentane; other ring sizes visible.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-rings.webp",
            "caption": "Benzene and cyclopentane rings on the editor canvas."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Dragged a four-bond zigzag chain.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-chains.webp",
            "caption": "A four-bond zigzag chain on the editor canvas."
          }
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Ring tools visible; no broader template library found."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Element, formal-charge and isotope tools.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-atom-labels.webp",
            "caption": "Element, charge and isotope controls around a structure."
          }
        },
        "radicals": {
          "status": "partial",
          "evidence": "source",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "API controls calculated lone pairs; no manual placement tool."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Hover atoms or bonds and use element/bond keys."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Legacy-layout lasso and rotation; no flip or object-resize controls."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Placed a forward arrow; other arrow types not found.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-reaction-arrows.webp",
            "caption": "A forward arrow on the editor canvas."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved electron-pushing arrow control found."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Plain text annotations; fixed Arial without rich formatting."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "2D Cleanup/Depiction command regenerates coordinates.",
          "engine": {
            "library": "In-house (Molsoft libchem, WebAssembly; asm.js fallback); Molsoft conversion service (remote server fallback)",
            "source": "https://molsoft.com/lib/moledit.js"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "partial",
          "evidence": "source",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Legacy-layout R/S labels; no E/Z label rendering.",
          "engine": {
            "library": "In-house (Molsoft libchem, WebAssembly; asm.js fallback); R/S labels only",
            "source": "https://molsoft.com/lib/moledit.js"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Caffeine calculation returned C8H10N4O2 and 194.08.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-formula-mass.webp",
            "caption": "Caffeine structure with molecular formula and molecular weight."
          },
          "engine": {
            "library": "In-house (Molsoft libchem, WebAssembly; asm.js fallback)",
            "source": "https://molsoft.com/lib/moledit.js"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Caffeine calculation returned logP and PSA.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-properties.webp",
            "caption": "Caffeine properties including MolLogP and MolPSA."
          },
          "engine": {
            "library": "In-house (Molsoft MolLogP predictor, remote server in hosted property demo)",
            "source": "https://molsoft.com/mprop/"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Selected caffeine from dictionary suggestions and obtained structure.",
          "engine": {
            "library": "Molsoft dictionary web service; PubChem web service via Molsoft proxy (remote servers)",
            "source": "https://molsoft.com/lib/moledit.js"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Source exposes getIUPAC(); no toolbar naming control.",
          "engine": {
            "library": "In-house (Molsoft libchem, WebAssembly; asm.js fallback)",
            "source": "https://molsoft.com/lib/moledit.js"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "R-group labels and hydrogen, connectivity and ring query constraints."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Dictionary search returned caffeine and imported its structure.",
          "engine": {
            "library": "Molsoft dictionary web service; PubChem web service via Molsoft proxy (remote servers)",
            "source": "https://molsoft.com/lib/moledit.js"
          }
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view control found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Import and export dialogs offer no CDXML option."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsoft.com/moledit.html",
          "note": "MOL text import and export worked; SDF untested.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-mol-sdf.webp",
            "caption": "MOL text displayed in the editor export dialog."
          },
          "engine": {
            "library": "In-house (Molsoft libchem WebAssembly import, Chemical.toMol JavaScript export; MOL confirmed)",
            "source": "https://molsoft.com/lib/moledit.js"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsoft.com/moledit.html",
          "note": "Imported and exported both fixture SMILES.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-smiles.webp",
            "caption": "Import dialog accepts pasted MOL, SMILES or InChI."
          },
          "engine": {
            "library": "In-house (Molsoft libchem, WebAssembly; asm.js fallback); Molsoft conversion service (remote server fallback)",
            "source": "https://molsoft.com/lib/moledit.js"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "InChI paste/import and getInChi() export method.",
          "shot": {
            "image": "evidence/molsoft-html5-molecule-editor/f-inchi.webp",
            "caption": "Import dialog accepts pasted MOL, SMILES or InChI."
          },
          "engine": {
            "library": "InChI (WebAssembly, bundled in Molsoft libchem; asm.js fallback)",
            "source": "https://molsoft.com/lib/libchem2.wasm"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Export dialog offers MOL and SMILES text only."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export option found."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG export option found."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molsoft.com/moledit.html",
          "note": "Documented ChemicalView constructor, import and export methods."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molsoft.com/moledit.html",
          "note": "Load moledit.js and instantiate ChemicalView inside a div."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://molsoft.com/lib/moledit.js",
          "note": "Fixed green selection halos; MOL and SMILES exports omit them."
        }
      },
      "caveats": [
        "Commercial use requires contacting Molsoft; academic and personal use are free.",
        "Default embedding loads remote scripts; offline deployment is undocumented.",
        "API docs repeat getSmiles() for MOL export; source implements getMolfile()."
      ],
      "github": null,
      "hands": {
        "testedVersion": "v1.6.0",
        "canvas": "evidence/molsoft-html5-molecule-editor/canvas.webp",
        "canvasLight": "evidence/molsoft-html5-molecule-editor/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 121,
          "paclitaxelMb": 115,
          "baselineMb": 50.31,
          "rssIdleMb": 390.3,
          "rssPaclitaxelMb": 389.16,
          "runs": 3,
          "processes": 4,
          "method": "Fresh headless Chromium; summed process-tree phys_footprint, MiB; three-run medians.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://molsoft.com/mprop/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molsoft-html5-molecule-editor/simple.png",
            "note": "Current SMILES imported; canvas captured and MOL and SMILES text saved.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molsoft-html5-molecule-editor/complex.png",
            "note": "Current SMILES imported; canvas captured and MOL and SMILES text saved.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": null,
            "image": null,
            "note": "No rotatable 3D view found in the editor interface.",
            "structure": null
          }
        ],
        "observations": [
          "SMILES imports produced centered, fitted 2D depictions without cleanup.",
          "Atoms are colored by element in the default rendering.",
          "Exported fixture SMILES matched the inputs by isomeric graph comparison.",
          "The export dialog displays MOL or SMILES text, without image download."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 1443,
        "transferBytes": 1451988
      },
      "downloadBytes": null,
      "references": [
        "https://molsoft.com/moledit.html"
      ]
    },
    {
      "id": "p87",
      "slug": "molecule-clipboard",
      "name": "Molecule Clipboard",
      "rank": 48,
      "builtOn": {
        "relation": "wrapper",
        "editor": "JSME",
        "libraries": [
          "JSME",
          "RDKit"
        ],
        "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L1156",
        "note": "Mounts JSME directly; RDKit handles depiction, identifiers, properties, and conversions."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "JSME editor; RDKit MolDraw2D depiction/export",
        "language": "Java (compiled to JavaScript); C++ (WebAssembly)",
        "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html"
      },
      "enginesChecked": true,
      "languageNote": "Inline JavaScript implements behavior; HTML/CSS provide presentation.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Standalone HTML app; no documented embedding interface."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Application logic and export handling"
        }
      ],
      "thirdParty": {
        "summary": "BSD-3-Clause/Apache-2.0 components; legacy InChI-Trust Licence 1.0 copyleft (InChI 1.05); OFL-1.1 Telex font (font-only share-alike).",
        "source": "https://github.com/IUPAC-InChI/InChI/blob/v1.05/INCHI-1-SRC/LICENCE",
        "notice": null,
        "libraries": [
          {
            "name": "JSME",
            "license": "BSD-3-Clause",
            "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/main/dist/license.txt"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its JSME structure-input editor and RDKit inspector export individual structures rather than compose publication drawing documents.",
      "summary": "Browser tool for drawing, editing, inspecting, and sharing individual molecules.",
      "website": "https://ruibin-liu.github.io/molecule-clipboard/",
      "repo": "https://github.com/Ruibin-Liu/molecule-clipboard",
      "docs": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/README.md",
      "vendor": "Ruibin Liu",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT project; JSME and RDKit have separate BSD licenses.",
        "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/LICENSE"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": true,
        "offline": false
      },
      "version": {
        "name": "v0.4.0",
        "date": "2026-01-05",
        "source": "https://github.com/Ruibin-Liu/molecule-clipboard/releases/tag/v0.4.0"
      },
      "engine": {
        "rendering": "JSME SVG editor; RDKit.js SVG depiction/export; HTML Canvas 2D for PNG.",
        "chemistry": "RDKit.js (WebAssembly) and JSME",
        "ui": "Plain HTML/CSS/JavaScript with JSME JSApplet",
        "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/dist/release_notes.txt",
          "note": "Single, double and triple bonds drawn in editor.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-bonds-core.webp",
            "caption": "Single, double and triple bond tools in the editor."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/dist/release_notes.txt",
          "note": "Imported stereochemistry rendered wedges and hashes; manual attempt inconclusive.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-stereo-bonds.webp",
            "caption": "Molecular structure with solid and hashed wedge bonds."
          }
        },
        "special-bonds": {
          "status": "no",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/release_notes.txt",
          "note": "Bundled version predates JSME coordination-bond support."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/help.html",
          "note": "Aromatic ring inserted; multiple ring sizes visible.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-rings.webp",
            "caption": "Ring tools in the editor toolbar."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/help.html",
          "note": "JSME chain drawing tool.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-chains.webp",
            "caption": "Zigzag chain on the editor canvas."
          }
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/help.html",
          "note": "Functional-group menu inserted a carboxyl group."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/release_notes.txt",
          "note": "JSME supports charges, isotopic atoms and X atom entry.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-atom-labels.webp",
            "caption": "Element palette and charge control in the editor."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/release_notes.txt",
          "note": "Hover shortcuts change atom types and add bonds."
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No reaction-arrow tools found in editor."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved-arrow tools found in editor."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L783-L818",
          "note": "Only fixed-style molecule-name captions; no subscript or superscript controls."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L700-L720",
          "note": "Applying edits regenerates layout through SMILES.",
          "engine": {
            "library": "RDKit.js (WebAssembly)",
            "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L700-L718"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L700-L720",
          "note": "Invalid molecules trigger parsing or validity errors.",
          "engine": {
            "library": "RDKit.js (WebAssembly)",
            "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L708-L716"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L837-L879",
          "note": "Molecular weight displayed; no dedicated formula field found.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-formula-mass.webp",
            "caption": "Caffeine structure and molecular weight in the properties panel."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly; molecular weights only)",
            "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L837-L879"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L837-L845",
          "note": "Displays cLogP, TPSA and other properties.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-properties.webp",
            "caption": "Caffeine structure with cLogP and TPSA values."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly)",
            "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L837-L845"
          }
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Entering caffeine returned Unable to parse molecule."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L730-L780",
          "note": "SMILES inputs received generated identifiers, not systematic names."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L1156-L1164",
          "note": "Query drawing enabled in embedded JSME."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D model view control found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "CDXML sample rejected; no CDXML export command found."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L824-L960",
          "note": "MOL block imported; SDF downloaded.",
          "engine": {
            "library": "RDKit.js (WebAssembly); In-house SDF record framing",
            "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L783-L960"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L700-L720",
          "note": "SMILES input produced canonical SMILES output.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-smiles.webp",
            "caption": "Canonical SMILES and InChI in the representations panel."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly); JSME (Java compiled to JavaScript, editor SMILES)",
            "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L832-L835",
          "note": "InChI and InChIKey displayed for caffeine.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-inchi.webp",
            "caption": "InChI in the representations panel."
          },
          "engine": {
            "library": "RDKit.js (WebAssembly)",
            "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L832-L835"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L992-L1001",
          "note": "Downloaded SVG files contain vector paths.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-svg-export.webp",
            "caption": "Structure preview and Download SVG button."
          }
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export command found."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L1004-L1077",
          "note": "Downloaded 1200 by 1200 PNG; no resolution controls found.",
          "shot": {
            "image": "evidence/molecule-clipboard/f-png-export.webp",
            "caption": "Structure preview and Download PNG button."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard#usage",
          "note": "Standalone HTML app; no documented embedding interface."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/Ruibin-Liu/molecule-clipboard/blob/6e00a7d2d79a484f152b3e4dac5eb61f3ff205f6/index.html#L1160",
          "note": "JSME atom backgrounds work in editor; app image exports omit them."
        }
      },
      "caveats": [
        "Single-molecule editor and inspector; no document composition workflow.",
        "README claims offline capability, but JSME and RDKit load from CDN.",
        "Applying edits regenerates layout from SMILES, discarding manual coordinates."
      ],
      "github": {
        "url": "https://github.com/Ruibin-Liu/molecule-clipboard",
        "stars": 3,
        "checkedOn": "2026-11-06",
        "firstCommit": "2025-12-28",
        "commits": 27,
        "contributors": 2,
        "pushedAt": "2026-01-04T15:04:06Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "6e00a7d",
        "canvas": "evidence/molecule-clipboard/canvas.webp",
        "canvasLight": "evidence/molecule-clipboard/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 505.9,
          "paclitaxelMb": 535.9,
          "baselineMb": 422.9,
          "rssIdleMb": 1125,
          "rssPaclitaxelMb": 1168.7,
          "runs": 3,
          "processes": 9,
          "method": "Median of three fresh Playwright Chromium trees; summed physical footprints and crash handlers.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://ruibin-liu.github.io/molecule-clipboard/",
        "ran": true,
        "failure": null,
        "downloadBytes": 44470,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molecule-clipboard/simple.svg",
            "note": "Canonical SMILES saved separately.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molecule-clipboard/complex.svg",
            "note": "Canonical SMILES saved separately.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No rotatable 3D view found; skipped.",
            "structure": null
          }
        ],
        "observations": [
          "Default depictions use colored heteroatoms and autogenerated molecule captions.",
          "The SVG exports include the autogenerated captions.",
          "Hosted HTML is 44,470 bytes; CDN dependencies are additional.",
          "The page displayed RDKit 2026.09.1; application build matches commit 6e00a7d."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 117,
        "transferBytes": 2107704
      },
      "downloadBytes": 44470,
      "references": [
        "https://github.com/Ruibin-Liu/molecule-clipboard",
        "https://ruibin-liu.github.io/molecule-clipboard/",
        "https://github.com/Ruibin-Liu/molecule-clipboard/blob/main/README.md"
      ]
    },
    {
      "id": "p75",
      "slug": "molglidex",
      "name": "MolGLideX",
      "rank": 49,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "CDK"
        ],
        "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/ui/EditorPanel.kt#L107-L130",
        "note": "Custom canvas; CDK supplies chemistry and 2D layout."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "MolGLideX Graphics2D bond/label renderer",
        "language": "Kotlin",
        "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/model/UIDataBuilder.kt#L99"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-2.0; experimental prototype",
        "how": "Desktop application; no supported embedding interface documented."
      },
      "otherLanguages": [
        {
          "language": "Java",
          "role": "CDK chemistry and Swing UI"
        },
        {
          "language": "C",
          "role": "Native InChI through JNA-InChI"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-2.1-or-later (CDK); other direct libraries use MIT or Apache-2.0.",
        "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/pom.xml",
        "notice": null,
        "libraries": [
          {
            "name": "Chemistry Development Kit",
            "license": "LGPL-2.1-or-later",
            "source": "https://github.com/cdk/cdk/blob/main/pom.xml"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It draws standalone 2D chemical figures and exports vectors, but remains an explicitly unstable prototype.",
      "summary": "An experimental desktop editor for drawing 2D chemical structures and reaction mechanisms.",
      "website": "https://molglide.com/",
      "repo": "https://github.com/JCox06/MolGLideX",
      "docs": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/readme.md",
      "vendor": "Jacob Cox",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-2.0",
        "text": "GNU General Public License version 2.",
        "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/JCox06/MolGLideX/releases/tag/0.0.3"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "0.0.3",
        "date": "2026-09-16",
        "source": "https://github.com/JCox06/MolGLideX/releases/tag/0.0.3"
      },
      "engine": {
        "rendering": "Java Graphics2D; Apache Batik SVGGraphics2D for SVG output",
        "chemistry": "Chemistry Development Kit (CDK)",
        "ui": "Java Swing with FlatLaf and Modern Docking",
        "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/readme.md"
      },
      "languages": [
        "Kotlin"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/SwingActions.kt#L143-L267",
          "note": "Bond change attempted; pointer targeting prevented a verified edit."
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/model/chemengine/MgxBond.kt#L61-L65",
          "note": "Wedge action attempted; targeting unavailable; hash command also visible."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/model/UIDataBuilder.kt#L296-L362",
          "note": "Side flipping works for rings; centering is automatic."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/EditMode.kt#L26-L29",
          "note": "Benzene inserted from toolbar at default style.",
          "shot": {
            "image": "evidence/molglidex/f-rings.webp",
            "caption": "Benzene ring and ring tools, with an overlapping CH₄ label."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Only four simple ring tools found; no broader library."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/readme.md#features-and-todo-list",
          "note": "Chemically understood custom group labels remain unfinished."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/model/chemengine/MgxAtom.kt",
          "note": "Element buttons present; carbon inserted; isotopes unverified.",
          "shot": {
            "image": "evidence/molglidex/f-atom-labels.webp",
            "caption": "CH₄ label overlapping a benzene ring on the canvas."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/SwingActions.kt#L84-L255",
          "note": "Displayed shortcuts did not respond through computer-use key input."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/control/tool/SelectTool.kt#L39-L110",
          "note": "Select tool clicked; drag failed in computer-use tooling."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/readme.md#features-and-todo-list",
          "note": "Arrow tool clicked; placement required dragging unavailable through computer-use."
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/readme.md#features-and-todo-list",
          "note": "Arrowhead action attempted; curve dragging blocked by computer-use input."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/readme.md#features-and-todo-list",
          "note": "Custom text boxes remain unfinished."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/model/chemengine/CDKContainerWrapper.kt#L201-L213",
          "note": "CDK regenerates coordinates and normalizes bond lengths.",
          "engine": {
            "library": "CDK (Java StructureDiagramGenerator and GeometryUtil)",
            "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/model/chemengine/CDKContainerWrapper.kt#L201-L213"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/AppConfig.kt",
          "note": "Editor font persists; bond dimensions are fixed."
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/readme.md#features-and-todo-list",
          "note": null,
          "engine": {
            "library": "CDK (Java CDKAtomTypeMatcher and CDKHydrogenAdder); In-house (Kotlin error markers)",
            "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/model/chemengine/CDKContainerWrapper.kt#L165-L187"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/readme.md#features-and-todo-list",
          "note": "Scratch selection attempted; no computed formula or mass obtained.",
          "engine": {
            "library": "CDK (Java MolecularFormulaManipulator and AtomContainerManipulator)",
            "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/model/chemengine/CDKContainerWrapper.kt#L301-L309"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name input command found in inspected menus."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in inspected menus."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/EditMode.kt#L23",
          "note": "R-label insertion only; no R-group definitions or atom lists."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D command in inspected menus or toolbar."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML entry in inspected Open or Save formats."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Opening MOL fixtures left both new documents empty."
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/MainController.kt#L112-L156",
          "note": "SMILES inputs remained empty; canonical output command produced no verified text.",
          "engine": {
            "library": "CDK (Java SmilesGenerator, canonical output only)",
            "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/model/chemengine/CDKContainerWrapper.kt#L97-L100"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/MainController.kt#L121-L135",
          "note": "Copies generated InChI to the clipboard.",
          "engine": {
            "library": "CDK (Java InChIGeneratorFactory) with native InChI through JNA-InChI",
            "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/model/chemengine/CDKContainerWrapper.kt#L102-L114"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/readme.md#features-and-todo-list",
          "note": "Export attempt inconclusive: computer-use could not establish a selection."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF command in File menu or Save formats."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG command in File menu or Save formats."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/readme.md",
          "note": "Desktop application; no supported embedding interface documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/JCox06/MolGLideX/blob/a8de273e9c5d5405b7f865f185b8fb4f48906222/src/main/kotlin/uk/co/jcox/molglide/editor/ui/EditorPanel.kt#L107-L123",
          "note": "Selection backgrounds exist; SVG export suppresses them."
        }
      },
      "caveats": [
        "Unstable prototype, explicitly not intended for daily use; some exposed commands remain stubs.",
        "Release is 0.0.3, while README calls it forthcoming and the app displays ALPHA-0.0.2.",
        "Custom text and group labels are unfinished; SVG transfer into Word is reported broken."
      ],
      "github": {
        "url": "https://github.com/JCox06/MolGLideX",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-08-11",
        "commits": 90,
        "contributors": 1,
        "pushedAt": "2026-10-03T17:40:39Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "ALPHA-0.0.2",
        "canvas": "evidence/molglidex/canvas.webp",
        "canvasLight": "evidence/molglidex/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 340.91,
          "paclitaxelMb": null,
          "baselineMb": null,
          "rssIdleMb": 242.12,
          "rssPaclitaxelMb": null,
          "runs": 1,
          "processes": 1,
          "method": "One manual run; footprint phys_footprint summed over ps descendant tree; MiB (bytes/1048576).",
          "note": "Published File > Load MOL route left canvas empty; paclitaxel could not load."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Import failed; simple benzene ring drawn on fixed light canvas."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "zip",
        "artifact": "https://github.com/JCox06/MolGLideX/releases/download/0.0.3/MolGLide-0.0.3.zip",
        "ran": true,
        "failure": "Benchmark incomplete: SMILES and MOL file-opening attempts left empty documents. Computer-use coordinate and drag input failed, preventing reliable active-canvas selection, most edits, and exports. This is not a native-library launch failure.",
        "downloadBytes": 51933317,
        "installedBytes": 274132992,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "SMILES and MOL open attempts left the new document empty.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "SMILES and MOL open attempts left the new document empty.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "No 3D view found in inspected menus or toolbar; skipped.",
            "structure": null
          }
        ],
        "observations": [
          "Scratch benzene has black bonds on a light gray canvas.",
          "Default carbon insertion displays CH4.",
          "Fixture opening attempts left empty documents.",
          "App reports ALPHA-0.0.2; downloaded prerelease is 0.0.3.",
          "Drawing fonts, widths, colors, and theme were unchanged."
        ]
      },
      "perf": null,
      "downloadBytes": 51933317,
      "references": [
        "https://github.com/JCox06/MolGLideX",
        "https://github.com/JCox06/MolGLideX/blob/master/readme.md"
      ]
    },
    {
      "id": "p133",
      "slug": "sketchscape",
      "name": "SketchScape",
      "rank": 50,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit"
        ],
        "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L394-L475",
        "note": "Custom SVG editor; RDKit handles chemistry and 2D cleanup."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "SketchScape SVG renderer",
        "language": "JavaScript",
        "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L394-L528"
      },
      "enginesChecked": true,
      "languageNote": "HTML/CSS provide interface markup and styling.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "No license stated",
        "how": "Standalone local server; no supported editor embedding documented."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "Chemistry backend and HTTP API"
        }
      ],
      "thirdParty": {
        "summary": "Declared dependencies: BSD-3-Clause (RDKit, NumPy, Uvicorn), MIT (FastAPI), Apache-2.0 (python-multipart); transitive terms unconfirmed.",
        "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/environment.yml",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A standalone 2D editor with structure cleanup, reaction arrows, captions and PNG output can produce simple chemical figures.",
      "summary": "A local browser editor for drawing molecules and reactions, with basic naming and rotatable 3D models.",
      "website": "https://github.com/saparicioubu/sketchscape",
      "repo": "https://github.com/saparicioubu/sketchscape",
      "docs": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md",
      "vendor": "Santiago Aparicio, University of Burgos",
      "license": {
        "kind": "unclear",
        "spdx": null,
        "text": "Public source; no license stated.",
        "source": "https://github.com/saparicioubu/sketchscape/tree/34b18f59f5b398abe654fb6da40cac7022e6c961"
      },
      "price": {
        "text": "Not stated as of 2026-11-05",
        "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/saparicioubu/sketchscape/releases"
      },
      "engine": {
        "rendering": "SVG for 2D drawing; HTML Canvas 2D for PNG export and 3D viewing",
        "chemistry": "RDKit; in-house rule-based naming",
        "ui": "Vanilla JavaScript, HTML and CSS; FastAPI backend",
        "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md#what-it-does"
      },
      "languages": [
        "JavaScript",
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md#what-it-does",
          "note": "Drew a bond and cycled single, double, triple.",
          "shot": {
            "image": "evidence/sketchscape/f-bonds-core.webp",
            "caption": "Bond order controls beside a benzene drawing."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L441-L469",
          "note": "Wedge and dashed bonds work; no wavy tool visible."
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/mol_builder.py#L21-L27",
          "note": "Only single, double and triple bond orders are supported."
        },
        "double-bond-side": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L463-L474",
          "note": "Double bonds always use fixed centered parallel strokes."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md#what-it-does",
          "note": "Benzene stamp worked; other ring buttons visible.",
          "shot": {
            "image": "evidence/sketchscape/f-rings.webp",
            "caption": "Ring template buttons beside a benzene drawing."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md#what-it-does",
          "note": "Click-based editor; chains cannot be drawn by dragging."
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Only four simple ring templates visible."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/app.py#L31-L47",
          "note": "Element labels editable; charges backend-only; no isotope field.",
          "shot": {
            "image": "evidence/sketchscape/f-atom-labels.webp",
            "caption": "Element buttons and an Other element field."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L79-L88",
          "note": "Keyboard handler is a no-op; editing uses mouse clicks."
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L530-L538",
          "note": "Drew forward arrow; other arrow types not visible."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow control visible."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/app.py#L145-L160",
          "note": "Atom-economy requests store reactant and product SMILES with coefficients."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L540-L548",
          "note": "Plain fixed-font labels; no formatting, subscripts or superscripts."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md#what-it-does",
          "note": null,
          "shot": {
            "image": "evidence/sketchscape/f-cleanup.webp",
            "caption": "Edit panel with a Clean up 2D structure button."
          },
          "engine": {
            "library": "RDKit (Python, local server)",
            "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/mol_builder.py#L142-L168"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md#what-it-does",
          "note": null,
          "shot": {
            "image": "evidence/sketchscape/f-color.webp",
            "caption": "Color picker with instructions for coloring atoms and bonds."
          }
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/mol_builder.py#L122-L139",
          "note": "Structure computation reports valence and aromaticity errors.",
          "engine": {
            "library": "RDKit (Python sanitization); In-house (error reporting)",
            "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/mol_builder.py#L84-L89"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md#what-it-does",
          "note": "Benzene returned C6H6 and 78.11 g/mol.",
          "shot": {
            "image": "evidence/sketchscape/f-formula-mass.webp",
            "caption": "Computed benzene formula and molecular weight."
          },
          "engine": {
            "library": "RDKit (Python)",
            "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/mol_builder.py#L92-L119"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L639-L650",
          "note": "Ethanol produced SMILES, but did not populate canvas.",
          "engine": {
            "library": "In-house (Python naming rules); RDKit (Python SMILES validation)",
            "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/naming.py#L403-L421"
          }
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md#what-it-does",
          "note": "Benzene named correctly; interface states limited scope.",
          "shot": {
            "image": "evidence/sketchscape/f-structure-to-name.webp",
            "caption": "Naming panel displays benzene as the drawn structure’s name."
          },
          "engine": {
            "library": "In-house (Python naming rules); RDKit (Python molecular graph)",
            "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/naming.py#L52-L64"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md#what-it-does",
          "note": "Generated and rotated benzene ball-and-stick model.",
          "shot": {
            "image": "evidence/sketchscape/f-model-3d.webp",
            "caption": "3D structure panel showing part of a ball-and-stick model."
          },
          "engine": {
            "library": "RDKit (Python conformers and MMFF); In-house (JavaScript Canvas viewer)",
            "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/coords3d.py#L35-L79"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No file import or export controls visible."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure-file import or export controls visible."
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/mol_builder.py#L171-L192",
          "note": "Computed SMILES displayed; pasted SMILES did not import.",
          "shot": {
            "image": "evidence/sketchscape/f-smiles.webp",
            "caption": "Computed SMILES and identifiers for benzene."
          },
          "engine": {
            "library": "RDKit (Python)",
            "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/mol_builder.py#L171-L193"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/README.md#what-it-does",
          "note": "Computed InChI and InChIKey for benzene.",
          "shot": {
            "image": "evidence/sketchscape/f-inchi.webp",
            "caption": "Computed InChI and InChIKey for benzene."
          },
          "engine": {
            "library": "RDKit (Python; InChI and InChIKey export)",
            "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/backend/mol_builder.py#L103-L109"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Image export offers PNG only."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Image export offers PNG only."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L780-L811",
          "note": "Saved viewport-sized 843 by 897 PNG; no resolution controls.",
          "shot": {
            "image": "evidence/sketchscape/f-png-export.webp",
            "caption": "PNG export controls and saved-file confirmation."
          }
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L815-L831",
          "note": "Clipboard export is raster PNG, without editable chemical data."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/saparicioubu/sketchscape/blob/master/README.md",
          "note": "Standalone local server; no supported editor embedding documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/saparicioubu/sketchscape/blob/34b18f59f5b398abe654fb6da40cac7022e6c961/static/app.js#L394-L548",
          "note": "Colors change atom glyphs and bond strokes; backgrounds match canvas."
        }
      },
      "caveats": [
        "Public source has no stated license or packaged release.",
        "PNG uses viewport resolution; chemistry calculations discard drawn wedge/hash stereochemistry.",
        "Naming is limited; code lacks some claimed locant, strict-parser and stereodescriptor-refusal checks."
      ],
      "github": {
        "url": "https://github.com/saparicioubu/sketchscape",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-08-07",
        "commits": 1,
        "contributors": 1,
        "pushedAt": "2026-08-07T23:35:05Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "1.0",
        "canvas": null,
        "canvasLight": null,
        "canvasDark": "evidence/sketchscape/canvas-dark.webp",
        "memory": {
          "idleMb": 542.89,
          "paclitaxelMb": null,
          "baselineMb": 462.4,
          "rssIdleMb": 1069.94,
          "rssPaclitaxelMb": null,
          "runs": 3,
          "processes": 10,
          "method": "Three-run median; Chromium tree, detached crashpad, local backend phys_footprint sums (MiB); browser-only baseline.",
          "note": "SMILES paste produced zero atoms/bonds; README advertises typed SMILES; editor provides no SMILES input."
        },
        "themes": {
          "light": false,
          "dark": true,
          "how": "fixed",
          "note": "Paclitaxel import failed; benzene ring placed using built-in template."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://github.com/saparicioubu/sketchscape.git",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": 134914048,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "Paste did not populate canvas; no MOL import control.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "Paste did not populate canvas; no MOL import control.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "No SMILES or SDF import control for cholesterol.",
            "structure": null
          }
        ],
        "observations": [
          "Default drawing uses pale lines on a near-black canvas.",
          "Clear canvas left earlier computed results and 3D model visible.",
          "README mentions typed SMILES; the editor exposes no SMILES input.",
          "Git clone transfer size was unavailable; installed size includes source and Python environment.",
          "Supplementary benzene screenshots document the hand-drawn feature test."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/saparicioubu/sketchscape",
        "https://github.com/saparicioubu/sketchscape",
        "https://github.com/saparicioubu/sketchscape/blob/master/README.md"
      ]
    },
    {
      "id": "p77",
      "slug": "chemsema",
      "name": "ChemSema",
      "rank": 51,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "InChI"
        ],
        "ported": [
          "RDKit SMILES grammar"
        ],
        "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/THIRD_PARTY_NOTICES.md#L3-L46",
        "note": "Custom editor; RDKit-derived SMILES grammar reimplemented in Rust; no RDKit runtime."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "ChemSema molecular renderer",
        "language": "Rust",
        "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-engine/src/render_objects.rs#L180-L245"
      },
      "enginesChecked": true,
      "languageNote": "Other languages serve presentation, build tooling, packaging, and generated bindings.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Office OLE opens a separate editor; no embedded editor documented."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Editor interface and SVG DOM display"
        },
        {
          "language": "C",
          "role": "Bundled official InChI chemistry library"
        }
      ],
      "thirdParty": {
        "summary": "MIT InChI and BSD-3-Clause RDKit-derived code; Windows installer bundles proprietary Microsoft WebView2.",
        "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/apps/chemsema-desktop/src-tauri/tauri.conf.json",
        "notice": "https://github.com/dreamlovesu32/chemsema/blob/main/NOTICE",
        "libraries": [
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its standalone editor creates editable 2D chemical figures and reaction schemes with vector export and Office integration.",
      "summary": "Chemical drawing editor for structures, reaction schemes, ChemDraw file exchange, and editable Office documents.",
      "website": "https://dreamlovesu32.github.io/chemsema/",
      "repo": "https://github.com/dreamlovesu32/chemsema",
      "docs": "https://github.com/dreamlovesu32/chemsema/blob/main/README.md#design-documents",
      "vendor": "Jiajun Zhang",
      "license": {
        "kind": "open-source",
        "spdx": "Apache-2.0",
        "text": "Apache License 2.0; bundled components retain their own licenses.",
        "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/README.md#license"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v1.0.0-beta.8",
        "date": "2026-07-15",
        "source": "https://github.com/dreamlovesu32/chemsema/releases/tag/v1.0.0-beta.8"
      },
      "engine": {
        "rendering": "Custom Rust render primitives rendered as SVG DOM/SVG files; Win32 GDI EMF; resvg/tiny-skia CLI PNG.",
        "chemistry": "In-house Rust chemistry; bundled IUPAC InChI 1.07.5.",
        "ui": "JavaScript, HTML and CSS; Tauri 2/WebView2 on Windows.",
        "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/README.md#design-details"
      },
      "languages": [
        "Rust",
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L722-L748",
          "note": "Drew all three orders; changing existing bonds not checked."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L734-L748",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/chemsema/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds in a structure."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L853-L880",
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L799-L823",
          "note": "Benzene placed; ring sizes three through eight available."
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L810-L823",
          "note": "Dedicated chair cyclohexane and flipped chair tools."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-engine/src/engine/templates.rs#L905-L935",
          "note": null
        },
        "templates": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/template-library-rules.zh-CN.md#L21-L34",
          "note": "Chairs included; larger libraries require locally extracted ChemDraw assets."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/abbreviation-recognition-rules.md#L75-L138",
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/atom-property-editing-rules.zh-CN.md#L23-L35",
          "note": null
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/charge-radical-symbol-rules.md#symbol-set",
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/viewer/editor_bindings.js#L599-L660",
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/viewer/editor_pointer_controller.js#L1480-L1494",
          "note": "Freehand selection, rotation, flipping, and resizing.",
          "shot": {
            "image": "evidence/chemsema/f-selection-tools.webp",
            "caption": "Selection and flip controls in the toolbar."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L1054-L1080",
          "note": "Drew forward and equilibrium arrows."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L1054-L1115",
          "note": "Drew a curved arrow; half-head options visible."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/logical-object-native-model.zh-CN.md#L18-L32",
          "note": "Native scheme and step data retain reactants and products."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/logical-object-native-model.zh-CN.md#L105-L118",
          "note": "Manual mappings through Logical Objects JSON fields."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L1368-L1388",
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L1130-L1178",
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L1220-L1280",
          "note": null,
          "shot": {
            "image": "evidence/chemsema/f-shapes.webp",
            "caption": "Bracket and circle tools beside the drawing canvas."
          }
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L1543-L1567",
          "note": null,
          "shot": {
            "image": "evidence/chemsema/f-align.webp",
            "caption": "Alignment and distribution controls in the toolbar."
          }
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L1583-L1615",
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L1681-L1703",
          "note": "ACS Document 1996 preset."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/main/docs/chemsema-cli-guide.md",
          "note": "Saved document defaults are restored by later editing commands."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/cli-gui-parity-checklist.md#L38",
          "note": null
        },
        "pages": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/document-layout-rules.zh-CN.md#L83-L90",
          "note": "Paper sizes, page counts, and automatic pagination."
        },
        "pictures": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/viewer/image_import_host.js#L4-L16",
          "note": null
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chromatography-plate-rules.zh-CN.md#L3-L18",
          "note": "Editable native TLC plates, gel plates, and tables."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/charge-radical-symbol-rules.md#relationship-to-label-validity",
          "note": null,
          "engine": {
            "library": "In-house (Rust live element valence and label validation)",
            "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-engine/src/engine/text_edit/labels.rs#L1977-L2015"
          }
        },
        "stereo-perception": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-engine/src/engine/chemistry.rs#L628-L647",
          "note": "R/S from wedges; E/Z requires imported directional semantics.",
          "engine": {
            "library": "In-house (Rust chemsema-chemistry CIP and stereo analysis)",
            "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-chemistry/src/cip.rs#L29-L65"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/README.md#L200-L201",
          "note": "Caffeine selection showed C8H10N4O2 and formula weight 194.19.",
          "engine": {
            "library": "In-house (Rust formula, average mass and exact mass calculations)",
            "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-engine/src/engine/selection_summary.rs#L78-L144"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name-to-structure command found."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Chemical property dialog requires a manually entered name."
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/spectrum-object-rules.zh-CN.md#L76-L84",
          "note": "Generated a proton NMR spectrum for a drawn bond.",
          "engine": {
            "library": "ChemSema NMR (bundled WebAssembly via JavaScript adapter)",
            "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/viewer/nmr_prediction_provider.js#L1-L26"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/atom-query-editing-rules.zh-CN.md#L5-L20",
          "note": "Editable element lists, generic lists, and atom-query properties."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/logical-object-native-model.zh-CN.md#L81-L89",
          "note": "Native repeat semantics, attachments, crossing bonds, and repeat-unit expansion."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No rotatable 3D view found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L258-L269",
          "note": "Imported simple CDXML; Save As produced CCJZ.",
          "engine": {
            "library": "In-house (Rust CDXML reader and writer using quick-xml)",
            "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-engine/src/cdxml.rs#L363-L390"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L258-L269",
          "note": null,
          "engine": {
            "library": "In-house (Rust CDX binary reader and writer through CDXML conversion)",
            "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-engine/src/cdx.rs#L33-L77"
          }
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-engine/src/sdf.rs#L165-L283",
          "note": "SDF opened; MOL rejected; no MOL export found.",
          "engine": {
            "library": "In-house (Rust V2000 molblock/SDF reader and writer)",
            "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-engine/src/sdf.rs#L165-L283"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#17-import-smiles-and-copy-chemical-identifiers",
          "note": "SMILES copy command reported success; SMILES files failed to open.",
          "engine": {
            "library": "Ported from RDKit (grammar and lexer reimplemented in Rust; ChemSema parser and writer)",
            "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-chemistry/src/smiles.rs#L1-L10"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#17-import-smiles-and-copy-chemical-identifiers",
          "note": "Local InChI/InChIKey generation; dative bonds rejected.",
          "engine": {
            "library": "IUPAC InChI 1.07.5 (statically linked C for native targets; official WebAssembly in browser)",
            "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/crates/chemsema-engine/src/engine/chemistry.rs#L345-L379"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L258-L269",
          "note": null
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/viewer/export_preview.js#L5-L54",
          "note": "PDF pages contain rasterized JPEG images, lacking vector artwork."
        },
        "png-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#L258-L269",
          "note": "CLI export supports adjustable scale and pixel dimensions."
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/clipboard-interoperability.md",
          "note": "Editable paste from ChemDraw; reverse clipboard compatibility remains unverified."
        },
        "office": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/apps/chemsema-office/src/windows_office/server.rs#L309-L388",
          "note": "Windows OLE objects support editing and storage write-back; beta."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/viewer/engine/chemsema_engine.d.ts#L63-L99",
          "note": "Typed WASM API loads documents, executes commands, and renders SVG."
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/chemsema-cli-guide.md#2-file-commands",
          "note": null
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/README.md#object-grounded-agent-cli",
          "note": "Documented agent CLI with selectors, bundles, transactions, and JSONL sessions."
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/windows-desktop-office-architecture.md#L415-L420",
          "note": "Office OLE opens a separate editor; no embedded editor documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/apps/chemsema-office/src/windows_office/server.rs#L309-L388",
          "note": "Windows OLE server supports embedded-object editing and storage write-back."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/dreamlovesu32/chemsema/blob/8e6f995eae65d426b5cffc9446b772ec0ab7eaee/docs/molecular-coloring-rules.zh-CN.md",
          "note": "Highlight command adds colored atom circles and bond bands."
        }
      },
      "caveats": [
        "Beta; some architecture notes lag implemented multipage layout and Office write-back.",
        "Native desktop/OLE requires Windows; Linux is CLI-only; current source is newer than the released installer.",
        "Extended template libraries require assets from a locally licensed ChemDraw installation."
      ],
      "github": {
        "url": "https://github.com/dreamlovesu32/chemsema",
        "stars": 6,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-06-15",
        "commits": 609,
        "contributors": 2,
        "pushedAt": "2026-09-26T03:27:14Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "Web build 8e6f995 (2026-09-…",
        "canvas": "evidence/chemsema/canvas.webp",
        "canvasLight": "evidence/chemsema/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 583.93,
          "paclitaxelMb": 580.85,
          "baselineMb": 387.04,
          "rssIdleMb": 1211.19,
          "rssPaclitaxelMb": 1215.66,
          "runs": 3,
          "processes": 9,
          "method": "Three Chromium runs; summed physical footprints including detached crash handlers.",
          "note": "SDF imported; previously observed overlapping bonds and missing atom labels."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "SDF import omits atom labels and overlaps bonds."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://dreamlovesu32.github.io/chemsema/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "sdf",
            "image": null,
            "note": "SDF rendered without atom labels; SMILES and MOL imports failed.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "sdf",
            "image": null,
            "note": "SDF rendered without atom labels and overlapped; SMILES and MOL imports failed.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "No 3D view found; fixture not opened.",
            "structure": null
          }
        ],
        "observations": [
          "Tested the hosted build in an isolated native WebKit host.",
          "SMILES and MOL files produced JSON parse errors; SDF files opened.",
          "SDF drawings projected 3D coordinates and omitted visible atom labels in WebKit.",
          "The fallback PNGs are crops of the test host window, not native exports.",
          "Save As downloaded the native CCJZ format."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 119,
        "transferBytes": 6394662
      },
      "downloadBytes": 215490204,
      "references": [
        "https://github.com/dreamlovesu32/chemsema",
        "https://dreamlovesu32.github.io/chemsema/"
      ]
    },
    {
      "id": "p89",
      "slug": "structura",
      "name": "Structura (chem-structura)",
      "rank": 52,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit"
        ],
        "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/editor/canvas/Canvas.tsx",
        "note": "Custom SVG canvas; RDKit supports SMILES, identifiers, and coordinate generation."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Structura SVG scene renderer",
        "language": "TypeScript",
        "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/core/src/draw/scene.ts"
      },
      "enginesChecked": true,
      "languageNote": "Python generates data/fixtures; JavaScript/Shell handle tooling; HTML/CSS provide presentation.",
      "video": null,
      "embedding": {
        "methods": [
          "npm package",
          "web component",
          "script tag"
        ],
        "package": "chem-structura",
        "limit": "MIT",
        "how": "React StructuraEditor, ChemStructura.mount(), or editable <chem-molecule> via standalone script."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "RDKit chemistry compiled to WebAssembly"
        },
        {
          "language": "Rust",
          "role": "Server SVG rasterization via resvg-js"
        }
      ],
      "thirdParty": {
        "summary": "Includes OFL-1.1 (Geist fonts) and MPL-2.0 (AI service's resvg); UI/RDKit dependencies MIT/BSD/ISC.",
        "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/package-lock.json",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "Primarily a React and standalone structure-input component, with a separate app workspace for Markush workflows.",
      "summary": "An embeddable 2D chemical structure editor for drawing molecules and patent Markush formulas.",
      "website": "https://github.com/wxyhgk/structura",
      "repo": "https://github.com/wxyhgk/structura",
      "docs": "https://github.com/wxyhgk/structura/blob/master/packages/react/README.md",
      "vendor": "wxyhgk",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT-licensed editor and source code.",
        "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/LICENSE"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "chem-structura@0.8.0",
        "date": null,
        "source": "https://github.com/wxyhgk/structura/tree/chem-structura%400.8.0"
      },
      "engine": {
        "rendering": "Custom SVG scene renderer; React SVG on screen, HTML canvas for PNG output",
        "chemistry": "In-house Structura core and RDKit WebAssembly",
        "ui": "React 19, Radix UI, Tailwind CSS",
        "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/README.md"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/draw.tsx",
          "note": "Drew single, double, and triple bonds.",
          "shot": {
            "image": "evidence/structura/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/draw.tsx",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/structura/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/core/src/molfile/read.ts",
          "note": "Coordination and hydrogen bonds are downgraded to single bonds."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/draw.tsx",
          "note": "Placed benzene; ring palette offers other sizes.",
          "shot": {
            "image": "evidence/structura/f-rings.webp",
            "caption": "Benzene and quinoline structures on the canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/engine/src/hotkeys/bond-keys.ts",
          "note": "Hover keys 9 and 0 create mirrored chair conformations."
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/draw.tsx",
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/scaffolds.tsx",
          "note": "Placed quinoline from template library.",
          "shot": {
            "image": "evidence/structura/f-templates.webp",
            "caption": "Quinoline template and benzene on the canvas."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/templates.tsx",
          "note": "Saving fragment templates requires a backend or host-provided template store."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/labels.tsx",
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/labels.tsx",
          "note": "Element labels and isotopes; charge tools documented on drawing page.",
          "shot": {
            "image": "evidence/structura/f-atom-labels.webp",
            "caption": "Element palette and nitrogen label on a ring structure."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/start.tsx",
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/select.tsx",
          "note": null
        },
        "perspective": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/core/src/molecule/transform.ts",
          "note": "Tumble operations rotate selected atoms out of plane, then project."
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/core/src/draw/svg.ts",
          "note": "No arrow command found in menus or toolbar."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "No curved-arrow tool found in menus or toolbar."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/attachment.tsx",
          "note": "Structure brackets and Markush attachment curves only."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/labels.tsx",
          "note": "Abbreviation groups move together; general object grouping is unverified."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/select.tsx",
          "note": null,
          "engine": {
            "library": "In-house",
            "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/core/src/molecule/relax.ts"
          }
        },
        "journal-styles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/files.tsx",
          "note": "CDXML export applies ACS 1996 bond sizing only."
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/core/src/draw/scene.ts",
          "note": "Automatic element colors only."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/editor/shell/StatusBar.tsx",
          "note": "Flags atoms with abnormal valence.",
          "engine": {
            "library": "In-house",
            "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/core/src/formula.ts"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/select.tsx",
          "note": "Caffeine displayed C8H10N4O2 and 194.19.",
          "shot": {
            "image": "evidence/structura/f-formula-mass.webp",
            "caption": "Caffeine structure with formula and mass in the status bar."
          },
          "engine": {
            "library": "In-house",
            "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/core/src/formula.ts"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SMILES import rejected caffeine; no name command found."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "No naming command found for imported caffeine."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/markush.tsx",
          "note": "Variable definitions and enumeration UI live in the separate app workspace."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/brackets.tsx",
          "note": "Semantic SRU brackets retain repeat ranges and support bounded expansion."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/vision.tsx",
          "note": "Requires a configured AI server and model API credentials.",
          "engine": {
            "library": "In-house Node.js agent server; @anthropic-ai/sdk (remote Anthropic Messages API) or openai (remote OpenAI-compatible Responses/Chat Completions API), selected by AI_PROVIDER/API keys",
            "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/ai/src/provider.ts"
          }
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SDF projected to plane; no 3D view found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/files.tsx",
          "note": "Own export reopens; removing embedded record causes rejection.",
          "shot": {
            "image": "evidence/structura/f-cdxml.webp",
            "caption": "CDXML import warning describes supported Structura-exported files."
          },
          "engine": {
            "library": "In-house",
            "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/editor/cdxml.ts"
          }
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/README.md#chemistry-without-the-editor",
          "note": "Imported MOL and SDF; exported MOL.",
          "engine": {
            "library": "In-house",
            "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/core/src/molfile.ts"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/README.md#handle-ref",
          "note": "Imported through dialog; standalone API returned SMILES.",
          "shot": {
            "image": "evidence/structura/f-smiles.webp",
            "caption": "SMILES import dialog with example strings."
          },
          "engine": {
            "library": "RDKit.js (@rdkit/rdkit 2026.3.6, WebAssembly)",
            "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/editor/identifiers.ts"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/README.md#handle-ref",
          "note": "RDKit-backed InChI and InChIKey export; variables are rejected.",
          "engine": {
            "library": "RDKit.js (@rdkit/rdkit 2026.3.6, WebAssembly)",
            "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/editor/identifiers.ts"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/files.tsx",
          "note": "Exported SVG from both SMILES fixtures."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "No PDF command found in file menu."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/README.md#handle-ref",
          "note": "Standalone API generated PNG; no DPI setting found."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/enumerate.tsx",
          "note": "App compound tables require chem2office for editable ChemDraw objects in Word."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/README.md#handle-ref",
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/README.md",
          "note": "Documented JSON editing operations shared with agents."
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/master/packages/react/README.md#without-react",
          "note": "React StructuraEditor, ChemStructura.mount(), or editable <chem-molecule> via standalone script."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/vision.tsx",
          "note": "AI builds editable structures; requires configured server and model credentials."
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/guide/pages/enumerate.tsx#L27-L30",
          "note": "chem2office exports ChemDraw OLE requiring ChemDraw, not Structura."
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/wxyhgk/structura/blob/17285b9401c79f31073bb18f0607c9c15f4721fa/packages/react/src/editor/canvas/SelectionMarks.tsx#L39",
          "note": "Blue selection halos only; omitted from SVG/PNG exports."
        }
      },
      "caveats": [
        "Chinese interface; distributed as a component or source app.",
        "CDXML import accepts only unchanged Structura exports with embedded document data.",
        "Root README retains removed fillVariables/wordExport props; use the 0.8.0 package documentation."
      ],
      "github": {
        "url": "https://github.com/wxyhgk/structura",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-09-25",
        "commits": 283,
        "contributors": 1,
        "pushedAt": "2026-10-27T04:29:02Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.8.0",
        "canvas": "evidence/structura/canvas.webp",
        "canvasLight": "evidence/structura/canvas-light.webp",
        "canvasDark": "evidence/structura/canvas-dark.webp",
        "memory": {
          "idleMb": 473.53,
          "paclitaxelMb": 527.46,
          "baselineMb": 420.09,
          "rssIdleMb": 1047.38,
          "rssPaclitaxelMb": 1163.19,
          "runs": 3,
          "processes": 9,
          "method": "Headed Chromium tree plus detached crashpad helpers; summed phys_footprint; three-run medians; MiB.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Theme selector enabled via documented embedding API; hidden by default."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "npm",
        "artifact": "chem-structura-0.8.0.tgz",
        "ran": true,
        "failure": null,
        "downloadBytes": 1318920,
        "installedBytes": 81371136,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/structura/simple.svg",
            "note": null,
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/structura/complex.svg",
            "note": null,
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": null
          }
        ],
        "observations": [
          "Default drawing colors heteroatoms red and blue.",
          "SMILES import generated 2D layouts without cleanup.",
          "Imported 3D coordinates triggered a projection warning.",
          "The interface is in Chinese.",
          "Installed size includes package dependencies but excludes the browser test harness."
        ]
      },
      "perf": null,
      "downloadBytes": 1318920,
      "references": [
        "https://github.com/wxyhgk/structura",
        "https://www.npmjs.com/package/chem-structura"
      ]
    },
    {
      "id": "p27",
      "slug": "openchemlib-js-editor",
      "name": "OpenChemLib JS editor",
      "rank": 53,
      "builtOn": {
        "relation": "fork",
        "editor": "OpenChemLib editor",
        "libraries": [
          "OpenChemLib"
        ],
        "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/scripts/openchemlib/classes.js#L382-L397",
        "note": "JavaScript port copies OpenChemLib's editor source and applies compatibility patches."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "OpenChemLib AbstractDepictor / GenericDepictor",
        "language": "Java",
        "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/chem/AbstractDepictor.java"
      },
      "enginesChecked": true,
      "languageNote": "TypeScript supplies declarations; HTML, CSS and Shell support examples and tooling.",
      "video": null,
      "embedding": {
        "methods": [
          "npm package",
          "web component"
        ],
        "package": "openchemlib",
        "limit": "BSD-3-Clause",
        "how": "Instantiate CanvasEditor(element), or registerCustomElement() and add <openchemlib-editor>."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Canvas editor integration and API wrappers"
        },
        {
          "language": "TypeScript",
          "role": "Shipped API type declarations"
        }
      ],
      "thirdParty": {
        "summary": "Includes BSD-3-Clause (OpenChemLib) and Apache-2.0 (GWT runtime).",
        "source": "https://github.com/Actelion/openchemlib/blob/54949b8d6a4238316da94fa052e948142decc37d/LICENSE",
        "notice": null,
        "libraries": [
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "It is primarily an embeddable browser structure and reaction editor with a documented JavaScript API.",
      "summary": "Embeddable browser editor for drawing molecular structures and reactions using the OpenChemLib chemistry library.",
      "website": "https://cheminfo.github.io/openchemlib-js/",
      "repo": "https://github.com/cheminfo/openchemlib-js",
      "docs": "https://cheminfo.github.io/openchemlib-js/",
      "vendor": "Zakodium",
      "license": {
        "kind": "open-source",
        "spdx": "BSD-3-Clause",
        "text": "Permissive BSD 3-Clause license.",
        "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/LICENSE"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v9.25.2",
        "date": "2026-10-27",
        "source": "https://github.com/cheminfo/openchemlib-js/releases/tag/v9.25.2"
      },
      "engine": {
        "rendering": "HTML canvas 2D on screen; OpenChemLib SVG rendering for vector output",
        "chemistry": "OpenChemLib",
        "ui": "Custom HTML DOM and Web Components with GWT-compiled editor logic",
        "source": "https://github.com/cheminfo/openchemlib-js/tree/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/lib"
      },
      "languages": [
        "Java",
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/help.html#L110-L114",
          "note": "Drew single bond; keyboard changed it to double and triple.",
          "shot": {
            "image": "evidence/openchemlib-js-editor/f-bonds-core.webp",
            "caption": "A triple bond on the editor canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/chem/AbstractDepictor.java#L988-L1049",
          "note": "Drew solid and hashed wedges; no wavy tool visible.",
          "shot": {
            "image": "evidence/openchemlib-js-editor/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds in a molecular structure."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/chem/Molecule.java#L4048-L4124",
          "note": "Coordinate bonds and quadruple/quintuple bonds involving transition metals."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/gui/editor/GenericEditorArea.java#L1872-L1899",
          "note": "Benzene tool drew a ring; several ring tools visible.",
          "shot": {
            "image": "evidence/openchemlib-js-editor/f-rings.webp",
            "caption": "A benzene ring with ring tools visible."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/help.html#L234-L240",
          "note": "Dragging chain tool created six carbons.",
          "shot": {
            "image": "evidence/openchemlib-js-editor/f-chains.webp",
            "caption": "A zigzag carbon chain with the chain tool selected."
          }
        },
        "templates": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/help.html#L146-L168",
          "note": "Typing Ph produced no template; no template library visible."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/help.html#L146-L168",
          "note": "Typing Ph, Boc and other recognized groups attaches their structures."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/help.html#L185-L210",
          "note": "Atom tools set elements, charges, isotope masses and custom labels.",
          "shot": {
            "image": "evidence/openchemlib-js-editor/f-atom-labels.webp",
            "caption": "A positively charged carbon on the editor canvas."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/help.html#L85-L95",
          "note": "Hotkeys set single-electron, singlet and triplet radical states."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/help.html#L48-L54",
          "note": "Keys 2 and 3 changed the hovered bond order."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/gui/editor/GenericEditorArea.java",
          "note": "Lasso selection, rotation, resizing and keyboard horizontal/vertical flipping."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/chem/reaction/ReactionArrow.java#L146-L164",
          "note": "Loaded example shows forward arrow; other arrow types not visible.",
          "shot": {
            "image": "evidence/openchemlib-js-editor/f-reaction-arrows.webp",
            "caption": "Reactants and product separated by a forward reaction arrow."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow control visible."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/Reaction.html",
          "note": "Loaded example outputs reaction SMILES and RXN.",
          "shot": {
            "image": "evidence/openchemlib-js-editor/f-reaction-data.webp",
            "caption": "A reaction alongside reaction SMILES and RXN output."
          }
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/help.html#L305-L315",
          "note": "Drag between corresponding atoms; nearby atoms are mapped automatically."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/help.html#L262-L268",
          "note": "Cleanup regenerates 2D coordinates and can preserve unselected fragment orientation.",
          "engine": {
            "library": "Ported from OpenChemLib CoordinateInventor (Java compiled to JavaScript with GWT)",
            "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/gui/editor/GenericEditorArea.java#L3214-L3255"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/Molecule.html#setatomcolor",
          "note": "Individual atom colors can be set through the JavaScript API."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/chem/ExtendedMolecule.java#L3192-L3213",
          "note": "API validation throws errors for excessive valence and unbalanced charge.",
          "engine": {
            "library": "Ported from OpenChemLib ExtendedMolecule.validate (Java compiled to JavaScript with GWT)",
            "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/chem/ExtendedMolecule.java#L3192-L3214"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/Molecule.html#getatomcipparity",
          "note": "Pasted complex structure displayed R and S annotations.",
          "shot": {
            "image": "evidence/openchemlib-js-editor/f-stereo-perception.webp",
            "caption": "A molecular structure with R and S annotations."
          },
          "engine": {
            "library": "Ported from OpenChemLib StereoMolecule / Canonizer (Java compiled to JavaScript with GWT)",
            "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/chem/StereoMolecule.java#L171-L244"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminfo.github.io/openchemlib-js/interfaces/MolecularFormula.html",
          "note": "API returns molecular formula, exact mass and molecular weight.",
          "engine": {
            "library": "Ported from OpenChemLib MolecularFormula (Java compiled to JavaScript with GWT)",
            "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/chem/MolecularFormula.java#L336-L359"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/MoleculeProperties.html",
          "note": "API computes logP and polar surface area.",
          "engine": {
            "library": "Ported from OpenChemLib PropertyCalculator, CLogPPredictor and PolarSurfaceAreaPredictor (Java compiled to JavaScript with GWT)",
            "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/chemlib/com/actelion/research/chem/prediction/PropertyCalculator.java#L64-L92"
          }
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No chemical name input visible."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name generation control visible."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/help.html#L170-L171",
          "note": "Fragment mode supports atom lists through query-feature dialogs."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D model view control visible."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML import or export control visible."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/Molecule.html#frommolfile",
          "note": "Pasted MOL text and copied MOL output; SDF untested.",
          "shot": {
            "image": "evidence/openchemlib-js-editor/f-mol-sdf.webp",
            "caption": "A caffeine structure alongside molfile output."
          },
          "engine": {
            "library": "Ported from OpenChemLib MolfileParser, MolfileCreator, MolfileV3Creator and SDFileParser (Java compiled to JavaScript with GWT; MOL read/write and SDF reading)",
            "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/js/api/JSMolecule.java#L50-L136"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/Molecule.html#fromsmiles",
          "note": "Pasted SMILES and copied generated SMILES.",
          "shot": {
            "image": "evidence/openchemlib-js-editor/f-smiles.webp",
            "caption": "A caffeine structure alongside its SMILES output."
          },
          "engine": {
            "library": "Ported from OpenChemLib SmilesParser and IsomericSmilesCreator (Java compiled to JavaScript with GWT)",
            "source": "https://github.com/cheminfo/openchemlib-js/blob/cda8d580ec7ddee23e0c22f5c3a6a6176670b636/src/com/actelion/research/gwt/js/api/JSMolecule.java#L40-L123"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/Reaction.html#fromrxn",
          "note": "API reads and writes RXN V2000 and V3000."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/Molecule.html#tosvg",
          "note": "API returns vector SVG at specified dimensions."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export control visible."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG export control visible."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/CanvasEditor.html",
          "note": "Typed JavaScript API controls molecules, reactions and editor events."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/CanvasEditor.html#constructor",
          "note": "Instantiate CanvasEditor(element), or registerCustomElement() and add <openchemlib-editor>."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminfo.github.io/openchemlib-js/classes/Molecule.html#setbondbackgroundhiliting",
          "note": "API supports colored bond backgrounds in structure depictions."
        }
      },
      "caveats": [
        "Distributed as a developer component; the hosted editor is a demonstration.",
        "General editor help describes text tools disabled in the public CanvasEditor.",
        "Chemistry calculations and SVG export require JavaScript API integration."
      ],
      "github": {
        "url": "https://github.com/cheminfo/openchemlib-js",
        "stars": 94,
        "checkedOn": "2026-11-06",
        "firstCommit": "2014-08-26",
        "commits": 840,
        "contributors": 15,
        "pushedAt": "2026-11-03T16:57:07Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "v9.25.2",
        "canvas": "evidence/openchemlib-js-editor/canvas.webp",
        "canvasLight": "evidence/openchemlib-js-editor/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 92.79,
          "paclitaxelMb": 104.18,
          "baselineMb": 50.19,
          "rssIdleMb": 348.25,
          "rssPaclitaxelMb": 371.69,
          "runs": 3,
          "processes": 4,
          "method": "Headless Chromium process tree; summed phys_footprint in MiB; medians of fresh runs.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Light and dark browser preferences produce identical appearance."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://openchemlib-js.pages.dev/examples/generic_editor/demo",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/openchemlib-js-editor/simple.png",
            "note": "Pasted current SMILES; canvas screenshot after zooming.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/openchemlib-js-editor/complex.png",
            "note": "Pasted current SMILES; canvas screenshot after zooming.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": null,
            "image": null,
            "note": "No rotatable 3D viewer in the hosted editor.",
            "structure": null
          }
        ],
        "observations": [
          "Pasted SMILES are automatically laid out in the 2D canvas.",
          "Default complex drawing displays red stereochemical annotations.",
          "The demo displays live SMILES and MOL output rather than download buttons.",
          "MOL outputs matched both input structures in an RDKit round-trip comparison.",
          "Version comes from research metadata; the demo displayed no version.",
          "The served OpenChemLib bundle reports version 9.25.2."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 198,
        "transferBytes": 351806
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/cheminfo/openchemlib-js",
        "https://cheminfo.github.io/openchemlib-js/"
      ]
    },
    {
      "id": "p15",
      "slug": "molsketch-web",
      "name": "MolSketch",
      "rank": 54,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "RDKit",
          "DECIMER"
        ],
        "source": "https://molsketch.net/third-party-notices?lang=en",
        "note": "Canvas provenance unconfirmed; vendor credits RDKit for chemistry and DECIMER for image recognition."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "In-house Canvas 2D atom/bond renderer",
        "language": "JavaScript",
        "source": "https://molsketch.net/_next/static/chunks/4195-1583900bc0130be1.js"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript bundles are generated output; original core languages are undisclosed.",
      "video": {
        "provider": "file",
        "url": "https://molsketch.net/home/howitwork.mp4",
        "embed": null,
        "title": "使い方",
        "author": null,
        "linkedFrom": "https://molsketch.net/?lang=ja",
        "poster": null
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Cross-origin framing blocked by X-Frame-Options: SAMEORIGIN.",
        "how": "No supported embedding route found; hosted editor blocks external iframes."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "RDKit WebAssembly chemistry"
        },
        {
          "language": "Python",
          "role": "DECIMER image recognition service"
        }
      ],
      "thirdParty": {
        "summary": "RDKit BSD-3-Clause; DECIMER package MIT with separate model terms; KaTeX fonts OFL-1.1. The separate PDF translation tool uses pikepdf MPL-2.0.",
        "source": "https://molsketch.net/third-party-notices?lang=en",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "DECIMER",
            "license": "MIT",
            "source": "https://github.com/Kohulan/DECIMER-Image_Transformer/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its standalone editor creates chemical drawings with reaction arrows and rich text, with vector SVG and editable PowerPoint export.",
      "summary": "A free browser editor for drawing chemical structures and reaction schemes and exporting figures.",
      "website": "https://molsketch.net/",
      "repo": null,
      "docs": "https://molsketch.net/blog/molsketch-features?lang=en",
      "vendor": "banana",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free hosted service under MolSketch's terms; no open-source license stated.",
        "source": "https://molsketch.net/terms?lang=en"
      },
      "price": {
        "text": "Free (2026-11-05)",
        "source": "https://molsketch.net/terms?lang=en"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": true,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://molsketch.net/announcements?lang=en"
      },
      "engine": {
        "rendering": "Custom HTML Canvas 2D renderer; custom SVG serialization and native PowerPoint shapes/text.",
        "chemistry": "RDKit/RDKit.js for validation and SMILES processing; SmilesDrawer for SMILES layout.",
        "ui": "React / Next.js",
        "source": "https://molsketch.net/_next/static/chunks/4195-1583900bc0130be1.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsketch.net/blog/molsketch-features?lang=en#1-intuitive-drawing-of-bonds",
          "note": "Clicked one bond through single, double, and triple orders.",
          "shot": {
            "image": "evidence/molsketch-web/f-bonds-core.webp",
            "caption": "A triple bond drawn on the editor canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Solid and hashed wedges drawn; no wavy tool found.",
          "shot": {
            "image": "evidence/molsketch-web/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Drew benzene; cyclopentane and cyclohexane tools visible.",
          "shot": {
            "image": "evidence/molsketch-web/f-rings.webp",
            "caption": "A benzene ring and ring tools in the editor."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Dragging sets zigzag chain length."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Placed glycine from amino acid templates.",
          "shot": {
            "image": "evidence/molsketch-web/f-templates.webp",
            "caption": "The amino acid template library, including glycine and alanine."
          }
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://molsketch.net/_next/static/chunks/4647-8a1137f4cb85219c.js",
          "note": "Charges/custom labels supported; stored isotopes lack editor/display controls.",
          "shot": {
            "image": "evidence/molsketch-web/f-atom-labels.webp",
            "caption": "A caffeine structure with nitrogen and oxygen atom labels."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Lasso, rotation, and flips; no whole-selection resizing control.",
          "shot": {
            "image": "evidence/molsketch-web/f-selection-tools.webp",
            "caption": "A selected curved arrow with a rotation handle and controls."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Drew forward and equilibrium arrows.",
          "shot": {
            "image": "evidence/molsketch-web/f-reaction-arrows.webp",
            "caption": "A forward arrow and the reaction arrow menu."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Drew curved arrow; selection exposes control points.",
          "shot": {
            "image": "evidence/molsketch-web/f-mechanism-arrows.webp",
            "caption": "A selected curved arrow with visible control points."
          }
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsketch.net/_next/static/chunks/4647-8a1137f4cb85219c.js",
          "note": "Font size, bold, italic, underline, superscript, and subscript."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Group/ungroup atoms, bonds, arrows, and text; move selections together."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Clean Structure adjusts coordinates, bond geometry, arrows, and text.",
          "engine": {
            "library": "In-house browser JavaScript coordinate optimizer (Clean Structure)",
            "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molsketch.net/blog/gradient-bond?lang=en",
          "note": "Individual atom colors, bond colors, and endpoint gradients."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsketch.net/_next/static/chunks/4647-8a1137f4cb85219c.js",
          "note": "Checks valence, invalid elements, duplicate bonds, and RDKit validity.",
          "engine": {
            "library": "In-house browser JavaScript graph/valence checks plus RDKit.js browser WebAssembly get_mol validation",
            "source": "https://molsketch.net/_next/static/chunks/4647-8a1137f4cb85219c.js"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass command found for editor drawing."
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molsketch.net/chemistry/chemical-structure-analyzer?lang=en",
          "note": "Separate SMILES analyzer computes Crippen logP and TPSA."
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsketch.net/chemistry/chemical-name-to-structure?lang=en",
          "note": "Benzene produced a preview and loaded onto canvas.",
          "engine": {
            "library": "PubChem PUG REST (remote HTTP name/CAS-to-SMILES lookup); RDKit.js browser WebAssembly normalization; SmilesDrawer browser JavaScript layout",
            "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js"
          }
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure-to-name command found in editor."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Dedicated repeat-unit objects link structural groups and repeat labels."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molsketch.net/blog/ocr?lang=en",
          "note": "OCR imports printed or handwritten structures as editable chemistry.",
          "shot": {
            "image": "evidence/molsketch-web/f-image-to-structure.webp",
            "caption": "The Auto Generate panel offers OCR image upload."
          },
          "engine": {
            "library": "DECIMER Image Transformer (Python package in MolSketch-operated remote OCR service)",
            "source": "https://molsketch.net/third-party-notices?lang=en"
          }
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molsketch.net/third-party-notices?lang=en",
          "note": "Name and CAS lookup through PubChem PUG REST.",
          "engine": {
            "library": "PubChem PUG REST (remote HTTP name/CAS lookup)",
            "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js"
          }
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view found in editor or chemistry navigation."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML import or export control found."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No MOL or SDF import or export control found."
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://molsketch.net/announcements?lang=en",
          "note": "Caffeine matched; paclitaxel output changed ten stereocenters.",
          "shot": {
            "image": "evidence/molsketch-web/f-smiles.webp",
            "caption": "A caffeine drawing with its SMILES output."
          },
          "engine": {
            "library": "RDKit.js (browser WebAssembly normalization/export); SmilesDrawer Parser/SvgDrawer.preprocessor (browser JavaScript import/layout)",
            "source": "https://molsketch.net/_next/static/chunks/4195-1583900bc0130be1.js"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://molsketch.net/blog/molsketch-features?lang=en#2-export-in-png-svg-powerpoint",
          "note": "Downloaded SVG for both structures.",
          "shot": {
            "image": "evidence/molsketch-web/f-svg-export.webp",
            "caption": "The download menu offers SVG export for the drawing."
          }
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Download menu offers PNG, SVG and PowerPoint only."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "PNG exported; default caffeine image reports 72 dpi.",
          "shot": {
            "image": "evidence/molsketch-web/f-png-export.webp",
            "caption": "The download menu offers PNG export for the drawing."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://molsketch.net/blog/power-point?lang=en",
          "note": "PowerPoint objects remain editable as text and shapes.",
          "shot": {
            "image": "evidence/molsketch-web/f-office.webp",
            "caption": "The download menu offers a PowerPoint file."
          }
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://molsketch.net/chemistry/structure-editor?lang=en",
          "note": "No supported embedding route found; hosted editor blocks external iframes."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://molsketch.net/blog/power-point?lang=en",
          "note": "PPTX export creates editable PowerPoint text and shapes, not OLE objects."
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://molsketch.net/_next/static/chunks/5841-b835cc0641af835d.js",
          "note": "Selection/hover halos exist; SVG and PNG exports omit them."
        }
      },
      "caveats": [
        "Offline support is not documented; the offered editor is browser-hosted.",
        "Logged-out OCR and handwriting recognition are limited to three uses daily.",
        "OCR and structure generation may send inputs to servers or external services."
      ],
      "github": null,
      "hands": {
        "testedVersion": "build m0PiI1PnCmq4Tn2qz-p-a",
        "canvas": "evidence/molsketch-web/canvas.webp",
        "canvasLight": "evidence/molsketch-web/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 226.36,
          "paclitaxelMb": 215.02,
          "baselineMb": 50.3,
          "rssIdleMb": 530.31,
          "rssPaclitaxelMb": 546.27,
          "runs": 3,
          "processes": 4,
          "method": "Fresh headless Chromium; summed process-tree phys_footprint, MiB; medians of three runs.",
          "note": "Drawing loaded; published capture reported altered or lost stereocenters."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "SMILES import changes stereochemistry; default layout has overlaps."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://molsketch.net/chemistry/structure-editor?lang=en",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/molsketch-web/simple.svg",
            "note": "Caffeine SMILES round-tripped with matching structure.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "smiles",
            "image": "evidence/molsketch-web/complex.svg",
            "note": "Returned SMILES inverted nine stereocenters and lost one; MOL import unavailable.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": null,
            "image": null,
            "note": "No rotatable 3D view found in the editor.",
            "structure": null
          }
        ],
        "observations": [
          "Caffeine imported as a black drawing with bold atom labels.",
          "Paclitaxel's default layout has overlapping bonds and labels.",
          "Paclitaxel SMILES retained connectivity but changed or lost ten stereocenters.",
          "The default caffeine PNG measured 350 by 335 pixels.",
          "No version number was visible in the editor."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 745,
        "transferBytes": 2903246
      },
      "downloadBytes": null,
      "references": [
        "https://molsketch.net/blog/molsketch-features?lang=en",
        "https://molsketch.net/"
      ]
    },
    {
      "id": "p101",
      "slug": "dotmatics-elemental",
      "name": "Dotmatics Elemental / Elemental Draw",
      "rank": 55,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://www.rsccicag.org/index_htm_files/CICAG_Newsletter_Winter_2019-20_tcm18-252021.pdf#page=19",
        "note": "Toolkit author identifies Elemental with Dotmatics' internal JavaScript chemistry engine."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "Elemental App",
          "level": "free",
          "price": "2026-11-06: Free, iOS App Store."
        },
        {
          "name": "Elemental Draw",
          "level": "paid",
          "price": null
        },
        {
          "name": "Dotmatics ELN",
          "level": "paid",
          "price": null
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "Elemental Canvas 2D renderer",
        "language": "JavaScript",
        "source": "https://www.hit2lead.com/elemental/elemental-obf.js"
      },
      "enginesChecked": true,
      "languageNote": "C is documented for toolkit/iPad calculations; Elemental linkage is unconfirmed.",
      "video": null,
      "embedding": {
        "methods": [
          "script tag"
        ],
        "package": null,
        "limit": "Separate commercial JavaScript edition; deployment-specific license required",
        "how": "Licensed JavaScript edition injects editor with injectElemental(width,height); current availability unconfirmed."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "iPad property calculations"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "The vendor's standalone Elemental Draw release documents saving and printing structures and reactions for publications.",
      "summary": "Chemical structure and reaction drawing suite with desktop, web, and iOS editions.",
      "website": "https://www.dotmatics.com/",
      "repo": null,
      "docs": "https://images.webofknowledge.com/WOK50B6/images/dhtmlsuite/docs/Elemental.pdf",
      "vendor": "Dotmatics Limited",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Commercial desktop/site licensing; the separate iOS app is free.",
        "source": "https://www.prnewswire.co.uk/news-releases/dotmatics-announces-new-academic-site-license-program-at-the-248th-acs-meeting-in-san-francisco-270727741.html"
      },
      "price": {
        "text": "2026-11-05: iOS app Free; current desktop/platform price unverified.",
        "source": "https://apps.apple.com/us/app/elemental/id518655328"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": true,
        "ios": true,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://www.dotmatics.com/webinars/whats-new-in-dotmatics-7-5"
      },
      "engine": {
        "rendering": null,
        "chemistry": "In-house Dotmatics Chemistry Toolkit (JavaScript and C)",
        "ui": null,
        "source": "https://www.rsc.org/images/CICAG_Newsletter_Winter_2019-20_tcm18-252021.pdf"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://images.webofknowledge.com/WOK50B6/images/dhtmlsuite/docs/Elemental.pdf",
          "note": "Drew single, double, and triple bonds.",
          "shot": {
            "image": "evidence/dotmatics-elemental/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/dotmatics-elemental/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds on the drawing canvas."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Drew five-membered and fused aromatic rings.",
          "shot": {
            "image": "evidence/dotmatics-elemental/f-rings.webp",
            "caption": "Fused five-membered and aromatic rings on the canvas."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://images.webofknowledge.com/WOK50B6/images/dhtmlsuite/docs/Elemental.pdf",
          "note": "Template browser opened; its category contained no visible templates."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://images.webofknowledge.com/WOK50B6/images/dhtmlsuite/docs/Elemental.pdf",
          "note": "User templates are stored in browser cookies."
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Atom menu includes charge, element, and isotope submenus."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://images.webofknowledge.com/WOK50B6/images/dhtmlsuite/docs/Elemental.pdf",
          "note": "Hover over an atom and type an element symbol."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Selection and rotate controls are visible."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Drew a forward arrow; other arrow styles not found.",
          "shot": {
            "image": "evidence/dotmatics-elemental/f-reaction-arrows.webp",
            "caption": "Forward reaction arrow above fused rings."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow control found in the embedded editor."
        },
        "reaction-data": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://apps.apple.com/us/app/elemental/id518655328",
          "note": "Copy Mol/Rxn generated RXN with one reactant and no products.",
          "plan": "Elemental App",
          "planLevel": "free"
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://images.webofknowledge.com/WOK50B6/images/dhtmlsuite/docs/Elemental.pdf",
          "note": "Context menu tidies sketched geometries.",
          "engine": {
            "library": "In-house (Elemental JavaScript)",
            "source": "https://www.hit2lead.com/elemental/elemental-obf.js"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.technologynetworks.com/informatics/news/ccdc-selects-dotmatics-to-support-2d-queries-in-its-new-cambridge-structural-database-web-289738",
          "note": "Automatically flags valence violations; vendor claim.",
          "engine": {
            "library": "In-house (Elemental JavaScript)",
            "source": "https://www.hit2lead.com/elemental/elemental-obf.js"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/elemental/id518655328",
          "note": "iOS edition calculates molecular formula and mass; vendor claim.",
          "engine": {
            "library": "In-house (Elemental JavaScript)",
            "source": "https://www.hit2lead.com/elemental/elemental-obf.js"
          },
          "plan": "Elemental App",
          "planLevel": "free"
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/elemental/id518655328",
          "note": "iOS edition predicts LogP; vendor claim.",
          "engine": {
            "library": "In-house (Dotmatics C Chemistry Toolkit, iOS)",
            "source": "https://www.rsccicag.org/index_htm_files/CICAG_Newsletter_Winter_2019-20_tcm18-252021.pdf"
          },
          "plan": "Elemental App",
          "planLevel": "free"
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name conversion command found in the editor."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure naming command found in the editor."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://images.webofknowledge.com/WOK50B6/images/dhtmlsuite/docs/Elemental.pdf",
          "note": "R-group definitions, attachment points, logic, and atom lists."
        },
        "polymers": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "A repeat-unit bracket tool is visible."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.dotmatics.com/events/whats-new-in-dotmatics-eln-7.4",
          "note": "Paid platform edition: biological sequence editing; vendor claim.",
          "plan": "Dotmatics ELN",
          "planLevel": "paid"
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.prlog.org/12222629-dotmatics-elemental-suite-enhanced-with-the-launch-of-elemental-draw.html",
          "note": "Elemental DB edition searches ChEMBL; vendor claim."
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No rotatable 3D view found in the editor."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML import or export command found."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://apps.apple.com/us/app/elemental/id518655328",
          "note": "MOL text imported and exported; SDF not tested.",
          "engine": {
            "library": "In-house (Elemental JavaScript MOL/SDF parser and writer)",
            "source": "https://www.hit2lead.com/elemental/elemental-obf.js"
          },
          "plan": "Elemental App",
          "planLevel": "free"
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "SMILES output worked; MOL paste box did not accept SMILES."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://apps.apple.com/us/app/elemental/id518655328",
          "note": "RXN text output generated; RXN import not tested.",
          "plan": "Elemental App",
          "planLevel": "free"
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No SVG export command found."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export command found."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Image copy preview worked; host download produced no file."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.hit2lead.com/elemental/elemental_inject.js",
          "note": "Separate commercial JavaScript edition; deployment-specific license required"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Standalone Elemental Draw was announced in 2013; current desktop installers and support status were not verified.",
        "The iOS listing's latest update is from 2017; installation and operation were not tested.",
        "Public feature documentation spans editions and years; current desktop pricing, release version, and publication export formats remain unverified."
      ],
      "github": null,
      "hands": {
        "testedVersion": "2016.4.49405",
        "canvas": "evidence/dotmatics-elemental/canvas.webp",
        "canvasLight": "evidence/dotmatics-elemental/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 483.3,
          "paclitaxelMb": 492.9,
          "baselineMb": 401.4,
          "rssIdleMb": 1053.8,
          "rssPaclitaxelMb": 1070.8,
          "runs": 3,
          "processes": 7,
          "method": "Playwright Chromium process tree; summed phys_footprint, MiB; median of three.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "UI themes change tool layout; all remain light."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://www.hit2lead.com/search.asp?SearchPage=structure&box=E&db=SC",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/dotmatics-elemental/simple.png",
            "note": "SMILES failed; MOL coordinates used; PNG is a cropped window capture.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/dotmatics-elemental/complex.png",
            "note": "MOL coordinates used; PNG is a cropped window capture.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No 3D view found; cholesterol was not loaded.",
            "structure": null
          }
        ],
        "observations": [
          "Tested the Elemental copy embedded on Hit2Lead; no searches were run.",
          "The About dialog reports version 2016.4.49405.",
          "Both drawings use fixture MOL coordinates, not editor-generated layouts.",
          "Image-copy previews appeared; PNG files here are cropped window captures.",
          "No 3D viewport was found."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 2463,
        "transferBytes": 736133
      },
      "downloadBytes": null,
      "references": [
        "https://www.dotmatics.com/webinars/whats-new-in-dotmatics-7-5"
      ]
    },
    {
      "id": "p103",
      "slug": "sketchel-2",
      "name": "SketchEl 2",
      "rank": 56,
      "builtOn": {
        "relation": "wrapper",
        "editor": "WebMolKit Sketcher",
        "libraries": [
          "WebMolKit"
        ],
        "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/src/main/DrawPanel.ts#L21-L42",
        "note": "Mounts WebMolKit Sketcher; adds desktop file and clipboard integration."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "WebMolKit DrawMolecule / ArrangeMolecule / MetaVector",
        "language": "TypeScript",
        "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L16335-L16385"
      },
      "enginesChecked": true,
      "languageNote": "CSS/HTML style the interface; Shell/Emacs Lisp support builds and editing.",
      "video": null,
      "embedding": {
        "methods": [
          "npm package",
          "script tag"
        ],
        "package": "webmolkit",
        "limit": "Separate WebMolKit: Apache-2.0; SketchEl2 application: GPL-3.0",
        "how": "Embed shared editor via WebMolKit.Sketcher using npm or script bundle."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Electron desktop shell and menus"
        }
      ],
      "thirdParty": {
        "summary": "Bundled 2021 WebMolKit uses GPL-3.0; its later Apache relicensing postdates this bundle.",
        "source": "https://github.com/aclarkxyz/web_molkit/blob/46b347da911518f8317d68c103b6d84743747109/README.md#license",
        "notice": null,
        "libraries": [
          {
            "name": "WebMolKit",
            "license": "Apache-2.0",
            "source": "https://github.com/aclarkxyz/web_molkit/blob/master/README.md"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It is a standalone 2D molecule editor with vector SVG export, although its desktop workflow remains minimal and source-only.",
      "summary": "A standalone desktop application for drawing molecular structures and exporting vector diagrams.",
      "website": null,
      "repo": "https://github.com/aclarkxyz/web_sketchel2",
      "docs": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/README.md",
      "vendor": "Molecular Materials Informatics, Inc.",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-3.0",
        "text": "GNU General Public License version 3.",
        "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/README.md#license"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/aclarkxyz/web_sketchel2/releases"
      },
      "engine": {
        "rendering": "WebMolKit DrawMolecule/MetaVector; HTML Canvas 2D on screen and SVG for export",
        "chemistry": "WebMolKit",
        "ui": "Electron with WebMolKit HTML/CSS widgets",
        "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L19382"
      },
      "languages": [
        "TypeScript",
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L18546",
          "note": "Drew all three orders; changed double to triple in dialog.",
          "shot": {
            "image": "evidence/sketchel-2/f-bonds-core.webp",
            "caption": "Single and triple bonds, bond tools, and an aromatic ring."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L25655",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/sketchel-2/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L18546",
          "note": "Quadruple and zero-order bonds; dative support unverified."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L25662",
          "note": "Drew plain six-membered and aromatic rings.",
          "shot": {
            "image": "evidence/sketchel-2/f-rings.webp",
            "caption": "Six-membered and aromatic rings with ring tools."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/res/data/templates/rings.ds#L94",
          "note": "Chair template previewed and committed.",
          "shot": {
            "image": "evidence/sketchel-2/f-conformers.webp",
            "caption": "Chair ring drawing beside the template palette."
          }
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L24806",
          "note": "Inserted chair template; additional fragment libraries visible.",
          "shot": {
            "image": "evidence/sketchel-2/f-templates.webp",
            "caption": "Chair drawing beside the fragment template palette."
          }
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L20243",
          "note": "Abbreviations retain underlying chemical fragments and can be expanded."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L20073",
          "note": null,
          "shot": {
            "image": "evidence/sketchel-2/f-atom-labels.webp",
            "caption": "Edit Atom dialog with symbol, charge, and isotope controls."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L20084",
          "note": "Atom properties include the number of unpaired electrons.",
          "shot": {
            "image": "evidence/sketchel-2/f-radicals.webp",
            "caption": "Edit Atom dialog with an unpaired electron field."
          }
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L18526",
          "note": "Point at an atom or bond, then use keyboard commands."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L18604",
          "note": "Lasso selection plus rotation, flipping, and scaling."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No reaction-arrow command found in menus or tool banks."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No electron-pushing arrow command found in menus or tool banks."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L20098",
          "note": "Manual mapping numbers on molecules; reaction workflow unverified.",
          "shot": {
            "image": "evidence/sketchel-2/f-atom-mapping.webp",
            "caption": "Edit Atom dialog with a mapping field."
          }
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L19902",
          "note": "Projected SDF shows red overlap marker; valence checking unverified.",
          "engine": {
            "library": "WebMolKit (TypeScript; overlapping-atom checks only)",
            "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L19902-L19907"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L19923",
          "note": "Green R/S labels appeared automatically on paclitaxel.",
          "shot": {
            "image": "evidence/sketchel-2/f-stereo-perception.webp",
            "caption": "Green R and S labels on a molecular drawing."
          },
          "engine": {
            "library": "WebMolKit (TypeScript Stereochemistry)",
            "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L19923-L19960"
          }
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L22711",
          "note": "Formula-abbreviation attempt rejected selection; no mass command found.",
          "engine": {
            "library": "WebMolKit (TypeScript; formula abbreviations only)",
            "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L22711-L22728"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Name paste rejected; no conversion command found."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in menus, tool banks, or dialogs."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L23218",
          "note": "Atom lists, exclusions, and other chemical query constraints."
        },
        "polymers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L20628",
          "note": "Polymer units store connectivity beyond their drawn brackets."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SDF opens flat; no 3D view command found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "CDXML paste rejected; opening test file left canvas empty."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/src/main/DrawPanel.ts#L50",
          "note": "MOL read/write works; SDF opens; no SDF save format.",
          "shot": {
            "image": "evidence/sketchel-2/f-mol-sdf.webp",
            "caption": "A molecule displayed in a window titled simple-out.mol."
          },
          "engine": {
            "library": "WebMolKit (TypeScript MDLMOLReader / MDLMOLWriter; MOL only)",
            "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/src/main/DrawPanel.ts#L50-L78"
          }
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Caffeine SMILES paste rejected as unrecognisable molecule."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/src/main/DrawPanel.ts#L88",
          "note": "Default SVG exports saved for all three fixtures."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "File menu exposes SVG only; no print or PDF command."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG command in File menu or save formats."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/master/README.md#simple-embed",
          "note": "Separate WebMolKit: Apache-2.0; SketchEl2 application: GPL-3.0"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/aclarkxyz/web_sketchel2/blob/aed47f51979c6f646f574019626d8d5dc7ba9188/app/sketchel2.js#L19270",
          "note": "Gray selection halos only; absent from SVG export."
        }
      },
      "caveats": [
        "No GitHub releases; source build required and current compatibility unverified.",
        "README reports testing only on Linux and macOS; Windows support is unverified.",
        "Bare-bones molecule editor with native/MOL saving and SVG export."
      ],
      "github": {
        "url": "https://github.com/aclarkxyz/web_sketchel2",
        "stars": 10,
        "checkedOn": "2026-11-06",
        "firstCommit": "2017-01-01",
        "commits": 31,
        "contributors": 1,
        "pushedAt": "2022-12-12T14:17:35Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.1.0",
        "canvas": "evidence/sketchel-2/canvas.webp",
        "canvasLight": "evidence/sketchel-2/canvas-light.webp",
        "canvasDark": "evidence/sketchel-2/canvas-dark.webp",
        "memory": null,
        "themes": {
          "light": true,
          "dark": true,
          "how": "follows system",
          "note": "Only title bar changes; canvas and toolbars stay light."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "web_sketchel2-aed47f5.zip",
        "ran": true,
        "failure": null,
        "downloadBytes": 1213947,
        "installedBytes": 593281024,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/sketchel-2/simple.svg",
            "note": "SMILES rejected; MOL text pasted without cleanup.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/sketchel-2/complex.svg",
            "note": "Opened supplied 2D MOL without cleanup.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": "match"
          }
        ],
        "observations": [
          "Default heteroatom colors are oxygen red and nitrogen blue.",
          "Green R/S labels appear automatically on paclitaxel.",
          "Default SVGs use outlined labels and approximately 100-point bounds.",
          "MOL import preserves supplied 2D coordinates without cleanup.",
          "The 3D SDF projection has overlapping explicit hydrogen labels."
        ]
      },
      "perf": null,
      "downloadBytes": 1213947,
      "references": [
        "https://github.com/aclarkxyz/web_sketchel2",
        "https://github.com/aclarkxyz/web_sketchel2/blob/master/README.md"
      ]
    },
    {
      "id": "p28",
      "slug": "kekule-js",
      "name": "Kekule.js",
      "rank": 57,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "Open Babel",
          "Indigo",
          "InChI"
        ],
        "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/kekule.js#L476-L601",
        "note": "Own Composer canvas; Open Babel, Indigo, and InChI are optional chemistry modules."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Kekule.Render.ChemCtab2DRenderer",
        "language": "JavaScript",
        "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/render/2d/kekule.render.renderer2D.js"
      },
      "enginesChecked": true,
      "languageNote": "Other languages provide styles, demos, integrations and build tooling.",
      "video": null,
      "embedding": {
        "methods": [
          "npm package",
          "web component",
          "script tag"
        ],
        "package": "kekule",
        "limit": "MIT",
        "how": "Load scripts/CSS; instantiate Kekule.Editor.Composer(div), or use <kekule-composer>."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "Optional Open Babel/Indigo WebAssembly chemistry"
        },
        {
          "language": "C",
          "role": "Optional InChI WebAssembly engine"
        },
        {
          "language": "PHP",
          "role": "Optional Moodle integration plugins"
        }
      ],
      "thirdParty": {
        "summary": "Includes GPL-2.0-only (bundled Open Babel).",
        "source": "https://github.com/openbabel/openbabel/blob/openbabel-3-1-1/README.md",
        "notice": null,
        "libraries": [
          {
            "name": "Open Babel",
            "license": "GPL-2.0-only",
            "source": "https://github.com/openbabel/openbabel/blob/master/COPYING"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "Its primary product is a JavaScript toolkit whose Composer editor is embedded into web applications.",
      "summary": "JavaScript toolkit for embedding chemical structure editors, molecule viewers, and cheminformatics functions in web applications.",
      "website": "https://partridgejiang.github.io/Kekule.js/index.html",
      "repo": "https://github.com/partridgejiang/Kekule.js",
      "docs": "https://partridgejiang.github.io/Kekule.js/documents/tutorial/index.html",
      "vendor": "Chen Jiang",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT license; free use, modification and redistribution.",
        "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/LICENSE"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": true,
        "offline": true
      },
      "version": {
        "name": "v1.0.4",
        "date": "2026-05-22",
        "source": "https://github.com/partridgejiang/Kekule.js/releases/tag/v1.0.4"
      },
      "engine": {
        "rendering": "HTML Canvas 2D; optional SVG/VML via Raphaël; Three.js for 3D",
        "chemistry": "In-house Kekule.js; optional Open Babel, Indigo and InChI adapters",
        "ui": "Kekule.Widget (HTML, CSS and JavaScript)",
        "source": "https://partridgejiang.github.io/Kekule.js/documents/tutorial/content/installation.html"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.actions.js#L1963-L2003",
          "note": "Drew single, double and triple bonds.",
          "shot": {
            "image": "evidence/kekule-js/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the editor canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.chemSpaceEditors.js#L1673-L1702",
          "note": "Drew solid and hashed wedges; no wavy tool visible.",
          "shot": {
            "image": "evidence/kekule-js/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds on the editor canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.chemSpaceEditors.js#L1723-L1739",
          "note": "Coordinate and hydrogen bonds; coordinate tool requires configuration."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.actions.js#L2470-L2572",
          "note": "Drew benzene and cyclopentane; other sizes shown.",
          "shot": {
            "image": "evidence/kekule-js/f-rings.webp",
            "caption": "Benzene and five-membered rings on the editor canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.actions.js#L2586-L2656",
          "note": "Placed cyclohexane chair; Haworth tools also shown.",
          "shot": {
            "image": "evidence/kekule-js/f-conformers.webp",
            "caption": "A cyclohexane chair alongside ring drawings."
          }
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.chemSpaceEditors.js#L5742-L5767",
          "note": "Dragging controls zigzag chain length and displays atom count."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.actions.js#L2076-L2147",
          "note": "Placed Fischer projection; sawhorse templates also shown."
        },
        "custom-templates": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.repositories.js#L246-L270",
          "note": "Reusable serialized template API; user-save interface unverified."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.repositoryData.js#L47-L61",
          "note": "Ph and OMe abbreviations contain underlying molecular structures."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.utilWidgets.js#L961-L1051",
          "note": "Atom input supports isotopes, charges and arbitrary pseudoatom labels."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.actions.js#L2363-L2422",
          "note": "Radical states and lone-pair electron markers."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.actions.js#L1249-L1256",
          "note": "Keyboard operations preferentially target hovered atoms and bonds."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.baseEditors.js#L7310-L7337",
          "note": "Lasso, rotate and resize; negative scaling implements flipping.",
          "shot": {
            "image": "evidence/kekule-js/f-selection-tools.webp",
            "caption": "A selected molecule and selection controls in the editor."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.actions.js#L2963-L3045",
          "note": "Drew normal and reversible arrows.",
          "shot": {
            "image": "evidence/kekule-js/f-reaction-arrows.webp",
            "caption": "Reaction arrows above a chemical scheme."
          }
        },
        "mechanism-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.actions.js#L3048-L3086",
          "note": "Drew single- and double-electron arcs; editing unverified.",
          "shot": {
            "image": "evidence/kekule-js/f-mechanism-arrows.webp",
            "caption": "Curved arrows beside a chemical reaction scheme."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/reaction/kekule.reactionUtils.js#L1407-L1467",
          "note": "API extracts chemical reactants and products from drawn reaction documents."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.actions.js#L2867-L2941",
          "note": "Chemical symbol tools include plus signs, heat and light.",
          "shot": {
            "image": "evidence/kekule-js/f-orbitals.webp",
            "caption": "Plus and heat symbols in a Friedel–Crafts reaction scheme."
          }
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/chemdoc/kekule.contentBlocks.js#L172-L199",
          "note": "Font styling exists; canvas text blocks store plain text."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.actions.js#L2827-L2961",
          "note": "Editable line segments and arc curves.",
          "shot": {
            "image": "evidence/kekule-js/f-shapes.webp",
            "caption": "Curved arrows beside a chemical reaction scheme."
          }
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/kekule.chemWidget.chemObjDisplayers.js#L1435-L1469",
          "note": "2D coordinate regeneration requires an optional chemistry adapter.",
          "engine": {
            "library": "Open Babel (optional C++ compiled to WebAssembly with Emscripten; Gen2D); Indigo (optional C++ WebAssembly alternative; layout)",
            "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/kekule.js#L571-L589"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/modifiers/kekule.chemEditor.styleModifiers.js#L94-L139",
          "note": "Individual selected objects accept custom colors."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://partridgejiang.github.io/Kekule.js/documents/tutorial/content/composer.html#composer-ui",
          "note": "Image blocks can be inserted into chemical drawings."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/chemdoc/issueCheckers/kekule.issueCheckers.js#L526-L536",
          "note": "Reports abnormal atom valences as errors.",
          "engine": {
            "library": "In-house (JavaScript; Kekule.IssueCheck.AtomValenceChecker)",
            "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/chemdoc/issueCheckers/kekule.issueCheckers.js#L500-L550"
          }
        },
        "stereo-perception": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://partridgejiang.github.io/Kekule.js/documents/tutorial/content/getMolInfo.html#stereo-perception",
          "note": "Computes parity instead of R/S or E/Z descriptors."
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://partridgejiang.github.io/Kekule.js/documents/tutorial/content/getMolInfo.html#molecule-formula",
          "note": "Molecular formula confirmed; molecular mass calculation unverified.",
          "engine": {
            "library": "In-house (JavaScript; molecular formula only)",
            "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/core/kekule.structures.js#L6652-L6660"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name conversion control found in hosted editor."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in hosted editor."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.chemSpaceEditors.js#L1577-L1611",
          "note": "R-group nodes and allowed or disallowed atom lists."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://partridgejiang.github.io/Kekule.js/documents/tutorial/content/chemViewer.html#changing-zoom-level-and-rotation-of-object",
          "note": "Rotatable wire, stick, ball-and-stick and space-filling models.",
          "engine": {
            "library": "Three.js (JavaScript; Kekule.Render.ThreeRendererBridge)",
            "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/render/3d/kekule.render.threeRenderer.js#L329-L369"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "CDXML absent from load and save format lists."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/io/mdl/kekule.io.mdlIO.js#L1478-L1502",
          "note": "Imported and saved MOL and SDF.",
          "shot": {
            "image": "evidence/kekule-js/f-mol-sdf.webp",
            "caption": "MOL format and data preview beside a caffeine structure."
          },
          "engine": {
            "library": "In-house (JavaScript; MDL V2000/V3000 and SDF readers/writers)",
            "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/io/mdl/kekule.io.mdlIO.js#L1478-L1502"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/_extras/Indigo/kekule.indigo.io.js#L34-L68",
          "note": "SMILES export worked; load dialog lacks SMILES format.",
          "engine": {
            "library": "In-house (JavaScript SMILES writer); Indigo or Open Babel (optional C++ compiled to WebAssembly readers)",
            "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/kekule.js#L375-L601"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/_extras/InChI/kekule.inchi.js#L233-L271",
          "note": "Optional InChI library supplies output and InChIKey generation.",
          "engine": {
            "library": "InChI (optional C compiled to WebAssembly with Emscripten; InChI and InChIKey output)",
            "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/_extras/InChI/kekule.inchi.js#L132-L179"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/io/mdl/kekule.io.mdlIO.js#L1490-L1500",
          "note": "Reads and writes RXN2000 and RXN3000."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/render/2d/kekule.render.raphaelRenderer.js#L469-L479",
          "note": "SVG export through the optional Raphaël rendering bridge."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF option in save dialog."
        },
        "png-export": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/render/2d/kekule.render.canvasRenderer.js#L756-L762",
          "note": "PNG output exists; 300 dpi export is unverified."
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "docs",
          "source": "https://partridgejiang.github.io/Kekule.js/documents/tutorial/content/composer.html",
          "note": "Clipboard uses internal local storage; native clipboard unavailable."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://partridgejiang.github.io/Kekule.js/documents/tutorial/content/composer.html#creating-composer",
          "note": "JavaScript API creates, loads and controls the Composer editor."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://partridgejiang.github.io/Kekule.js/documents/api/chemWidget/Kekule.Editor.IaControllerManager.html#register",
          "note": "Register custom editor interaction controllers through the documented API."
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/partridgejiang/Kekule.js#widget",
          "note": "Load scripts/CSS; instantiate Kekule.Editor.Composer(div), or use <kekule-composer>."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/partridgejiang/Kekule.js/blob/7ad08b842d296ce78ba8edb187b0088b0191c43a/src/widgets/chem/editor/kekule.chemEditor.baseEditors.js#L3187-L3285",
          "note": "Colored selection overlays; excluded from image export."
        }
      },
      "caveats": [
        "Primarily a developer toolkit; the hosted Composer is a demonstration editor.",
        "Native SMILES support is output only; input requires an optional adapter.",
        "Stereo perception reports parity rather than R/S or E/Z labels."
      ],
      "github": {
        "url": "https://github.com/partridgejiang/Kekule.js",
        "stars": 280,
        "checkedOn": "2026-11-06",
        "firstCommit": "2015-02-01",
        "commits": 2753,
        "contributors": 9,
        "pushedAt": "2026-09-21T13:00:32Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.9.9.22022400",
        "canvas": "evidence/kekule-js/canvas.webp",
        "canvasLight": "evidence/kekule-js/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 207.38,
          "paclitaxelMb": 191.22,
          "baselineMb": 50.24,
          "rssIdleMb": 460.75,
          "rssPaclitaxelMb": 451.38,
          "runs": 3,
          "processes": 4,
          "method": "Headless Chromium process tree; summed phys_footprint in MiB; medians of fresh runs.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://partridgejiang.github.io/Kekule.js/demos/items/chemEditor/chemEditor.html",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/kekule-js/simple.png",
            "note": "SMILES failed; MOL loaded and saved. Image is a canvas capture.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/kekule-js/complex.png",
            "note": "SMILES failed; MOL loaded and saved. Image is a canvas capture.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": null
          }
        ],
        "observations": [
          "Version taken from research file; demo displayed no version.",
          "The editor initially showed a Friedel-Crafts example.",
          "SMILES pasted into the default CML loader produced a load error.",
          "MOL round trips retained fixture atom and bond counts.",
          "The save dialog offered chemical formats but no image export.",
          "The hosted demo exposes Kekule.VERSION as 0.9.9.22022400 in its loaded code."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 246,
        "transferBytes": 578742
      },
      "downloadBytes": null,
      "references": [
        "https://partridgejiang.github.io/Kekule.js/index.html",
        "https://github.com/partridgejiang/Kekule.js/"
      ]
    },
    {
      "id": "p22",
      "slug": "xdrawchem",
      "name": "XDrawChem",
      "rank": 58,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "Open Babel"
        ],
        "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application.cpp#L169",
        "note": "Own Render2D canvas and editing logic; Open Babel handles molecular conversion and chemistry."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "XDrawChem Render2D (Qt QPainter)",
        "language": "C++",
        "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/render2d_draw.cpp#L47"
      },
      "enginesChecked": true,
      "languageNote": "C-classified headers are C++; HTML documentation; remaining languages build files.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-2.0-or-later",
        "how": "Standalone Qt editor; no supported embeddable widget or library found."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Native InChI through Open Babel"
        }
      ],
      "thirdParty": {
        "summary": "Includes GPL-2.0-only (Open Babel) and LGPL-3.0/GPL or commercial licensing (Qt6).",
        "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/CMakeLists.txt",
        "notice": null,
        "libraries": [
          {
            "name": "Open Babel",
            "license": "GPL-2.0-only",
            "source": "https://github.com/openbabel/openbabel/blob/master/COPYING"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A standalone desktop editor provides chemical drawing documents with reaction schemes, annotations, templates, and layout controls.",
      "summary": "Desktop editor for drawing two-dimensional chemical structures, reaction schemes, and annotated chemistry figures.",
      "website": "https://bryanherger.github.io/xdrawchem/",
      "repo": "https://github.com/bryanherger/xdrawchem",
      "docs": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/doc/index.html",
      "vendor": "Bryan Herger",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-2.0-or-later",
        "text": "GNU GPL version 2 or later.",
        "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/COPYRIGHT.txt"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/bryanherger/xdrawchem/releases/tag/v2.0.1"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v2.0.1",
        "date": "2026-04-24",
        "source": "https://github.com/bryanherger/xdrawchem/releases/tag/v2.0.1"
      },
      "engine": {
        "rendering": "Qt QPainter; custom legacy SVG/EPS writers; raster-backed PDF and newer SVG export",
        "chemistry": "Open Babel 3 and in-house chemistry algorithms",
        "ui": "Qt 6 Widgets; legacy Qt 5 build also available",
        "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/CMakeLists.txt"
      },
      "languages": [
        "C++"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/doc/toolbar.html",
          "note": "Single and double drawn; triple control seen but not confirmed.",
          "shot": {
            "image": "evidence/xdrawchem/f-bonds-core.webp",
            "caption": "A double bond on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/bondedit.cpp#L152",
          "note": "Solid wedge, hashed wedge, and wavy bonds drawn.",
          "shot": {
            "image": "evidence/xdrawchem/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/bond.cpp#L113",
          "note": "Dative and partial-order aromatic/double-triple bonds."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/bondedit.cpp#L188",
          "note": null
        },
        "rings": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application_ring.cpp#L87",
          "note": "Benzene insertion reports missing Resources/benzene.cml."
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application_ring.cpp#L92",
          "note": "Cyclohexane chair and boat templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/render2d.cpp#L195",
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application_ring.cpp#L111",
          "note": "Alanine insertion reports missing Resources/alanine.cml."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/doc/toolmenu.html",
          "note": "Save molecules in the custom ring library."
        },
        "abbreviations": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/backlog.md#L75",
          "note": "Expandable superatom abbreviations require a future data model."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/backlog.md#L69",
          "note": "Arbitrary labels work; formal charges and isotopes lack chemical representation."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application.cpp#L814",
          "note": "Graphical electron-dot and lone-pair symbols."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/render2d_text.cpp#L339",
          "note": "Typing over an atom starts or changes its label."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/render2d_select.cpp#L9",
          "note": "Lasso selection, rotation, mirroring, and resizing."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application.cpp#L833",
          "note": "Forward and retrosynthetic arrows drawn.",
          "shot": {
            "image": "evidence/xdrawchem/f-reaction-arrows.webp",
            "caption": "Forward and hollow reaction arrows on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/curvearrow.cpp#L99",
          "note": "90-degree curved arrow drawn on scratch canvas.",
          "shot": {
            "image": "evidence/xdrawchem/f-mechanism-arrows.webp",
            "caption": "A curved arrow on the drawing canvas."
          }
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/molecule.cpp#L839",
          "note": "Native XDC stores molecules with reactant and product roles."
        },
        "atom-mapping": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/backlog.md#L65",
          "note": "Listed as future work for v2.1 or later."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application.cpp#L818",
          "note": "Orbital shapes and chemical symbols."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/doc/text.html",
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/doc/edit.html",
          "note": "Editable brackets, boxes, circles, ellipses, and curves."
        },
        "align": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/chemdata_tools.cpp#L337",
          "note": "Auto layout aligns whole schemes rather than selected objects."
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/doc/toolmenu.html",
          "note": null,
          "engine": {
            "library": "Ported from JMDraw (C++ SDG implementation)",
            "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/sdg.h#L1"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application.cpp#L2295",
          "note": "Built-in ACS style preset."
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/prefs.h#L158",
          "note": "Bond settings persist; drawing-font presets are not saved."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/doc/edit.html",
          "note": null
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/pagesetupdialog.cpp#L21",
          "note": "Page size and orientation controls; document uses one canvas."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/molecule_valence.cpp#L16",
          "note": null,
          "engine": {
            "library": "In-house (C++ Molecule::ValenceErrors and MolData valence table)",
            "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/molecule_valence.cpp#L16"
          }
        },
        "stereo-perception": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/backlog.md#L63",
          "note": "Absent from v2.0.1; implemented in newer unreleased source."
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/doc/toolmenu.html",
          "note": "Drawn ethene returned C2H4 and molecular weight 28.0538.",
          "shot": {
            "image": "evidence/xdrawchem/f-formula-mass.webp",
            "caption": "Molecule Info displays C2H4 and molecular weight 28.0538."
          },
          "engine": {
            "library": "In-house (C++ Molecule formula calculation and MolData atomic masses)",
            "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/molecule_tools_2.cpp#L277"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/chemdata_tools.cpp#L190",
          "note": "Estimates log Kow.",
          "engine": {
            "library": "In-house (C++ log Kow fragment estimator)",
            "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/molecule_tools_1.cpp#L451"
          }
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/molecule_nts.cpp#L26",
          "note": "Submitting caffeine returned without adding a structure."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/molecule_iupac.cpp#L24",
          "note": "Drawn ethene lookup reported Could not retrieve IUPAC name."
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/doc/toolmenu.html",
          "note": null,
          "engine": {
            "library": "Ported from Christoph Steinbeck's BremserOneSphereHOSECodePredictor (C++/Qt 13C); In-house (C++ 1H predictor)",
            "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/boshcp.cpp#L1"
          }
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/backlog.md#L75",
          "note": "S-groups and repeat-unit semantics require a future data model."
        },
        "biomolecules": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application_ring.cpp#L111",
          "note": "Amino-acid and nucleic-base templates; sequence builder does not assemble structures."
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/backlog.md#L81",
          "note": "OSRA integration is listed as future work."
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/netaccess.cpp#L102",
          "note": "PubChem search by name, CAS number, or formula.",
          "engine": {
            "library": "PubChem PUG REST (remote HTTPS/JSON API; Qt C++ client)",
            "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/netaccess.cpp#L111"
          }
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/to3d.cpp#L259",
          "note": "Build 3D reports coordinate-generation service unavailable."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application_ob.cpp#L95",
          "note": "CDXML written; reopening same file hung at 100% CPU.",
          "engine": {
            "library": "In-house (C++ CDXML_Reader parser and ToCDXML writer)",
            "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/chemdata_cdx.cpp#L32"
          }
        },
        "cdx": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application_ob.cpp#L238",
          "note": "Reads binary CDX; saving uses CDXML instead.",
          "engine": {
            "library": "In-house (C++ CDX-to-CDXML binary parser; import only)",
            "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/cdx2cdxml.cpp#L126"
          }
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/application_ob.cpp#L56",
          "note": "MOL/SDF opening rejected; format menus contain only CDX, CDXML, XDC."
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/doc/toolmenu.html",
          "note": "Fixture input left blank canvases; drawn ethene output string empty."
        },
        "inchi": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/molecule_smiles.cpp#L275",
          "note": "Reads and writes via Open Babel; import loses chemical metadata.",
          "engine": {
            "library": "Open Babel 3 (native C++ OBConversion InChI format plugin)",
            "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/molecule_smiles.cpp#L275"
          }
        },
        "rxn": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/backlog.md#L67",
          "note": "RXN interchange is listed as future work."
        },
        "svg-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/render2d_svg.cpp#L24",
          "note": "Export succeeds, but SVG embeds one bitmap and no vector paths."
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/render2d_pdf.cpp#L33",
          "note": "PDF export contains a raster image instead of vector drawing."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/render2d_svg.cpp#L97",
          "note": "Default file export is 263x350 pixels at 72 dpi.",
          "shot": {
            "image": "evidence/xdrawchem/f-png-export.webp",
            "caption": "The canvas and a saved PNG file status message."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/main.cpp#L59",
          "note": "PNG command-line mode still initializes and displays the GUI."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/bryanherger/xdrawchem",
          "note": "Standalone Qt editor; no supported embeddable widget or library found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/bryanherger/xdrawchem/blob/fec22dde95bfabfd55d616b77279d4fc4a79f7b7/xdrawchem-qt5/xdrawchem/text.cpp#L576",
          "note": "Atom labels support colored background shapes."
        }
      },
      "caveats": [
        "Ratings cover v2.0.1; newer unreleased source adds CIP labels and local 3D generation.",
        "PDF and Export SVG embed bitmaps despite vector claims; the 300 dpi clipboard option upscales pixels.",
        "Older docs conflict with code on 3D, Babel export, text/projections, template refresh, CDX output, and MOL/SDF support."
      ],
      "github": {
        "url": "https://github.com/bryanherger/xdrawchem",
        "stars": 56,
        "checkedOn": "2026-11-06",
        "firstCommit": "2016-11-25",
        "commits": 300,
        "contributors": 12,
        "pushedAt": "2026-10-31T12:04:44Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "2.0.1",
        "canvas": "evidence/xdrawchem/canvas.webp",
        "canvasLight": "evidence/xdrawchem/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 152.39,
          "paclitaxelMb": null,
          "baselineMb": null,
          "rssIdleMb": 245.98,
          "rssPaclitaxelMb": null,
          "runs": 1,
          "processes": 1,
          "method": "Single manual MOL run; footprint phys_footprint summed over owned process tree; MiB.",
          "note": "Paclitaxel MOL rejected: file-type selection error; no MOL filter available."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Fixed light palette; paclitaxel import failed, leaving blank canvas."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "https://github.com/bryanherger/xdrawchem/releases/download/v2.0.1/XDrawChem-2.0.1-macos.dmg",
        "ran": true,
        "failure": null,
        "downloadBytes": 39611513,
        "installedBytes": 110833664,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "No drawing: current Kekulé SMILES stayed blank; MOL rejected with file-type selection error.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "No drawing: current Kekulé SMILES stayed blank; MOL rejected with file-type selection error.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "No rotatable model; cholesterol SMILES blank and SDF rejected.",
            "structure": null
          }
        ],
        "observations": [
          "Caffeine and paclitaxel SMILES inputs left empty default canvases.",
          "Default controls show Helvetica 12 and line thickness 1.",
          "Benzene and alanine insertion failed with missing-template-file alerts.",
          "Default SVG and PDF exports embed raster images.",
          "Reopening the app’s own CDXML export made it unresponsive.",
          "Current Kekulé SMILES also left caffeine and paclitaxel canvases empty.",
          "Redraw stderr reports missing OpenBabel plugins and zero atoms after each fixture SMILES import.",
          "About reports 2.0.1; both Info.plist bundle-version fields report 2.0."
        ]
      },
      "perf": {
        "kind": "desktop",
        "launchMs": 449,
        "idleMb": 245,
        "loadMs": null,
        "transferBytes": null
      },
      "downloadBytes": 39611513,
      "references": [
        "https://github.com/bryanherger/xdrawchem"
      ]
    },
    {
      "id": "p107",
      "slug": "sketchel",
      "name": "SketchEl",
      "rank": 59,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
        "note": "Own EditorPane canvas, molecular model, stereochemistry, and depiction; no external chemistry dependencies."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "SketchEl DrawMolecule / ArrangeMolecule",
        "language": "Java",
        "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download"
      },
      "enginesChecked": true,
      "languageNote": "Perl and shell commands support building and packaging.",
      "video": null,
      "embedding": {
        "methods": [
          "Java applet"
        ],
        "package": null,
        "limit": "GPL-2.0-or-later; obsolete Java applet",
        "how": "Legacy Java applet embeds editor with JavaScript molecule exchange."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "The complete standalone editor produces 2D molecular drawings and vector SVG/ODG exports suitable for publication workflows.",
      "summary": "A standalone Java editor for drawing 2D molecular structures and editing molecular datasheets.",
      "website": "https://sketchel.sourceforge.net/",
      "repo": null,
      "docs": "https://sketchel.sourceforge.net/",
      "vendor": "Dr. Alex M. Clark",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-2.0-or-later",
        "text": "GPL v2 or later; homepage lists GPLv2.",
        "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download"
      },
      "price": {
        "text": "Free",
        "source": "https://sketchel.sourceforge.net/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.62",
        "date": "2015-03-06",
        "source": "https://sourceforge.net/projects/sketchel/files/"
      },
      "engine": {
        "rendering": "Java2D Graphics2D for screen and PNG; custom SVG and OpenDocument vector exporters",
        "chemistry": "In-house Java molecule model and stereochemistry algorithms",
        "ui": "Java Swing",
        "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download"
      },
      "languages": [
        "Java"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Drew three bond orders; changed an existing single to double.",
          "shot": {
            "image": "evidence/sketchel/f-bonds-core.webp",
            "caption": "Bond tools and drawn double and triple bonds on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sketchel.sourceforge.net/molfmt.html",
          "note": "Applied solid wedge, hashed wedge and wavy styles to existing bonds.",
          "shot": {
            "image": "evidence/sketchel/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sketchel.sourceforge.net/molfmt.html",
          "note": "Dotted zero-order bonds represent coordination and hydrogen bonds."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Chooser shows common rings; automated placement did not complete.",
          "shot": {
            "image": "evidence/sketchel/f-rings.webp",
            "caption": "Ring chooser with common ring sizes and an aromatic ring."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Includes cyclohexane chair and boat templates.",
          "shot": {
            "image": "evidence/sketchel/f-conformers.webp",
            "caption": "Ring chooser includes chair and boat cyclohexane templates."
          }
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Chooser shows fused rings and heterocycles; automated placement did not complete.",
          "shot": {
            "image": "evidence/sketchel/f-templates.webp",
            "caption": "Template chooser with fused rings and heterocycles."
          }
        },
        "custom-templates": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Temporary applet templates; no persistent template saving."
        },
        "abbreviations": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Whole-molecule abbreviation rejected: Must select a terminal fragment."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sketchel.sourceforge.net/molfmt.html",
          "note": "Arbitrary labels, ionic charges and isotope masses.",
          "shot": {
            "image": "evidence/sketchel/f-atom-labels.webp",
            "caption": "Edit Molecule table with element, charge and isotope columns."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sketchel.sourceforge.net/molfmt.html",
          "note": "Unpaired-electron counts represent radicals.",
          "shot": {
            "image": "evidence/sketchel/f-radicals.webp",
            "caption": "Edit Molecule table includes an Unpaired column."
          }
        },
        "keyboard-drawing": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Typing selects element tools; placement still requires clicking."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Arbitrary atom selection with rotation, flips and scaling."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No arrow tool found in menus, toolbar or template chooser."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved electron-pushing tool found in inspected controls."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Editable atom map numbers; reaction-level mapping workflow unverified.",
          "shot": {
            "image": "evidence/sketchel/f-atom-mapping.webp",
            "caption": "Edit Molecule table includes a MapNum column."
          }
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Normalizes average bond length by scaling; angles remain unchanged.",
          "engine": {
            "library": "In-house (Java bond length normalization only)",
            "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download"
          }
        },
        "journal-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Generic PublicationMetrics preset; no journal-specific presets."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "ConfigData.java saves named font, bond and scale policies.",
          "shot": {
            "image": "evidence/sketchel/f-custom-styles.webp",
            "caption": "Rendering policies with font, line and bond settings."
          }
        },
        "color": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Colors apply by element type, rather than individual atoms.",
          "shot": {
            "image": "evidence/sketchel/f-color.webp",
            "caption": "Rendering policy includes foreground and atom colour settings."
          }
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sketchel.sourceforge.net/",
          "note": "SDF opened in a molecular datasheet with an editable molecule cell.",
          "shot": {
            "image": "evidence/sketchel/f-tlc-tables.webp",
            "caption": "DataSheet with a selected molecule cell."
          }
        },
        "valence-check": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Overlap warnings only; chemical valence validation unverified.",
          "engine": {
            "library": "In-house (Java overlapping-atom warnings only)",
            "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Molecule.java computes chirality; editor displays R/S and E/Z.",
          "engine": {
            "library": "In-house",
            "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download"
          }
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Formula generation for abbreviations; molecular-mass calculation unverified.",
          "engine": {
            "library": "In-house (Java formula calculation only)",
            "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name import command found in inspected menus or dialogs."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure naming command found in inspected menus or dialogs."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "R-group labels and editable atom/bond query properties."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Cholesterol SDF opened as a flat drawing without a 3D viewport."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "CDXML startup import produced Invalid MDL MOL file errors."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sketchel.sourceforge.net/",
          "note": "MOL/SDF loaded; MOL export dialog opened, but filename entry failed.",
          "shot": {
            "image": "evidence/sketchel/f-mol-sdf.webp",
            "caption": "Export as MDL MOL dialog with MOL file format selected."
          },
          "engine": {
            "library": "In-house",
            "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download"
          }
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SMILES file import failed; paste also failed to produce a structure."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sketchel.sourceforge.net/",
          "note": "Export dialog opened; filename input failed, so no SVG was saved.",
          "shot": {
            "image": "evidence/sketchel/f-svg-export.webp",
            "caption": "Export as SVG dialog with SVG file format selected."
          }
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://sourceforge.net/p/sketchel/news/2009/06/version-133-openoffice-graphics/",
          "note": "PDF requires ODG export followed by OpenOffice Draw."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "PNG preview rendered; filename entry failed; default size 149×124 pixels.",
          "shot": {
            "image": "evidence/sketchel/f-png-export.webp",
            "caption": "PNG export dialog showing a structure preview and dimensions."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "JavaScript molecule bridge requires a legacy Java applet."
        },
        "cli": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Command-line startup opens GUI; no headless conversion/rendering command."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://sketchel.sourceforge.net/",
          "note": "GPL-2.0-or-later; obsolete Java applet"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://sourceforge.net/projects/sketchel/files/SketchEl-1.62-src.tar.gz/download",
          "note": "Blue atom selection halos appear during editing but disappear from exports."
        }
      },
      "caveats": [
        "Last released in 2015; requires a Java runtime.",
        "Web embedding depends on obsolete Java applets.",
        "Publication document assembly uses exported graphics in external editors."
      ],
      "github": null,
      "hands": {
        "testedVersion": "1.62",
        "canvas": "evidence/sketchel/canvas.webp",
        "canvasLight": "evidence/sketchel/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 113.45,
          "paclitaxelMb": 117.6,
          "baselineMb": null,
          "rssIdleMb": 198.56,
          "rssPaclitaxelMb": 202.36,
          "runs": 3,
          "processes": 1,
          "method": "Three paired fresh launches; MOL startup argument; 10-second settles; summed process-tree phys_footprint medians (MiB).",
          "note": "Separate empty/loaded launches preserve published MOL-argument route."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Fixed light interface and gray canvas; dark override has no effect."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "jar",
        "artifact": "SketchEl-1.62.jar",
        "ran": true,
        "failure": "Native image and structure exports could not be completed: automated filename entry did not reach the Java dialogs.",
        "downloadBytes": 496047,
        "installedBytes": 110776320,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/sketchel/simple.svg",
            "note": "SMILES produced no drawing; MOL fallback rendered correctly; native SVG and MOL saved.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/sketchel/complex.svg",
            "note": "SMILES produced no drawing; MOL fallback rendered correctly; native SVG and MOL saved.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": "match"
          }
        ],
        "observations": [
          "Default drawings use black strokes and atom labels on a gray canvas.",
          "MOL coordinates were preserved; only viewport zoom was adjusted.",
          "Paclitaxel retained visible solid and hashed stereobonds.",
          "Cholesterol SDF projection displays explicit hydrogens and red overlap markers.",
          "Native exports remain unverified; supplemental canvas crops are screenshots.",
          "Redraw: current Kekule SMILES paste returned No molecule data available for caffeine and paclitaxel; MOL fallback used.",
          "Redraw: native SVG and MDL MOL exports succeeded using keyboard filename entry; retained failure and earlier export observations describe the initial pass."
        ]
      },
      "perf": null,
      "downloadBytes": 496047,
      "references": [
        "https://sourceforge.net/projects/sketchel/"
      ]
    },
    {
      "id": "p26",
      "slug": "jsme-molecule-editor",
      "name": "JSME Molecule Editor",
      "rank": 60,
      "builtOn": {
        "relation": "fork",
        "editor": "JME",
        "libraries": [
          "OpenChemLib",
          "InChI"
        ],
        "source": "https://link.springer.com/article/10.1186/1758-2946-5-24",
        "note": "Modified JME code compiled to JavaScript; optional OpenChemLib and InChI integrations."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "JME/JSApplet; optional OpenChemLib SVG",
        "language": "Java (GWT-compiled to JavaScript)",
        "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/jsme/0ADE505A5718D4BE2E0EE1B7C54CC163.cache.js"
      },
      "enginesChecked": true,
      "languageNote": "Java compiled to JavaScript with GWT; underlying sources are not distributed.",
      "video": null,
      "embedding": {
        "methods": [
          "npm package",
          "script tag"
        ],
        "package": "jsme-editor",
        "limit": "BSD-3-Clause; retain license notices.",
        "how": "Load jsme.nocache.js; construct JSApplet.JSME(containerId, width, height) inside jsmeOnLoad."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "GWT output and browser integrations"
        },
        {
          "language": "C",
          "role": "InChI compiled to browser asm.js"
        }
      ],
      "thirdParty": {
        "summary": "Apache-2.0 Harmony/GWT/Mosaic/Exporter, BSD-3-Clause OpenChemLib and MIT or NCSA Emscripten; InChI 1.05 uses custom IUPAC/InChI-Trust Licence 1.0 with library copyleft, source-distribution obligations and modified-output naming restrictions.",
        "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/license.txt",
        "notice": null,
        "libraries": [
          {
            "name": "JME",
            "license": null,
            "source": null
          },
          {
            "name": "OpenChemLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/Actelion/openchemlib/blob/master/LICENSE"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "JSME is primarily a browser component for entering molecules, reactions and search queries in other web applications.",
      "summary": "A browser-based editor for drawing molecules and reactions and entering chemical search queries in web applications.",
      "website": "https://jsme-editor.github.io/",
      "repo": "https://github.com/jsme-editor/jsme-editor.github.io",
      "docs": "https://jsme-editor.github.io/help.html",
      "vendor": "Peter Ertl and Bruno Bienfait",
      "license": {
        "kind": "open-source",
        "spdx": "BSD-3-Clause",
        "text": "BSD 3-Clause license; permits commercial use and redistribution.",
        "source": "https://jsme-editor.github.io/dist/license.txt"
      },
      "price": {
        "text": "Free",
        "source": "https://jsme-editor.github.io/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": true,
        "offline": true
      },
      "version": {
        "name": "v2021.07.13",
        "date": "2021-07-13",
        "source": "https://github.com/jsme-editor/jsme-editor.github.io/releases/tag/v2021.07.13"
      },
      "engine": {
        "rendering": "Browser SVG through JSApplet; optional OpenChemLib SVG export",
        "chemistry": "In-house JME chemistry; optional OpenChemLib and InChI",
        "ui": "GWT, JSApplet AWT emulation and GWT Mosaic",
        "source": "https://jcheminf.biomedcentral.com/counter/pdf/10.1186/1758-2946-5-24"
      },
      "languages": [
        "Java"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/dist/release_notes.txt",
          "note": "Drew single and changed bond to double and triple.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-bonds-core.webp",
            "caption": "Double and triple bonds on the editor canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/dist/release_notes.txt",
          "note": "Wedge drawing and imported hashes visible; wavy not verified.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-stereo-bonds.webp",
            "caption": "Molecule with solid and hashed wedge bonds."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Menu includes coordination bond; another specialist type not found.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-special-bonds.webp",
            "caption": "Editor menu lists a disabled coordination bond command."
          }
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/help.html",
          "note": "Aromatic ring produced benzene; other ring sizes shown.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-rings.webp",
            "caption": "Benzene on the canvas with ring tools above."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/help.html",
          "note": "Chain tool creates carbon chains and saturated rings."
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/help.html",
          "note": "Functional-group menu visible; attempted placement produced ethane.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-templates.webp",
            "caption": "Functional-group menu beside a benzene ring."
          }
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/JSME_template.html",
          "note": "Save JME drawings and reuse named templates through the supplied demo."
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/release_notes.txt",
          "note": "Isotopic atoms and atomic-charge editing are implemented.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-atom-labels.webp",
            "caption": "Element toolbar and change atom charge command."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/release_notes.txt",
          "note": "Atom changes and ring shortcuts work under the pointer."
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Forward reaction arrow shown; other arrow types not found.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-reaction-arrows.webp",
            "caption": "Reactants and product connected by a forward arrow."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved electron-pushing arrow control found."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/",
          "note": "Sample reaction exported as reaction SMILES.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-reaction-data.webp",
            "caption": "Reaction menu offers SMIRKS and RXN copy options."
          }
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/help.html",
          "note": "Manual reaction mapping through atom numbering."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/release_notes.txt",
          "note": "Selected-molecule popup recomputes 2D coordinates.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-cleanup.webp",
            "caption": "Editor menu offers a compute 2D coordinates command."
          },
          "engine": {
            "library": "OpenChemLib (GWT-compiled JavaScript)",
            "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/jsme/deferredjs/0ADE505A5718D4BE2E0EE1B7C54CC163/7.cache.js"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/JSME_atom_highlight_demo.html",
          "note": "Individual atom and bond background colors through the API."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass calculation control found."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/JSME_chemical_resolver_demo.html",
          "note": "Generic input of caffeine as a name returned empty."
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/JSME_chemical_resolver_demo.html",
          "note": "Official demo requests IUPAC names from the external NCI service.",
          "engine": {
            "library": "NCI Chemical Identifier Resolver (remote server, official demo)",
            "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/JSME_chemical_resolver_demo.html#L89-L111"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/help.html",
          "note": "SMARTS atom and bond queries; R-group support.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-markush.webp",
            "caption": "Atom and bond query dialog with element and bond options."
          }
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/JSME_template_aminoacids.html",
          "note": "Official peptide-builder demo supplies amino-acid building blocks for manual assembly."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/JSME_chemical_resolver_demo.html",
          "note": "Official demo fetches structures through the NCI Chemical Identifier Resolver.",
          "engine": {
            "library": "NCI Chemical Identifier Resolver (remote server, official demo)",
            "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/JSME_chemical_resolver_demo.html#L43-L68"
          }
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No rotatable 3D model view found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML import or export command found."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/api_javadoc/export/client/JSME.html",
          "note": "MOL import/export and single-record SDF import worked.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-mol-sdf.webp",
            "caption": "Test page with MOL import and MOL and SDF export controls."
          },
          "engine": {
            "library": "Ported from JME (GWT-compiled JavaScript, MOL/SDF import and MOL export); OpenChemLib (GWT-compiled JavaScript, V3000 import)",
            "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/jsme/0ADE505A5718D4BE2E0EE1B7C54CC163.cache.js"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/dist/doc.html",
          "note": "Imported and exported both 2D fixture SMILES.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-smiles.webp",
            "caption": "SMILES dialog above a glutathione structure."
          },
          "engine": {
            "library": "OpenChemLib (GWT-compiled JavaScript, import); Ported from JME (GWT-compiled JavaScript, export)",
            "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/jsme/deferredjs/0ADE505A5718D4BE2E0EE1B7C54CC163/1.cache.js"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/JSME_inchi_direct_interactive.html",
          "note": "InChI is calculated in JavaScript within the browser.",
          "engine": {
            "library": "InChI (Emscripten asm.js, browser)",
            "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/jsme/96E40B969193BD74B8A621486920E79C.cache.js"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/jsme-editor/jsme-editor.github.io/blob/74de5c7b3a594bd9cef753c6391819a656a3335a/dist/api_javadoc/export/client/JSME.html",
          "note": "Reads RXN; molFile exports RXN for reaction drawings.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-rxn.webp",
            "caption": "Reaction menu offers RXN copy and paste commands."
          }
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://jsme-editor.github.io/dist/doc.html",
          "note": "Raw SVG copy dialog works after enabling exportSVG option.",
          "shot": {
            "image": "evidence/jsme-molecule-editor/f-svg-export.webp",
            "caption": "Copy dialog containing SVG markup over the molecule editor."
          }
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export command found."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG export command found."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/doc.html",
          "note": "Documented JavaScript constructors, methods and callbacks."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/doc.html",
          "note": "JavaScript callbacks extend paste handling and structure-change behavior."
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/doc.html",
          "note": "Load jsme.nocache.js; construct JSApplet.JSME(containerId, width, height) inside jsmeOnLoad."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://jsme-editor.github.io/dist/JSME_atom_highlight_demo.html",
          "note": "API sets colored backgrounds on individual atoms and bonds."
        }
      },
      "caveats": [
        "SVG export requires enabling the optional OpenChemLib integration.",
        "Name conversion uses an external NCI web service in the supplied demonstration.",
        "The distribution provides optimized JavaScript, without the underlying Java sources."
      ],
      "github": {
        "url": "https://github.com/jsme-editor/jsme-editor.github.io",
        "stars": 110,
        "checkedOn": "2026-11-06",
        "firstCommit": "2020-12-06",
        "commits": 63,
        "contributors": 5,
        "pushedAt": "2025-03-09T10:34:50Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "v2024-04-29",
        "canvas": "evidence/jsme-molecule-editor/canvas.webp",
        "canvasLight": "evidence/jsme-molecule-editor/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 90.39,
          "paclitaxelMb": 98.46,
          "baselineMb": 50.18,
          "rssIdleMb": 337.69,
          "rssPaclitaxelMb": 354.11,
          "runs": 3,
          "processes": 4,
          "method": "Headless Chromium process tree; summed phys_footprint, MiB; median of fresh runs.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://jsme-editor.github.io/dist/JSME_test.html",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/jsme-molecule-editor/simple.svg",
            "note": "SVG copy enabled; drawing area scaled for visibility.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/jsme-molecule-editor/complex.svg",
            "note": "SVG copy enabled; default drawing retained.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No rotatable 3D model view found in editor controls.",
            "structure": null
          }
        ],
        "observations": [
          "Caffeine appears small and centered in the default editor area.",
          "Paclitaxel fits the canvas with colored heteroatoms and stereo bonds.",
          "Both MOL outputs matched fixture structures, including stereochemistry, using RDKit.",
          "The test page starts with a glutathione example; Clear Editor removes it.",
          "Raw SVG is exposed through a copy dialog after enabling exportSVG."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 95,
        "transferBytes": 208809
      },
      "downloadBytes": 1013352,
      "references": [
        "https://github.com/jsme-editor/jsme-editor.github.io",
        "https://jsme-editor.github.io/dist/index.html",
        "https://jsme-editor.github.io/dist/doc.html"
      ]
    },
    {
      "id": "p68",
      "slug": "chemifree",
      "name": "Chemifree",
      "rank": 61,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/EunhakChoi/chemifree/blob/c5b475281f98782b64ff1086e5816d957f2ebea4/apps/web/src/editor/structure-canvas.tsx#L124",
        "note": "Custom SVG canvas and in-house Rust chemistry."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Chemifree SVG DrawingLayer",
        "language": "TypeScript",
        "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/apps/web/src/editor/structure-canvas.tsx#L648"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript, Python and C support tests/tooling; HTML/CSS provide presentation.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Local web workspace; no supported editor embedding interface documented."
      },
      "otherLanguages": [
        {
          "language": "Rust",
          "role": "Chemistry, codecs and local API"
        }
      ],
      "thirdParty": {
        "summary": "MIT/ISC UI components and icons; OFL-1.1 font (Geist).",
        "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/THIRD_PARTY_NOTICES.md",
        "notice": "https://github.com/EunhakChoi/chemifree/blob/main/THIRD_PARTY_NOTICES.md",
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "This working drawing prototype lacks captions and scene export, so it cannot yet produce publication-grade chemical drawing documents.",
      "summary": "An early-stage chemical drawing workspace for local structure editing, inspection and limited chemical file conversion.",
      "website": "https://github.com/EunhakChoi/chemifree",
      "repo": "https://github.com/EunhakChoi/chemifree",
      "docs": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md",
      "vendor": "EunhakChoi",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT license; free to use, modify and redistribute.",
        "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/LICENSE"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/EunhakChoi/chemifree/releases"
      },
      "engine": {
        "rendering": "SVG in the browser; scene/file rendering export is unimplemented.",
        "chemistry": "In-house Rust models for bounded valence, aromaticity, identity, stereochemistry and formula/mass calculations.",
        "ui": "React and TypeScript with shadcn/ui (Base UI), Tailwind CSS and Vite.",
        "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/README.md"
      },
      "languages": [
        "Rust",
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/README.md#run-locally",
          "note": "Created a bond and cycled single, double and triple orders.",
          "shot": {
            "image": "evidence/chemifree/f-bonds-core.webp",
            "caption": "Bond toolbar and structure with single and double bonds."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#stereo-marks-and-configurations",
          "note": "Applied solid wedge, hashed wedge and wavy marks.",
          "shot": {
            "image": "evidence/chemifree/f-stereo-bonds.webp",
            "caption": "Stereo bond tools and a wavy bond on the canvas."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/apps/web/src/components/document-workspace.tsx#L127",
          "note": "Dative available; no hydrogen or quadruple bond tools."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1312",
          "note": "Dedicated ring insertion remains planned."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1312",
          "note": "Structure and substituent template insertion remains planned."
        },
        "custom-templates": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1324",
          "note": "User templates remain planned."
        },
        "abbreviations": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1324",
          "note": "Abbreviation collapse and expansion remain planned."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/README.md#run-locally",
          "note": "Element labels, charges and isotope mass numbers are editable."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#document-settings-and-preferences",
          "note": "Editable radical states render as dots or rings."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/apps/web/src/editor/structure-canvas.tsx#L54",
          "note": "Marquee selection and movement; rotation, flip and resize unavailable."
        },
        "perspective": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1397",
          "note": "3D coordinates and projected scene geometry remain planned."
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/crates/domain/src/scene.rs#L50",
          "note": "Inserted forward arrow; no alternate arrow types shown.",
          "shot": {
            "image": "evidence/chemifree/f-reaction-arrows.webp",
            "caption": "A forward arrow beside a structure on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1370",
          "note": "Electron-pushing arrows remain planned."
        },
        "reaction-data": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#documents",
          "note": "Chemical reaction documents remain unimplemented."
        },
        "atom-mapping": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1751",
          "note": "Reaction atom mapping remains planned."
        },
        "orbitals": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1381",
          "note": "Orbital and scientific-symbol scene types remain planned."
        },
        "rich-text": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#documents",
          "note": "Free-text captions remain unimplemented."
        },
        "shapes": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/crates/domain/src/scene.rs#L50",
          "note": "Forward arrow inserted; line and rectangle commands present.",
          "shot": {
            "image": "evidence/chemifree/f-shapes.webp",
            "caption": "A forward arrow beside a structure on the canvas."
          }
        },
        "align": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1263",
          "note": "Alignment and distribution remain planned."
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#edits",
          "note": "Group, ungroup and move scene objects together."
        },
        "cleanup": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#operation-contract-1",
          "note": "CLI layout.structure reports operation_not_implemented."
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#document-settings-and-preferences",
          "note": "Save document styles; import settings or reuse new-document defaults."
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#guarantees-and-known-limits",
          "note": "One page; multipage documents unimplemented."
        },
        "pictures": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1370",
          "note": "Image scene objects remain planned."
        },
        "tlc-tables": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L2411",
          "note": "Tables, TLC plates and gels remain planned."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#valence-inspection",
          "note": "Bounded valence model flags invalid and unsupported atom states.",
          "engine": {
            "library": "In-house (Rust chemifree-valence-3 bounded valence model)",
            "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/crates/domain/src/chemistry.rs#L75"
          }
        },
        "stereo-perception": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#cip-labels",
          "note": "Labels stored configurations; CIP Rules 4a–5 and pseudoasymmetry unsupported.",
          "shot": {
            "image": "evidence/chemifree/f-stereo-perception.webp",
            "caption": "Stereo panel with atom and bond label switches."
          },
          "engine": {
            "library": "In-house (Rust chemifree-cip-1 R/S and E/Z labeler; bounded CIP rules)",
            "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/crates/domain/src/cip.rs#L460"
          }
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#formula-and-mass-properties",
          "note": "Formula works; mass refused without compatible external dataset.",
          "engine": {
            "library": "In-house (Rust formula and mass calculations with externally loaded mass-table data)",
            "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/crates/domain/src/mass.rs#L205"
          }
        },
        "properties": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L2046",
          "note": "XLogP calculation remains planned."
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#operation-contract-1",
          "note": "CLI name parser reports operation_not_implemented."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#operation-contract-1",
          "note": "CLI naming reports operation_not_implemented."
        },
        "nmr-prediction": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L2205",
          "note": "Proton and carbon NMR prediction remain planned."
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#documents",
          "note": "Element-list and generic query atoms; substructure matching supported."
        },
        "polymers": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L2294",
          "note": "Polymer repeat-unit and SRU semantics remain planned."
        },
        "biomolecules": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#operation-contract-1",
          "note": "Biopolymer expansion unimplemented."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "No 3D view; cholesterol SDF import refused."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#cdxml-interchange",
          "note": "Exported and reimported caffeine; bounded profile reports losses.",
          "engine": {
            "library": "In-house (Rust CDXML reader and writer using roxmltree; interchange-tree export)",
            "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/crates/providers/src/cdxml.rs#L104"
          }
        },
        "cdx": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#cdxml-interchange",
          "note": "Bounded codec; edited drawings cannot be exported as CDX.",
          "engine": {
            "library": "In-house (Rust CDX binary reader and writer; interchange-tree export)",
            "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/crates/providers/src/cdx/mod.rs#L1"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#mol-and-sdf-subset",
          "note": "2D MOL import/export and SDF export work; cholesterol SDF refused.",
          "shot": {
            "image": "evidence/chemifree/f-mol-sdf.webp",
            "caption": "MOL and SDF controls show a rejected 3D SDF import."
          },
          "engine": {
            "library": "In-house (Rust V2000Codec with V2000/V3000 MOL and SDF handling)",
            "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/crates/providers/src/ctfile.rs#L939"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#smiles",
          "note": "Fixture imports and writes work; directional stereo is refused.",
          "engine": {
            "library": "In-house (Rust OpenSmilesCodec; bounded SMILES reader and writers)",
            "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/crates/providers/src/smiles/mod.rs#L34"
          }
        },
        "inchi": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#smiles",
          "note": "InChI explicitly unimplemented."
        },
        "rxn": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#mol-and-sdf-subset",
          "note": "Reaction CTfiles are unsupported."
        },
        "svg-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/crates/application/src/operations.rs#L893",
          "note": "render.scene refuses SVG; no GUI image export command."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1481",
          "note": "render.scene refuses PDF; no GUI image export command."
        },
        "png-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1457",
          "note": "render.scene refuses PNG; no GUI image export command."
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/roadmap/implementation-roadmap.json#L1280",
          "note": "Chemical clipboard exchange remains planned."
        },
        "office": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#operation-contract-1",
          "note": "Desktop and host integration unimplemented."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#operation-contract-1",
          "note": "CLI version, capabilities and operation requests executed."
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#operation-contract-1",
          "note": "Documented HTTP and JSON-lines operation interface for external agents."
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/docs/CONTRACT.md#cip-labels",
          "note": "Rust-only replacement of the CIP labeler through Application::with_cip_labeler."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/EunhakChoi/chemifree/blob/main/README.md#run-locally",
          "note": "Local web workspace; no supported editor embedding interface documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/EunhakChoi/chemifree/blob/dec69eb94c6c58a82584155473f223f98759f91c/apps/web/src/editor/structure-canvas.tsx#L500-L518",
          "note": "Selection and hover backgrounds only; scene export is unimplemented."
        }
      },
      "caveats": [
        "Early-stage source build; no tagged release, installer or hosted editor.",
        "One graph and page; captions and SVG/PDF/PNG scene export are unimplemented.",
        "CDXML/CDX imports have explicit losses; edited drawings cannot be exported to these formats."
      ],
      "github": {
        "url": "https://github.com/EunhakChoi/chemifree",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-10-26",
        "commits": 557,
        "contributors": 1,
        "pushedAt": "2026-11-05T19:34:58Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.1.0",
        "canvas": "evidence/chemifree/canvas.webp",
        "canvasLight": "evidence/chemifree/canvas-light.webp",
        "canvasDark": "evidence/chemifree/canvas-dark.webp",
        "memory": null,
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Canvas and interface both change."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "chemifree-9728a97.tar.gz",
        "ran": true,
        "failure": null,
        "downloadBytes": 2722060,
        "installedBytes": 116031488,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemifree/simple.png",
            "note": "Default grid layout retained; image is a tight canvas screenshot crop.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/chemifree/complex.png",
            "note": "Default grid retained; 11 stored configurations, no wedges; canvas screenshot crop.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "No 3D view; SDF rejected for nonzero atom field at column 40.",
            "structure": null
          }
        ],
        "observations": [
          "SMILES imports use an input-order grid without chemical layout.",
          "Bonds cross and labels overlap in both SMILES drawings.",
          "Paclitaxel stores 11 stereo configurations without drawing wedges.",
          "The default canvas uses a dark background and light bonds.",
          "Image evidence uses canvas crops because scene export is unimplemented."
        ]
      },
      "perf": null,
      "downloadBytes": 2722060,
      "references": [
        "https://github.com/EunhakChoi/chemifree",
        "https://github.com/EunhakChoi/chemifree/blob/main/README.md"
      ]
    },
    {
      "id": "p86",
      "slug": "radsketch",
      "name": "RadSketch",
      "rank": 62,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html",
        "note": "Self-contained canvas, molecular graph, valence checks, and SMILES parser; no chemistry dependencies."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "RadSketch Canvas 2D molecule renderer",
        "language": "JavaScript",
        "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L744-L997"
      },
      "enginesChecked": true,
      "languageNote": "HTML/CSS provide the interface; drawing and chemistry run in inline JavaScript.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "No software license declared",
        "how": "Standalone app; no documented embedding interface found."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Loads OFL-1.1 fonts (JetBrains Mono/Syne; font-only share-alike) from Google Fonts.",
        "source": "https://github.com/google/fonts/blob/2e05c1cf00a6e4f40a4b931600a90881c26e15cd/ofl/jetbrainsmono/OFL.txt",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "It is a standalone 2D structure and reaction drawing editor with figure export, although implementation defects limit publication use.",
      "summary": "An experimental browser-based chemical structure sketcher with templates, valence checks, and PNG and MOL export.",
      "website": "https://gteninbaum.github.io/RadSketch/",
      "repo": "https://github.com/GTeninbaum/RadSketch",
      "docs": null,
      "vendor": "Gabe Teninbaum (GTeninbaum)",
      "license": {
        "kind": "unclear",
        "spdx": null,
        "text": "Public source code without a declared license.",
        "source": "https://github.com/GTeninbaum/RadSketch/tree/b7450e40a71c6011fc0367f037ba210fcaf929c8"
      },
      "price": {
        "text": "Not published",
        "source": null
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/GTeninbaum/RadSketch/releases"
      },
      "engine": {
        "rendering": "HTML Canvas 2D with custom JavaScript screen and PNG renderers",
        "chemistry": "In-house JavaScript SMILES parser, valence tables and formula/mass calculations",
        "ui": "Vanilla HTML, CSS and JavaScript",
        "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L817-L848",
          "note": "Bond orders stored, but multiple bonds appear single on canvas.",
          "shot": {
            "image": "evidence/radsketch/f-bonds-core.webp",
            "caption": "Single, double and triple controls above three drawn bonds."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L817-L848",
          "note": "Wedge and dash draw; no wavy tool; MOL loses stereo.",
          "shot": {
            "image": "evidence/radsketch/f-stereo-bonds.webp",
            "caption": "Wedge and dash bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L837-L847",
          "note": "Double bonds use fixed symmetric offsets; no side selection."
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L628-L645",
          "note": "Benzene inserts, but canvas displays its double bonds as single.",
          "shot": {
            "image": "evidence/radsketch/f-rings.webp",
            "caption": "Ring controls and a six-membered ring on the canvas."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L647-L700",
          "note": "COOH template inserts; other templates are listed.",
          "shot": {
            "image": "evidence/radsketch/f-templates.webp",
            "caption": "Template buttons include COOH, glucose and adenine."
          }
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L593-L619",
          "note": "Charges and custom labels only; no separate isotope attribute.",
          "shot": {
            "image": "evidence/radsketch/f-atom-labels.webp",
            "caption": "Element and charge controls beside a structure with labeled atoms."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L1054-L1067",
          "note": "Keyboard handler supports navigation and editing commands, not atom/bond changes."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L403-L481",
          "note": "Lasso selection and movement only; no rotation, flip or resizing."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L852-L870",
          "note": "Forward and equilibrium arrows drawn.",
          "shot": {
            "image": "evidence/radsketch/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved-arrow control found in the interface."
        },
        "reaction-data": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L1021-L1036",
          "note": "Arrows store coordinates only and are omitted from chemical export."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L410-L481",
          "note": "Selected atoms move together; no persistent grouping or ungrouping."
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L730-L742",
          "note": "Flags excessive valence using a limited built-in element table.",
          "shot": {
            "image": "evidence/radsketch/f-valence-check.webp",
            "caption": "The molecule panel displays a valence indicator reading OK."
          },
          "engine": {
            "library": "In-house",
            "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L730-L742"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L872-L891",
          "note": "Caffeine displayed C8H10N4O2 and 194.19.",
          "shot": {
            "image": "evidence/radsketch/f-formula-mass.webp",
            "caption": "Caffeine structure with formula C8H10N4O2 and molecular weight 194.19."
          },
          "engine": {
            "library": "In-house",
            "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L872-L891"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Entering caffeine rendered a two-atom CH5N structure."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in the interface."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D viewer control found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML import or export control found."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L1020-L1043",
          "note": "MOL export works; no MOL or SDF import control found.",
          "engine": {
            "library": "In-house",
            "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L1020-L1043"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L893-L925",
          "note": "SMILES input renders; no SMILES output control found.",
          "shot": {
            "image": "evidence/radsketch/f-smiles.webp",
            "caption": "A SMILES entry and its rendered structure."
          },
          "engine": {
            "library": "In-house",
            "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L902-L925"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No SVG export control found."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export control found."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L960-L1004",
          "note": "PNG exported at 976 by 915 pixels, without resolution controls.",
          "shot": {
            "image": "evidence/radsketch/f-png-export.webp",
            "caption": "PNG output showing the exported caffeine structure."
          }
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L1006-L1018",
          "note": "Clipboard contains PNG images, without editable chemical structure data."
        },
        "office": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L1006-L1018",
          "note": "Office receives a PNG image without editable molecular structure."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/GTeninbaum/RadSketch",
          "note": "Standalone app; no documented embedding interface found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/GTeninbaum/RadSketch/blob/b7450e40a71c6011fc0367f037ba210fcaf929c8/index.html#L786",
          "note": "Atom selection/hover halos only; PNG and clipboard exports omit halos."
        }
      },
      "caveats": [
        "Unreleased single-file prototype with no README or declared license.",
        "Double/triple bonds display as single lines; several structure templates are chemically incorrect.",
        "PNG is viewport-sized; SMILES import and MOL export lose chemical detail."
      ],
      "github": {
        "url": "https://github.com/GTeninbaum/RadSketch",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-04-12",
        "commits": 1,
        "contributors": 1,
        "pushedAt": "2026-04-12T23:58:03Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "b7450e4",
        "canvas": "evidence/radsketch/canvas.webp",
        "canvasLight": null,
        "canvasDark": "evidence/radsketch/canvas-dark.webp",
        "memory": {
          "idleMb": 455,
          "paclitaxelMb": 450,
          "baselineMb": 410,
          "rssIdleMb": 1000.23,
          "rssPaclitaxelMb": 1004.8,
          "runs": 3,
          "processes": 7,
          "method": "Median fresh Chromium process-tree physical footprints; SMILES render; MiB.",
          "note": null
        },
        "themes": {
          "light": false,
          "dark": true,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://gteninbaum.github.io/RadSketch/",
        "ran": true,
        "failure": null,
        "downloadBytes": 54131,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/radsketch/simple.png",
            "note": "Correct connectivity; automatic layout overlaps atoms and bonds.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "smiles",
            "image": "evidence/radsketch/complex.png",
            "note": "Connectivity preserved, but MOL export loses all 11 specified stereocenters.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No 3D view found; skipped as instructed.",
            "structure": null
          }
        ],
        "observations": [
          "Hosted HTML matched repository commit b7450e4; no version string found.",
          "Caffeine and paclitaxel layouts contain overlapping bonds and atoms.",
          "Canvas shows multiple bonds as single lines; PNG shows multiple lines.",
          "The default PNG uses a white background and substantial whitespace.",
          "MOL exports preserve fixture connectivity but omit paclitaxel stereochemistry."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 204,
        "transferBytes": 82657
      },
      "downloadBytes": 54131,
      "references": [
        "https://github.com/GTeninbaum/RadSketch",
        "https://gteninbaum.github.io/RadSketch/",
        "https://github.com/GTeninbaum/RadSketch/blob/main/index.html"
      ]
    },
    {
      "id": "p139",
      "slug": "ketcherails",
      "name": "Ketcherails (ketcher-rails)",
      "rank": 63,
      "builtOn": {
        "relation": "fork",
        "editor": "Ketcher",
        "libraries": [
          "Open Babel",
          "InChI"
        ],
        "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/editor.js",
        "note": "Modified Ketcher 1.1 canvas adds polymer tools and coordination-bond rendering."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher 1.1 Raphaël renderer",
        "language": "JavaScript",
        "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/restruct_rendering.js#L75"
      },
      "enginesChecked": true,
      "languageNote": "HTML/Haml templates and SCSS/CSS provide presentation; Shell handles tooling.",
      "video": null,
      "embedding": {
        "methods": [
          "iframe"
        ],
        "package": "ketcherails",
        "limit": "Rails 5.2; GPLv3 wrapper and AGPLv3 editor.",
        "how": "Add ketcherails gem; iframe /ketcher; use contentWindow.ketcher for molecule exchange."
      },
      "otherLanguages": [
        {
          "language": "Ruby",
          "role": "Rails engine and server chemistry"
        }
      ],
      "thirdParty": {
        "summary": "Includes AGPL-3.0-only Ketcher; GPL-2.0-only Open Babel (GPL-3.0 wrapper); LGPL-2.1 inchi-gem; InChI 1.06 under legacy InChI-Trust 1.0 weak copyleft; MIT libraries/fonts.",
        "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/LICENSE.GPL",
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "Open Babel",
            "license": "GPL-2.0-only",
            "source": "https://github.com/openbabel/openbabel/blob/master/COPYING"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "It is a Rails engine for embedding a structure editor in applications, with host-managed templates and server chemistry services.",
      "summary": "A Rails component for embedding a 2D chemical structure editor with templates and server chemistry services.",
      "website": "https://github.com/ComPlat/ketcher-rails",
      "repo": "https://github.com/ComPlat/ketcher-rails",
      "docs": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/README.md",
      "vendor": "ComPlat research group, Karlsruhe Institute of Technology",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-3.0",
        "text": "Wrapper declares GPLv3; bundled Ketcher code carries AGPLv3 notices.",
        "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/README.md#license"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/README.md#license"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.1.12",
        "date": "2021-07-13",
        "source": "https://github.com/ComPlat/ketcher-rails/releases/tag/v0.1.12"
      },
      "engine": {
        "rendering": "Raphaël SVG/VML in the browser; Open Babel SVG and Inkscape template PNG conversion.",
        "chemistry": "Ketcher 1.1-beta JavaScript chemistry core; Open Babel; inchi-gem in current source.",
        "ui": "Ruby on Rails with Prototype.js, jQuery UI and Bootstrap.",
        "source": "https://github.com/ComPlat/ketcher-rails/tree/e3f11fef31a177fc69c3549cb0e195eb2276cf08"
      },
      "languages": [
        "JavaScript",
        "Ruby"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/ui/ui.js.erb#L867-L884",
          "note": "Drew single, double, triple; changed a single bond.",
          "shot": {
            "image": "evidence/ketcherails/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/ui/ui.js.erb#L869-L875",
          "note": "Drew wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/ketcherails/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/ui/ui.js.erb#L867-L884",
          "note": "Dative and dashed coordination are the available specialist bonds.",
          "shot": {
            "image": "evidence/ketcherails/f-special-bonds.webp",
            "caption": "Bond menu showing coordination bond options."
          }
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/templates.js#L16-L168",
          "note": "Placed benzene and cyclopropane; other sizes shown.",
          "shot": {
            "image": "evidence/ketcherails/f-rings.webp",
            "caption": "Benzene and cyclopropane rings on the drawing canvas."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/db/common_templates.json#L2016-L2030",
          "note": "Chair templates are included in the seed library."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/editor.js#L818-L845",
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/db/template_categories.json",
          "note": "Template search was empty; custom template endpoint returned 500."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/README.md#usage",
          "note": "Personal templates require host authentication and server storage."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/ui/ui.js.erb#L2006-L2055",
          "note": "Approved abbreviations resolve to structures and chemical S-groups."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/ui/ui.js.erb#L1984-L1990",
          "note": null
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/views/ketcherails/ketcher/index.html.erb#L624-L631",
          "note": "Mono- and diradical atom settings."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/editor.js#L251-L278",
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/ui/ui.js.erb#L822-L1024",
          "note": "Lasso, rotation and flips; no resize tool."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/views/ketcherails/ketcher/index.html.erb#L408-L422",
          "note": "Drew forward arrow; no alternate arrow types shown.",
          "shot": {
            "image": "evidence/ketcherails/f-reaction-arrows.webp",
            "caption": "A forward arrow alongside bond and ring drawings."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Reaction menu exposes straight arrow, plus, and mapping tools."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/chem/molfile.js#L1111-L1130",
          "note": "RXN serialization; reactions containing R-groups are rejected."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/editor.js#L1491-L1539",
          "note": "Manual reactant/product atom mapping."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/chem/sgroup.js#L266-L314",
          "note": "Chemical S-group brackets only."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/editor.js",
          "note": "Atoms and bonds group through chemical S-groups."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/api/ketcherails/ketcher_api.rb#L16-L81",
          "note": "Server-side Open Babel generates 2D coordinates.",
          "shot": {
            "image": "evidence/ketcherails/f-cleanup.webp",
            "caption": "Clean command in the toolbar above drawn structures."
          },
          "engine": {
            "library": "Open Babel (Ruby bindings, application server; gen2D)",
            "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/api/ketcherails/ketcher_api.rb#L35"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/restruct_rendering.js#L1077-L1087",
          "note": "Invalid connectivity receives a red warning.",
          "engine": {
            "library": "Ketcher (bundled JavaScript)",
            "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/chem/struct_valence.js#L438"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/periodic_table.js#L129-L208",
          "note": "Paclitaxel formula and molecular weight displayed.",
          "shot": {
            "image": "evidence/ketcherails/f-formula-mass.webp",
            "caption": "Molecule properties show molecular weight and formula."
          },
          "engine": {
            "library": "In-house (JavaScript; Ketcher implicit hydrogens)",
            "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/periodic_table.js#L185"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Entering caffeine in Open produced no structure."
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/api/ketcherails/ketcher_api.rb#L90-L100",
          "note": "Molecule properties returned paclitaxel IUPAC name.",
          "shot": {
            "image": "evidence/ketcherails/f-structure-to-name.webp",
            "caption": "Molecule properties show an IUPAC name above the drawing."
          },
          "engine": {
            "library": "PubChem PUG REST (remote web service, through Rails server)",
            "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/lib/ketcherails/pub_chem.rb#L11"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/views/ketcherails/ketcher/index.html.erb#L425-L450",
          "note": "R-group labels, fragments and attachment points."
        },
        "polymers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/chem/sgroup.js#L592-L637",
          "note": "Semantic SRU repeat units with connectivity and MOL serialization."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/api/ketcherails/amino_acids_api.rb#L5-L19",
          "note": "Builds structures from hyphenated amino acid or peptoid monomer sequences."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SDF opened as flat drawing; no 3D viewport found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "CDXML text produced no drawing; no CDXML save option."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://link.springer.com/article/10.1186/s13321-018-0292-9",
          "note": "MOL read and written; single SDF opened flat.",
          "shot": {
            "image": "evidence/ketcherails/f-mol-sdf.webp",
            "caption": "Save File dialog shows MDL/Symyx Molfile text."
          },
          "engine": {
            "library": "Ketcher (JavaScript MOL); In-house (Ruby SDF import)",
            "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/chem/molfile.js#L53"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/ui/ui.js.erb#L1193-L1409",
          "note": "SMILES output worked; SMILES imports produced no drawing.",
          "engine": {
            "library": "Ketcher (bundled JavaScript; export only)",
            "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/chem/smiles.js#L45"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/api/ketcherails/ketcher_api.rb#L104-L117",
          "note": "Server export added after v0.1.12.",
          "engine": {
            "library": "InChI (C via inchi-gem native Ruby extension, server)",
            "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/api/ketcherails/ketcher_api.rb#L104"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/chem/molfile.js#L1111-L1130",
          "note": "Reads and writes MDL RXN reaction data."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/README.md#usage",
          "note": "SVG getter exposed through the embedding API."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export command found."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG export command found."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/README.md#usage",
          "note": "Documented JavaScript getters and molecule setter."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/master/README.md#usage",
          "note": "Add ketcherails gem; iframe /ketcher; use contentWindow.ketcher for molecule exchange."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/ComPlat/ketcher-rails/blob/e3f11fef31a177fc69c3549cb0e195eb2276cf08/app/assets/javascripts/ketcherails/rnd/render.js#L558-L570",
          "note": "Highlighting is limited to fixed green selection backgrounds and hover halos."
        }
      },
      "caveats": [
        "Requires a host Rails application; personal templates require Warden authentication.",
        "The paper claims SMILES import and mobile use; import is stubbed and touch handling disabled.",
        "README declares GPLv3; bundled Ketcher source declares AGPLv3."
      ],
      "github": {
        "url": "https://github.com/ComPlat/ketcher-rails",
        "stars": 3,
        "checkedOn": "2026-11-06",
        "firstCommit": "2016-05-18",
        "commits": 164,
        "contributors": 9,
        "pushedAt": "2024-08-06T03:42:13Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.1.12",
        "canvas": "evidence/ketcherails/canvas.webp",
        "canvasLight": "evidence/ketcherails/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 485.89,
          "paclitaxelMb": 520.89,
          "baselineMb": 431.89,
          "rssIdleMb": 1025.58,
          "rssPaclitaxelMb": 1061.56,
          "runs": 3,
          "processes": 9,
          "method": "Playwright Chromium process tree and crash handlers; summed macOS physical footprints.",
          "note": "MOL pasted through Open; local source server excluded."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "v0.1.12.tar.gz",
        "ran": true,
        "failure": null,
        "downloadBytes": 8184479,
        "installedBytes": 692969472,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/ketcherails/simple.png",
            "note": "SMILES produced no drawing; MOL coordinates used.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/ketcherails/complex.png",
            "note": "SMILES produced no drawing; MOL coordinates used, with overlapping labels.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": "match"
          }
        ],
        "observations": [
          "Page title identifies the embedded editor as Ketcher v1.1-beta.",
          "SMILES layout endpoint returned a stub response for both fixtures.",
          "Image captures show the drawing area; no image export was offered.",
          "Paclitaxel MOL displayed overlapping labels at default style.",
          "Molecule properties retrieved a systematic name from the configured service."
        ]
      },
      "perf": null,
      "downloadBytes": 8184479,
      "references": [
        "https://github.com/ComPlat/ketcher-rails",
        "https://github.com/ComPlat/ketcher-rails",
        "https://github.com/ComPlat/ketcher-rails"
      ]
    },
    {
      "id": "p56",
      "slug": "butlerov",
      "name": "Butlerov",
      "rank": 64,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/controller/MoleculeEditor.ts",
        "note": "In-house molecular graph, SMILES parser, mass calculations, and chemical drawing."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Butlerov bond and label drawing (Konva)",
        "language": "TypeScript",
        "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/drawables/Edge.ts#L232-L617"
      },
      "enginesChecked": true,
      "languageNote": "Vue components use TypeScript; JavaScript handles builds, HTML/CSS presentation.",
      "video": null,
      "embedding": {
        "methods": [
          "npm package",
          "script tag"
        ],
        "package": "@butlerov-chemistry/core",
        "limit": "MIT license.",
        "how": "Instantiate MoleculeEditor with a div stage; npm or UMD script."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "MIT (Konva/Vue/Vuetify); Apache-2.0 (MDI icon fonts in desktop app).",
        "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/package-lock.json",
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "Butlerov primarily supplies a single-structure input component for embedding in web applications.",
      "summary": "An embeddable 2D chemical structure editor for drawing molecules in web applications.",
      "website": "https://github.com/eizemazal/butlerov",
      "repo": "https://github.com/eizemazal/butlerov",
      "docs": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/README.md",
      "vendor": "Lumiprobe Group",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT license permits commercial and noncommercial use.",
        "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/README.md#license"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "vue-0.1.7",
        "date": "2026-04-03",
        "source": "https://github.com/eizemazal/butlerov/releases/tag/vue-0.1.7"
      },
      "engine": {
        "rendering": "Konva.js on HTML canvas",
        "chemistry": "In-house TypeScript molecular graph, converters and formula/mass calculations",
        "ui": "Konva controls; Vue 3 wrapper; Electron desktop shell",
        "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/controller/MoleculeEditor.ts"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/controller/MoleculeEditor.ts#L758-L775",
          "note": "Changed a bond to single, double, and triple.",
          "shot": {
            "image": "evidence/butlerov/f-bonds-core.webp",
            "caption": "Bond menu lists single, double, and triple options."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/drawables/Edge.ts#L266-L299",
          "note": "Solid, hollow down wedge and wavy; no hashed wedge.",
          "shot": {
            "image": "evidence/butlerov/f-stereo-bonds.webp",
            "caption": "Molecule with solid and hollow wedge bonds."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/controller/MoleculeEditor.ts#L761-L770",
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/controller/MoleculeEditor.ts#L855-L876",
          "note": "Created cyclohexane and phenyl using context menus.",
          "shot": {
            "image": "evidence/butlerov/f-rings.webp",
            "caption": "Ring menu lists phenyl and cycloalkane sizes."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/controller/MoleculeEditor.ts#L879-L890",
          "note": "Menu adds chosen chain length; no drag tool observed.",
          "shot": {
            "image": "evidence/butlerov/f-chains.webp",
            "caption": "Atom menu includes an Add normal chain option."
          }
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No library beyond rings found in inspected menus."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/converter/LinearFormula.ts",
          "note": "Recognizes abbreviation tokens and expands them into molecular graphs."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/controller/MoleculeEditor.ts",
          "note": "Element/custom labels, charge shortcuts and isotope selection.",
          "shot": {
            "image": "evidence/butlerov/f-atom-labels.webp",
            "caption": "Atom menu includes Edit and Isotopes options."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/README.md#how-to-use-it",
          "note": "Keyboard shortcuts changed bond orders and inserted rings.",
          "shot": {
            "image": "evidence/butlerov/f-keyboard-drawing.webp",
            "caption": "Bond menu displays keyboard shortcuts for bond types."
          }
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/controller/MoleculeEditor.ts#L146-L458",
          "note": "Selection limited to connected components, chains, rings and molecular fragments."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No arrow command found in inspected editor menus."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved-arrow command found in inspected menus."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/README.md#how-to-use-it",
          "note": "Local automatic geometry adjustments and symmetry tools only."
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/controller/MoleculeEditor.ts#L44-L85",
          "note": "Reusable API styles; editor document serialization omits bond/font styles."
        },
        "color": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/drawables/Edge.ts#L127-L158",
          "note": "Shared theme sets atom and bond colors, not individual objects."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/vue/README.md#descriptor-api-lazy--debounced",
          "note": "Adapter displayed formula and molecular weight from editor API.",
          "engine": {
            "library": "In-house",
            "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/descriptor/mw.ts"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name conversion command found in inspected menus."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in inspected menus."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view command found in inspected menus."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML command found in inspected menus."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/converter/MolConverter.ts",
          "note": "Adapter read and wrote MOL; one SDF record loaded.",
          "engine": {
            "library": "In-house (MOL V2000; first SDF record only)",
            "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/converter/MolConverter.ts"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/converter/SmilesConverter.ts#L18-L32",
          "note": "Import corrupted both fixtures; SMILES export reports unimplemented.",
          "shot": {
            "image": "evidence/butlerov/f-smiles.webp",
            "caption": "Loaded SMILES appears above an overlapping molecular drawing."
          },
          "engine": {
            "library": "In-house (SMILES import only)",
            "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/converter/SmilesConverter.ts#L18-L32"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No SVG export command found in inspected menus."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export command found in inspected menus."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG export command found in inspected menus."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/README.md#main-api-quick-reference",
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/README.md",
          "note": "Instantiate MoleculeEditor with a div stage; npm or UMD script."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/packages/core/src/drawables/Edge.ts#L161-L194",
          "note": "Configurable colored underlays highlight selected atoms and bonds in widget."
        }
      },
      "caveats": [
        "Single-structure canvas; documented multi-object scheme mode is not implemented.",
        "SMILES export is unimplemented despite documentation showing converter-based serialization.",
        "Documentation lists V3000/SDF; converter implements V2000 and reads only the first SDF record."
      ],
      "github": {
        "url": "https://github.com/eizemazal/butlerov",
        "stars": 13,
        "checkedOn": "2026-11-06",
        "firstCommit": "2022-06-20",
        "commits": 151,
        "contributors": 7,
        "pushedAt": "2026-04-03T15:16:34Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.1.6",
        "canvas": "evidence/butlerov/canvas.webp",
        "canvasLight": "evidence/butlerov/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 169.28,
          "paclitaxelMb": 171.28,
          "baselineMb": 49.28,
          "rssIdleMb": 397.12,
          "rssPaclitaxelMb": 408.25,
          "runs": 3,
          "processes": 4,
          "method": "Median Chromium process-tree physical footprints; headless, SMILES import; 10-second waits.",
          "note": "Local adapter renders overlapping structure and loses stereochemistry."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "SMILES import overlaps and loses stereochemistry."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "index.html",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "smiles",
            "image": "evidence/butlerov/simple.png",
            "note": "Local adapter SMILES produces a severely overlapping layout.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "smiles",
            "image": "evidence/butlerov/complex.png",
            "note": "Local adapter SMILES overlaps severely and loses stereochemistry.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": null
          }
        ],
        "observations": [
          "CodePen returned a Cloudflare verification page in headless Chromium.",
          "Local adapter used core package 0.1.6; buttons expose its API.",
          "SMILES caffeine became C8H14N4O2 instead of C8H10N4O2.",
          "MOL round trips preserved both fixtures' isomeric structures.",
          "Down bonds display hollow wedges rather than hashed wedges.",
          "Current Kekule caffeine SMILES preserves connectivity but produces an overlapping layout.",
          "Current Kekule paclitaxel SMILES retains connectivity but loses stereochemistry.",
          "Hosted demo canvas paste did not load either SMILES; its MOL text box has no load button.",
          "New captures use the earlier local adapter; its core bundle matches the hosted demo bundle byte-for-byte."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 270,
        "transferBytes": 402464
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/eizemazal/butlerov",
        "https://github.com/eizemazal/butlerov/blob/e4e64ae461832ce63bfeb5ff260ac8501edbac80/README.md"
      ]
    },
    {
      "id": "p81",
      "slug": "schematic",
      "name": "schematic",
      "rank": 65,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/editor.ts#L1-L76",
        "note": "Custom SVG editor with in-house SMILES parsing, layout, and chemistry."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Schematic SVG bond and label renderer",
        "language": "TypeScript",
        "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/render/renderer.ts#L136-L181"
      },
      "enginesChecked": true,
      "languageNote": "HTML/CSS provide interface presentation.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "No declared source license.",
        "how": "Standalone application; no documented editor embedding route."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "A standalone editor produces 2D structure and reaction drawings with ACS styling, vector SVG and print-resolution PNG export.",
      "summary": "Browser-based editor for drawing 2D chemical structures and simple reaction schemes with SVG and PNG export.",
      "website": "https://grebenyyk.github.io/schematic/",
      "repo": "https://github.com/grebenyyk/schematic",
      "docs": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/README.md",
      "vendor": "Dimitry Grebenyuk",
      "license": {
        "kind": "unclear",
        "spdx": null,
        "text": "Public source code with no declared license.",
        "source": "https://github.com/grebenyyk/schematic/tree/ede2ccfe71c0a02d351bae9924ca38b5fbd92056"
      },
      "price": {
        "text": "Free",
        "source": "https://grebenyyk.github.io/schematic/"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/grebenyyk/schematic/releases"
      },
      "engine": {
        "rendering": "SVG DOM renderer and SVG export; HTML Canvas 2D rasterization for PNG.",
        "chemistry": "In-house TypeScript SMILES parser, 2D layout, valence and formula calculations.",
        "ui": "Vanilla DOM with TypeScript, HTML and CSS.",
        "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/editor.ts#L1-L76"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/README.md#controls",
          "note": "Drew a bond and cycled single, double, triple."
        },
        "stereo-bonds": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Chiral SMILES rendered only plain bonds; no stereo tools visible."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/README.md#controls",
          "note": "Placed benzene; tool indicates sizes 3–8."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/interaction/tools/chain.ts#L16-L60",
          "note": "Chain tool visible; attempted drags produced no chain."
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No template library visible."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/editor.ts#L504-L530",
          "note": "Charge and element controls; isotope editing/display is incomplete."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/README.md#controls",
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/interaction/tools/select.ts#L16-L147",
          "note": "Lasso and rotation; no exposed flip or resize controls."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/core/model/reaction.ts#L3-L12",
          "note": "Drew a forward arrow; no alternate arrow controls visible."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow tool visible."
        },
        "reaction-data": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/core/model/reaction.ts#L3-L12",
          "note": "Arrows are scene elements, without reactant/product relationships."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/core/style/presets.ts#L3-L18",
          "note": "ACS Document 1996 default."
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/core/chem/formula.ts#L4-L32",
          "note": "Caffeine displayed C₈H₁₀N₄O₂ and 194.19 g/mol.",
          "shot": {
            "image": "evidence/schematic/f-formula-mass.webp",
            "caption": "Caffeine structure with its molecular formula and mass."
          },
          "engine": {
            "library": "In-house (TypeScript formula, implicit hydrogens and atomic-weight table)",
            "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/core/chem/formula.ts#L4-L32"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Pasting caffeine produced CH₃N, not caffeine."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command visible."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "no",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/grebenyyk/schematic/main/Minimal%20Molecule%20Sketcher%20%E2%80%94%20Architecture%20Blueprint.md",
          "note": "Sequence mode explicitly excluded from v1."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "no",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/grebenyyk/schematic/main/Minimal%20Molecule%20Sketcher%20%E2%80%94%20Architecture%20Blueprint.md",
          "note": "Database search explicitly excluded from v1."
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D viewer or control visible."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Pasting CDXML produced no structure; no file controls visible."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Pasting MOL produced no structure; no file controls visible."
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/core/chem/smiles.ts",
          "note": "SMILES paste works; no output command; chirality not depicted.",
          "engine": {
            "library": "In-house (TypeScript SMILES subset parser; import only)",
            "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/core/chem/smiles.ts#L22-L36"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/README.md#what-it-does",
          "note": "Downloaded SVG for both 2D fixtures."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Export menu offers SVG and PNG only."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/render/export.ts#L7-L62",
          "note": "PNG downloaded at 4200 × 4294; no DPI metadata."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/grebenyyk/schematic/blob/main/README.md",
          "note": "Standalone application; no documented editor embedding route."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/grebenyyk/schematic/blob/ede2ccfe71c0a02d351bae9924ca38b5fbd92056/src/render/export.ts#L11-L26",
          "note": "Selection halos only; SVG and PNG exports omit them."
        }
      },
      "caveats": [
        "No license is declared; no tagged release is available.",
        "SMILES import discards stereochemistry; some aromatic systems become single bonds.",
        "Blueprint plans for MOL/RXN, chemical clipboard and PWA exceed implemented functionality."
      ],
      "github": {
        "url": "https://github.com/grebenyyk/schematic",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-08-04",
        "commits": 57,
        "contributors": 1,
        "pushedAt": "2026-08-08T13:21:05Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.1.0 (ede2ccf)",
        "canvas": "evidence/schematic/canvas.webp",
        "canvasLight": "evidence/schematic/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 389,
          "paclitaxelMb": 392,
          "baselineMb": 381,
          "rssIdleMb": 974.2,
          "rssPaclitaxelMb": 990.2,
          "runs": 3,
          "processes": 7,
          "method": "Median of three fresh Playwright Chromium process trees; summed physical footprints.",
          "note": "Paclitaxel renders with crossing bonds and missing stereochemistry."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://grebenyyk.github.io/schematic/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/schematic/simple.svg",
            "note": "Caffeine displayed with the expected formula and mass.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "Severe bond crossings and stretched bonds; stereochemistry is not depicted.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No 3D view available in the interface.",
            "structure": null
          }
        ],
        "observations": [
          "Caffeine SMILES produced a readable drawing and correct formula.",
          "Paclitaxel layout contains long crossing bonds and overlapping labels.",
          "Pasted chiral SMILES displayed no wedge or hash bonds.",
          "Export menu offers SVG and PNG downloads.",
          "The hosted page shows no application version; deployed commit identifies the build."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 70,
        "transferBytes": 24032
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/grebenyyk/schematic",
        "https://grebenyyk.github.io/schematic/",
        "https://github.com/grebenyyk/schematic/blob/main/README.md"
      ]
    },
    {
      "id": "p76",
      "slug": "chemmd",
      "name": "ChemMD",
      "rank": 66,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/renderer.js#L1-L31",
        "note": "Own chemistry parser, layout, valence checks, and SVG renderer."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "ChemMD SVG bond and label renderer",
        "language": "JavaScript",
        "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/renderer.js#L4-L54"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "All rights reserved; reuse requires written permission.",
        "how": "Standalone browser app; no supported embedding interface found."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Manual geometry, skeletal preview and vector SVG export support simple publication figures, although this remains an unreleased prototype.",
      "summary": "Text-first browser editor for creating 2D chemical structures and exporting SVG or PNG drawings.",
      "website": "https://github.com/shute2004/ChemMD",
      "repo": "https://github.com/shute2004/ChemMD",
      "docs": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/README.md",
      "vendor": "shute2004",
      "license": {
        "kind": "source-available",
        "spdx": null,
        "text": "Source visible for inspection and evaluation; reuse requires written permission.",
        "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/LICENSE"
      },
      "price": {
        "text": "Not published",
        "source": null
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/shute2004/ChemMD/releases"
      },
      "engine": {
        "rendering": "Custom SVG renderer; HTML canvas rasterizes PNG exports",
        "chemistry": "In-house graph parser, ring-skeletal rules and fixed-valence checks",
        "ui": "Vanilla JavaScript DOM and SVG",
        "source": "https://github.com/shute2004/ChemMD/tree/276840869dc1f054333fad0b34eff8ff585dfd3a/src"
      },
      "languages": [
        "JavaScript",
        "HTML",
        "CSS"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/chemmd.js#L36-L42",
          "note": "Text creates single, double, and triple bonds.",
          "shot": {
            "image": "evidence/chemmd/f-bonds-core.webp",
            "caption": "Structure with single, double, and triple bonds beside bond definitions."
          }
        },
        "stereo-bonds": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/chemmd.js#L36-L42",
          "note": "Wedge-like bond syntax rejected; no stereo control."
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/chemmd.js#L36-L42",
          "note": "Dotted bond accepted; no dative control seen."
        },
        "double-bond-side": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/renderer.js#L68-L73",
          "note": "Double bonds always use symmetric offsets; no side setting."
        },
        "rings": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Ring connectivity in text; no dedicated ring tool."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No template library or command visible."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/chemmd.js#L36-L42",
          "note": "C+ label accepted; 13C atom syntax rejected."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/renderer.js",
          "note": "Arrow-like bond syntax rejected; no arrow control."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/renderer.js",
          "note": "Arrow-like syntax rejected; no curved-arrow control."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/main.js#L59-L64",
          "note": "Auto arrange crosses ring bonds and rewrites formula.",
          "engine": {
            "library": "In-house (JavaScript automatic coordinate layout)",
            "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/chemmd.js#L212-L248"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/renderer.js#L33-L53",
          "note": "Colors follow fixed element classes; no individual color field."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/valence.js#L1-L27",
          "note": "Warnings flag overbonded and underbonded atoms.",
          "shot": {
            "image": "evidence/chemmd/f-valence-check.webp",
            "caption": "Warnings list atoms with fewer bonds than expected."
          },
          "engine": {
            "library": "In-house (JavaScript fixed-valence and explicit-bond checks)",
            "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/valence.js#L1-L27"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/chemmd.js#L172-L188",
          "note": "Counts explicit atoms; no mass or implicit hydrogens.",
          "shot": {
            "image": "evidence/chemmd/f-formula-mass.webp",
            "caption": "Formula C8N4O2 with atom and bond counts."
          },
          "engine": {
            "library": "In-house (JavaScript explicit-atom formula calculation only; no mass calculation)",
            "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/chemmd.js#L172-L188"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Pasting caffeine as a name produces an error."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure-to-name command visible."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/chemmd.js#L103-L110",
          "note": "Repeat counts parse and display; component resolution and expansion are unimplemented."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D viewport or control visible."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/export-handler.js#L24-L40",
          "note": "Pasted CDXML text rejected; no import control."
        },
        "cdx": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/export-handler.js#L24-L40",
          "note": "Exporter writes only ChemMD source, SVG and PNG."
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/export-handler.js#L24-L40",
          "note": "Pasted MOL text rejected; no import or export control."
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/export-handler.js#L24-L40",
          "note": "Pasted caffeine and paclitaxel SMILES rejected."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/README.md#features",
          "note": "SVG button saved a vector file."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/export-handler.js#L24-L40",
          "note": "Browser print previews entire page; no PDF export command."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/export-handler.js#L26-L37",
          "note": "PNG saved at 1800 × 1240; no DPI control.",
          "shot": {
            "image": "evidence/chemmd/f-png-export.webp",
            "caption": "PNG output showing a structure with labeled atoms and bonds."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/README.md",
          "note": "Standalone browser app; no supported embedding interface found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/shute2004/ChemMD/blob/276840869dc1f054333fad0b34eff8ff585dfd3a/src/renderer.js",
          "note": "Fixed backgrounds and automatic warnings only; no user highlights."
        }
      },
      "caveats": [
        "Unreleased source-only editor requiring local Node.js setup; not runtime-tested.",
        "All rights reserved; source reuse requires written permission.",
        "Cross-file imports and component expansion are not implemented."
      ],
      "github": {
        "url": "https://github.com/shute2004/ChemMD",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-09-10",
        "commits": 8,
        "contributors": 1,
        "pushedAt": "2026-09-10T09:02:44Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.1.0 (2768408)",
        "canvas": "evidence/chemmd/canvas.webp",
        "canvasLight": "evidence/chemmd/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 492.57,
          "paclitaxelMb": 547.12,
          "baselineMb": 450.2,
          "rssIdleMb": 1037.84,
          "rssPaclitaxelMb": 1079.52,
          "runs": 3,
          "processes": 9,
          "method": "Fresh headed Playwright Chromium; whole-tree phys_footprint including crashpad; three-run medians in MiB.",
          "note": "Published MOL-derived text omits stereochemistry and implicit hydrogens."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Fixed light appearance; MOL-derived connectivity omits stereochemistry."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://github.com/shute2004/ChemMD",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": 229376,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "MOL connectivity transcribed; implicit hydrogens omitted and layout overlaps.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "MOL connectivity transcribed; stereochemistry omitted and layout overlaps.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No 3D view available.",
            "structure": null
          }
        ],
        "observations": [
          "Native text format required; pasted SMILES and MOL were rejected.",
          "Fixture images show MOL connectivity translated into ChemMD text, not direct imports.",
          "The complex translation omits stereochemistry; both omit implicit hydrogens.",
          "Automatic layouts overlap bonds; explicit-atom formula and valence warnings omit implicit hydrogens.",
          "Git clone transfer size unavailable; matching downloaded source archive is 14,347 bytes."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/shute2004/ChemMD",
        "https://github.com/shute2004/ChemMD/blob/main/README.md"
      ]
    },
    {
      "id": "p33",
      "slug": "webmolkit",
      "name": "WebMolKit",
      "rank": 67,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/Sketcher.ts#L13-L51",
        "note": "Self-contained TypeScript sketcher and chemistry implementation; no external runtime dependencies."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "WebMolKit DrawMolecule / ArrangeMolecule / MetaVector",
        "language": "TypeScript",
        "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/gfx/DrawMolecule.ts#L57-L222"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript is compiled output; HTML supports validation, and Shell supports packaging.",
      "video": null,
      "embedding": {
        "methods": [
          "npm package",
          "script tag"
        ],
        "package": "webmolkit",
        "limit": "Apache-2.0",
        "how": "Import Sketcher or load webmolkit.js; setup(), then render into container."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "It primarily provides a reusable molecular sketcher and chemistry library for embedding in web or Electron applications.",
      "summary": "A TypeScript toolkit for embedding molecular sketching, chemical rendering, file conversion, and cheminformatics in web applications.",
      "website": "https://github.com/aclarkxyz/web_molkit",
      "repo": "https://github.com/aclarkxyz/web_molkit",
      "docs": "https://github.com/aclarkxyz/web_molkit#cookbook",
      "vendor": "Molecular Materials Informatics, Inc. / Alex M. Clark",
      "license": {
        "kind": "open-source",
        "spdx": "Apache-2.0",
        "text": "Apache License 2.0.",
        "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/README.md#license"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/README.md#license"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/aclarkxyz/web_molkit/releases"
      },
      "engine": {
        "rendering": "In-house MetaVector renderer using HTML Canvas 2D and SVG.",
        "chemistry": "In-house WebMolKit chemistry toolkit.",
        "ui": "Custom TypeScript widgets and browser DOM.",
        "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/DrawCanvas.ts"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/CommandBank.ts#L172-L181",
          "note": "Drew single, double, and triple bonds.",
          "shot": {
            "image": "evidence/webmolkit/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds drawn on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/CommandBank.ts#L179-L181",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/webmolkit/f-stereo-bonds.webp",
            "caption": "Solid wedge, hashed wedge, and wavy bonds on the canvas."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/CommandBank.ts#L174-L199",
          "note": "Zero-order coordination and quadruple bonds.",
          "shot": {
            "image": "evidence/webmolkit/f-special-bonds.webp",
            "caption": "Bond context menu includes bond orders zero through four."
          }
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/ToolBank.ts#L65-L74",
          "note": "Drew aliphatic and aromatic six-membered rings.",
          "shot": {
            "image": "evidence/webmolkit/f-rings.webp",
            "caption": "A benzene ring and the ring template palette."
          }
        },
        "conformers": {
          "status": "yes",
          "evidence": "ui",
          "source": null,
          "note": "Chair-shaped ring template visible.",
          "shot": {
            "image": "evidence/webmolkit/f-conformers.webp",
            "caption": "Ring template palette with a chair-shaped ring."
          }
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/data/AbbrevContainer.ts#L24-L56",
          "note": "Functional groups, protecting groups, ligands, biomolecules, and other structures.",
          "shot": {
            "image": "evidence/webmolkit/f-templates.webp",
            "caption": "Functional group template palette beside the drawing canvas."
          }
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/CommandBank.ts#L233-L236",
          "note": null,
          "shot": {
            "image": "evidence/webmolkit/f-abbreviations.webp",
            "caption": "A Bu group label and abbreviation controls in the toolbar."
          }
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/EditAtom.ts#L181-L212",
          "note": null,
          "shot": {
            "image": "evidence/webmolkit/f-atom-labels.webp",
            "caption": "Edit Atom dialog with symbol, charge, and isotope settings."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/EditAtom.ts#L190-L192",
          "note": "Unpaired-electron counts produce radical dots.",
          "shot": {
            "image": "evidence/webmolkit/f-radicals.webp",
            "caption": "Edit Atom dialog with an unpaired electron setting."
          }
        },
        "keyboard-drawing": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/CommandBank.ts#L125-L136",
          "note": "Shortcuts target clicked or selected atoms and bonds."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/CommandBank.ts#L278-L289",
          "note": "Lasso selection; rotate, flip, and scale selected atoms."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/gfx/DrawExperiment.ts#L196-L204",
          "note": "Forward arrows through reaction rendering API; additional arrow types unverified."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow tool found in sketcher demo."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/aspect/Experiment.ts#L25-L99",
          "note": "Native DataSheet reactions store reactant, reagent, and product molecules."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/EditAtom.ts#L210-L212",
          "note": "Manual atom-map numbers; reaction renderer displays mapping labels.",
          "shot": {
            "image": "evidence/webmolkit/f-atom-mapping.webp",
            "caption": "Edit Atom dialog with a mapping field."
          }
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/gfx/Rendering.ts#L113-L120",
          "note": "Generic publication preset; named journal presets unverified."
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/gfx/Rendering.ts#L20-L65",
          "note": "Reusable rendering policies via API; style-saving interface unverified."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/gfx/Rendering.ts#L123-L133",
          "note": "Per-atom and per-bond overrides through the rendering API."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/DrawCanvas.ts#L1180-L1204",
          "note": "R/S descriptors appeared on imported paclitaxel.",
          "shot": {
            "image": "evidence/webmolkit/f-stereo-perception.webp",
            "caption": "Molecular structure annotated with R and S stereochemical labels."
          },
          "engine": {
            "library": "In-house (WebMolKit Stereochemistry; TypeScript compiled to JavaScript)",
            "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/mol/Stereochemistry.ts#L25-L127"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/DrawCanvas.ts#L300-L317",
          "note": "Caffeine displayed C8H10N4O2 and 194.19.",
          "shot": {
            "image": "evidence/webmolkit/f-formula-mass.webp",
            "caption": "Caffeine structure with molecular formula and mass at upper right."
          },
          "engine": {
            "library": "In-house (WebMolKit MolUtil; TypeScript compiled to JavaScript)",
            "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/mol/MolUtil.ts#L619-L720"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Pasting caffeine was rejected; no name input found."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in sketcher demo."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/QueryFieldsWidget.ts#L90-L103",
          "note": "Query atom lists and excluded elements."
        },
        "polymers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/Sketcher.ts#L608-L623",
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No rotatable 3D view found in sketcher demo."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML import or export command found."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/io/MoleculeStream.ts#L465-L478",
          "note": "Pasted MOL and SDF; copied MDL MOL.",
          "engine": {
            "library": "In-house (WebMolKit MDLMOLReader/Writer and MDLSDFReader/Writer; TypeScript compiled to JavaScript)",
            "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/io/MDLReader.ts"
          }
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/calc/BuildSMILES.ts#L18-L53",
          "note": "SMILES paste rejected; no SMILES export control found."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/gfx/MetaVector.ts#L609-L629",
          "note": "Copy SVG button produced SVG text."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export command found in sketcher demo."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG export command found in sketcher demo."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/README.md#simple-embed",
          "note": "Documented sketcher and clipboard API examples."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/sketcher/Sketcher.ts#L43-L55",
          "note": "SketcherPlugins callbacks extend paste handling and fragment composition."
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/aclarkxyz/web_molkit#simple-embed",
          "note": "Import Sketcher or load webmolkit.js; setup(), then render into container."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/aclarkxyz/web_molkit/blob/54aec015006da944bf90e8ebe3c2fc277fe98aeb/src/gfx/DrawMolecule.ts#L324-L330",
          "note": "Rendering API provides translucent colored atom circles, preserved in SVG."
        }
      },
      "caveats": [
        "Library integration is required to build a complete application.",
        "Documentation is mainly source comments and examples.",
        "SMILES output omits stereochemistry."
      ],
      "github": {
        "url": "https://github.com/aclarkxyz/web_molkit",
        "stars": 38,
        "checkedOn": "2026-11-06",
        "firstCommit": "2016-08-07",
        "commits": 658,
        "contributors": 1,
        "pushedAt": "2026-11-03T14:09:20Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "2.0.11",
        "canvas": "evidence/webmolkit/canvas.webp",
        "canvasLight": "evidence/webmolkit/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 143.17,
          "paclitaxelMb": 139.51,
          "baselineMb": 52.63,
          "rssIdleMb": 401.06,
          "rssPaclitaxelMb": 402.47,
          "runs": 3,
          "processes": 4,
          "method": "Median Chromium process-tree physical footprint; locally served sketcher, MOL paste; decimal MB.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://github.com/aclarkxyz/web_molkit",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/webmolkit/simple.svg",
            "note": "SMILES rejected; MOL imported, fitted, and SVG copied.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/webmolkit/complex.svg",
            "note": "SMILES rejected; MOL imported, fitted, and SVG copied.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": null
          }
        ],
        "observations": [
          "The repository's sketcher example was served locally after a Bun build.",
          "The demo and research file did not show a version; package metadata says 2.0.11.",
          "The demo copies SVG and MOL text to the clipboard rather than downloading files.",
          "The default editor shows molecular formula and mass in the upper right.",
          "Imported paclitaxel displayed colored atom labels and stereochemistry descriptors."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 291,
        "transferBytes": 2211344
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/aclarkxyz/web_molkit"
      ]
    },
    {
      "id": "p55",
      "slug": "rdeditor",
      "name": "rdEditor",
      "rank": 68,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit"
        ],
        "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molEditWidget.py",
        "note": "Custom editor uses RDKit molecular graphs and SVG rendering."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "RDKit MolDraw2D (SVG)",
        "language": "C++",
        "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molViewWidget.py#L345-L380"
      },
      "enginesChecked": true,
      "languageNote": "Python application; Shell only converts icon assets.",
      "video": null,
      "embedding": {
        "methods": [
          "desktop widget"
        ],
        "package": "rdeditor",
        "limit": "LGPL-3.0; requires PySide6 desktop GUI.",
        "how": "Import rdeditor.molEditWidget.MolEditWidget; add to PySide6 layout and connect molChanged."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "Editor and RDKit bindings"
        }
      ],
      "thirdParty": {
        "summary": "PySide6/Qt: LGPLv3/GPLv3 or commercial terms. RDKit/NumPy: BSD-3-Clause; PyQtDarkTheme: MIT with Apache-2.0 icons. Bundled Icons8 graphics carry separate attribution terms.",
        "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/pyproject.toml",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its reusable PySide molecule-editing widgets and automatic RDKit layout target structure input rather than publication drawing documents.",
      "summary": "A desktop molecule editor and reusable Python widget for editing RDKit structures.",
      "website": "https://github.com/EBjerrum/rdeditor",
      "repo": "https://github.com/EBjerrum/rdeditor",
      "docs": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/README.md",
      "vendor": "Esben Jannik Bjerrum",
      "license": {
        "kind": "open-source",
        "spdx": "LGPL-3.0",
        "text": "GNU Lesser General Public License version 3.",
        "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://pypi.org/project/rdeditor/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "0.5.1",
        "date": "2025-01-10",
        "source": "https://github.com/EBjerrum/rdeditor/releases/tag/0.5.1"
      },
      "engine": {
        "rendering": "RDKit MolDraw2DSVG generates SVG, displayed by Qt QSvgWidget.",
        "chemistry": "RDKit",
        "ui": "PySide6 / Qt Widgets",
        "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molViewWidget.py#L23"
      },
      "languages": [
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/README.md#usage",
          "note": "Drew single bonds and changed them to double and triple.",
          "shot": {
            "image": "evidence/rdeditor/f-bonds-core.webp",
            "caption": "Triple bond on the canvas, with bond tools at left."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L37",
          "note": "R/S toggle creates wedge/hash; no wavy drawing tool found.",
          "shot": {
            "image": "evidence/rdeditor/f-stereo-bonds.webp",
            "caption": "Molecule with solid and hashed wedge bonds."
          }
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L811",
          "note": "Special Bonds menu exposes RDKit types, including dative and quadruple."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/templatehandler.py#L9",
          "note": "Placed benzene and cyclohexane from toolbar.",
          "shot": {
            "image": "evidence/rdeditor/f-rings.webp",
            "caption": "Benzene and cyclohexane rings on the canvas."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/templatehandler.py#L45",
          "note": "Placed built-in carboxylic acid template.",
          "shot": {
            "image": "evidence/rdeditor/f-templates.webp",
            "caption": "Carboxylic acid structure with its template selected."
          }
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molEditWidget.py#L741",
          "note": "Charges and elements editable; no exposed isotope setter.",
          "shot": {
            "image": "evidence/rdeditor/f-atom-labels.webp",
            "caption": "Caffeine with nitrogen and oxygen labels and element tools."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molEditWidget.py#L552",
          "note": "Individual atom selection only; bond selection explicitly unimplemented; transforms unverified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No reaction-arrow command in menus or toolbars."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved-arrow command in menus or toolbars."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molEditWidget.py#L751",
          "note": "Molecular atom-map numbers only; no reactant/product reaction model."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/README.md#top-menu",
          "note": "Recalculates 2D coordinates, disregarding existing coordinates.",
          "engine": {
            "library": "RDKit (Python; CoordGen preferred)",
            "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molViewWidget.py#L254-L284"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molViewWidget.py#L204",
          "note": "Configurable selection highlights through Python; persistent object colors unverified."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molViewWidget.py#L313",
          "note": "Sanitization failures appear in the status bar.",
          "shot": {
            "image": "evidence/rdeditor/f-valence-check.webp",
            "caption": "Caffeine structure with Sanitizable status shown."
          },
          "engine": {
            "library": "RDKit (Python)",
            "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molViewWidget.py#L313-L325"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molViewWidget.py#L300",
          "note": "R/S labels changed when stereocenter was toggled.",
          "shot": {
            "image": "evidence/rdeditor/f-stereo-perception.webp",
            "caption": "Molecule with R and S stereochemical labels."
          },
          "engine": {
            "library": "RDKit (Python)",
            "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molViewWidget.py#L300-L310"
          }
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No molecular formula or mass command found."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Pasting caffeine produced no structure; no naming command found."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure-naming command found in menus."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/README.md#side-bar",
          "note": "Simple numbered R-group dummy atoms; full Markush authoring unverified."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view command in menus or toolbars."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L355",
          "note": "CDXML import left blank canvas despite opened status."
        },
        "cdx": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L355",
          "note": "File handlers support MOL and SMILES only."
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L332",
          "note": "MOL read/write; supplied single-record SDF opened. No SDF export option.",
          "shot": {
            "image": "evidence/rdeditor/f-mol-sdf.webp",
            "caption": "Caffeine structure opened from a MOL file."
          },
          "engine": {
            "library": "RDKit (Python; MOL only)",
            "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L345-L390"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L332",
          "note": "Pasted fixtures and saved caffeine SMILES successfully.",
          "engine": {
            "library": "RDKit (Python)",
            "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L332-L409"
          }
        },
        "inchi": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L355",
          "note": "File handlers support MOL and SMILES only; clipboard parses SMILES."
        },
        "rxn": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L355",
          "note": "File handlers support MOL and SMILES only."
        },
        "svg-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molViewWidget.py#L345",
          "note": "Save As Any File returned Invalid file format."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L376",
          "note": "Save As Any File returned Invalid file format."
        },
        "png-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L376",
          "note": "Save As Any File returned Invalid file format."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminformania.com/rdeditor-an-open-source-molecular-editor-based-using-python-pyside2-and-rdkit/",
          "note": "Widget properties and signals drive molecule editing and display."
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/rdEditor.py#L989",
          "note": "rdEditor always launches QApplication; no headless conversion or rendering."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminformania.com/rdeditor-an-open-source-molecular-editor-based-using-python-pyside2-and-rdkit/",
          "note": "Import rdeditor.molEditWidget.MolEditWidget; add to PySide6 layout and connect molChanged."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/rdeditor/molViewWidget.py#L365-L380",
          "note": "Configurable atom selection halos persist in SVG returned by Python API."
        }
      },
      "caveats": [
        "RDKit controls molecular layout, limiting precise placement for publication figures.",
        "Latest pyqtdarktheme dependency requires Python below 3.12; rdeditor itself requires 3.10 or newer.",
        "README says atom clicks add bonded atoms; current code replaces atoms and uses dragging to add them."
      ],
      "github": {
        "url": "https://github.com/EBjerrum/rdeditor",
        "stars": 181,
        "checkedOn": "2026-11-06",
        "firstCommit": "2018-09-13",
        "commits": 167,
        "contributors": 8,
        "pushedAt": "2026-05-03T18:26:26Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.5.1",
        "canvas": "evidence/rdeditor/canvas.webp",
        "canvasLight": "evidence/rdeditor/canvas-light.webp",
        "canvasDark": "evidence/rdeditor/canvas-dark.webp",
        "memory": {
          "idleMb": 108.95,
          "paclitaxelMb": 115.03,
          "baselineMb": null,
          "rssIdleMb": 226.74,
          "rssPaclitaxelMb": 234.78,
          "runs": 3,
          "processes": 1,
          "method": "Median of three fresh Qt process-tree phys_footprint sums; SMILES paste; 10-second waits; decimal MB.",
          "note": "Clipboard API timed out, but paclitaxel visibly rendered. Native Qt; no helpers observed."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Settings > Theme: Qdt light and Qdt dark change canvas colors."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "pypi",
        "artifact": "https://files.pythonhosted.org/packages/34/86/165363fa09a32f2c5c38b15c7d4f9b070cb477247e3b581f048f2cb4e9b3/rdeditor-0.5.1-py3-none-any.whl",
        "ran": true,
        "failure": null,
        "downloadBytes": 361781,
        "installedBytes": 1444937728,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/rdeditor/simple.png",
            "note": "Current Kekule SMILES; default layout preserved. Drawing-area PNG crop and native MOL saved.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "smiles",
            "image": "evidence/rdeditor/complex.png",
            "note": "Current Kekule SMILES; crossings and crowded labels preserved. Drawing-area crop and native MOL saved.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": null
          }
        ],
        "observations": [
          "Default dark canvas uses light bonds, red oxygen, and blue nitrogen.",
          "SMILES paste generates and fits 2D coordinates automatically.",
          "Paclitaxel shows wedges, hashes, and R/S labels by default.",
          "Paclitaxel automatic layout contains crossing bonds and crowded labels.",
          "No GUI image export or rotatable 3D view was found."
        ]
      },
      "perf": null,
      "downloadBytes": 361781,
      "references": [
        "https://github.com/EBjerrum/rdeditor",
        "https://github.com/EBjerrum/rdeditor/blob/02f28391f773ba891e349e97c9d320adaad624e8/README.md"
      ]
    },
    {
      "id": "p111",
      "slug": "chemcanvasjs",
      "name": "ChemCanvasJS",
      "rank": 69,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee",
        "note": "Own canvas and chemistry code; SMILES conversion backend is undisclosed."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "ChemCanvasJS molecular renderer over Paper.js",
        "language": "CoffeeScript",
        "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee"
      },
      "enginesChecked": true,
      "languageNote": "Own JavaScript is generated; CSS provides styling.",
      "video": null,
      "embedding": {
        "methods": [
          "script tag"
        ],
        "package": null,
        "limit": "MIT; triple bonds unimplemented; example references missing main.js",
        "how": "Load bundled scripts; instantiate ChemCanvas.Canvas with the target canvas ID."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Compiled runtime and Paper.js graphics"
        }
      ],
      "thirdParty": {
        "summary": "MIT/Apache-2.0 libraries; Glyphicons Halflings have Bootstrap-specific permission; custom font licensing unestablished.",
        "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/js/chemcanvas-libs.js",
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "It provides real browser drawing and editable-SVG code, but remains an incomplete component prototype without a publication-document workflow.",
      "summary": "An unfinished browser editor for drawing molecules and experimenting with editable SVG structure exchange.",
      "website": "https://github.com/yoeluk/ChemCanvasJS",
      "repo": "https://github.com/yoeluk/ChemCanvasJS",
      "docs": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/README.md",
      "vendor": "Yoel R Garcia Diaz",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT license included in the CoffeeScript source.",
        "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L2-L24"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/README.md"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/yoeluk/ChemCanvasJS/releases"
      },
      "engine": {
        "rendering": "Paper.js on HTML5 Canvas, with modified Paper.js SVG export",
        "chemistry": "In-house atom/bond model, MOL parser and incomplete CIP routines; unspecified server for SMILES conversion",
        "ui": "jQuery and Bootstrap",
        "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee"
      },
      "languages": [
        "CoffeeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/README.md",
          "note": "Single and double work; triple tool did not create one.",
          "shot": {
            "image": "evidence/chemcanvasjs/f-bonds-core.webp",
            "caption": "Single and double bonds in a molecule on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L2689-L2763",
          "note": "Solid and hashed wedges work; no wavy tool visible.",
          "shot": {
            "image": "evidence/chemcanvasjs/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds in a molecule on the canvas."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L2035-L2084",
          "note": "Repeated clicks switch sides; no centered placement."
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L713-L736",
          "note": "Cyclohexane works; no aromatic ring tool visible.",
          "shot": {
            "image": "evidence/chemcanvasjs/f-rings.webp",
            "caption": "Ring tools beside a molecule with fused rings."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No library beyond ring tools visible."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L2231-L2309",
          "note": "Element and plain-text labels; no chemical charge or isotope fields.",
          "shot": {
            "image": "evidence/chemcanvasjs/f-atom-labels.webp",
            "caption": "Element palette and nitrogen and oxygen labels on the canvas."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L2574-L2644",
          "note": "Point at atoms and type to create or extend labels."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L2986-L3053",
          "note": "Whole-molecule move and rotate; no lasso, flip or resize."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No reaction arrow control found."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow control found."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L1511-L1576",
          "note": "Limited R/S console output; four-neighbor stereocenters remain unfinished.",
          "engine": {
            "library": "In-house",
            "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L1511-L1578"
          }
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass command found."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name input found."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view control found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML command or format option found."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L1387-L1414",
          "note": "MOL imports and logs output; SDF rejected.",
          "engine": {
            "library": "In-house",
            "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L269-L470"
          }
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L2194-L2229",
          "note": "SMILES file rejected; no paste field found."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L196-L205",
          "note": "Shortcut logs SVG element; no file download."
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Print generates PDF through browser; includes page headers."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": null,
          "note": "Browser saves canvas PNG; no resolution control in editor."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/index.html#L12-L20",
          "note": "Canvas constructor example only; no public API reference."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/index.html",
          "note": "MIT; triple bonds unimplemented; example references missing main.js"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/yoeluk/ChemCanvasJS/blob/aa2b9859e4f6662b87c4912784a4c4fb2da145b9/src/chemcanvas.coffee#L2844-L2934",
          "note": "Temporary blue atom and bond hover highlights only."
        }
      },
      "caveats": [
        "Unfinished prototype, last pushed in 2013; triple bonds and automatic heteroatom hydrogens are unimplemented.",
        "README export claims exceed the bundled UI: MOL/SVG output is console-based; SMILES requires an unbundled backend.",
        "README overstates stereochemistry: R/S output is limited to console diagnostics; CIP rule 5 is omitted."
      ],
      "github": {
        "url": "https://github.com/yoeluk/ChemCanvasJS",
        "stars": 10,
        "checkedOn": "2026-11-06",
        "firstCommit": "2013-12-25",
        "commits": 11,
        "contributors": 2,
        "pushedAt": "2013-12-27T15:49:31Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "0.9 (aa2b985)",
        "canvas": "evidence/chemcanvasjs/canvas.webp",
        "canvasLight": "evidence/chemcanvasjs/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 491.81,
          "paclitaxelMb": 347.86,
          "baselineMb": 302.84,
          "rssIdleMb": 1125.3,
          "rssPaclitaxelMb": 1123.53,
          "runs": 3,
          "processes": 10,
          "method": "Three fresh Chromium profiles; whole-tree phys_footprint sums; MOL import; 10-second waits; median MiB.",
          "note": "Includes browser overhead; about:blank baseline recorded separately."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Editor stays light in both browser color schemes."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://github.com/yoeluk/ChemCanvasJS",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": 1798144,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/chemcanvasjs/simple.png",
            "note": "Browser canvas PNG has a transparent background.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/chemcanvasjs/complex.png",
            "note": "Heteroatom hydrogens are not displayed; MOL roundtrip matched stereochemistry.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "No 3D view; SDF import produced no drawing.",
            "structure": null
          }
        ],
        "observations": [
          "The app reports ChemCanvas v0.9 in its MOL output.",
          "Imported structures are centered and initially small; zoom fits them.",
          "The browser saved transparent canvas images; the editor offers no image download.",
          "MOL output appears in the console and was extracted from saved logs.",
          "README advertises SMILES and SVG exchange; this example exposes console diagnostics."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/yoeluk/ChemCanvasJS",
        "https://github.com/yoeluk/ChemCanvasJS/blob/master/README.md"
      ]
    },
    {
      "id": "p84",
      "slug": "chemical-structure-editor",
      "name": "Chemical Structure Editor (CSE)",
      "rank": 70,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/src/index.html#L68-L141",
        "note": "Custom SVG editor with in-house molecular graph, formula parser, and bond rendering."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "CSE SVG bond and label renderer",
        "language": "JavaScript",
        "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/src/scripts/ChemBond.js#L333-L354"
      },
      "enginesChecked": true,
      "languageNote": "Python only prepares data; HTML/CSS provide presentation.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "No software license declared",
        "how": "Standalone app; no documented embedding interface found."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Implements standalone 2D structure and reaction drawing with geometric editing and vector SVG export.",
      "summary": "Browser editor for drawing chemical structures, reaction schemes and geometric figures for publication.",
      "website": "https://sergiidudkin.github.io/ChemicalStructureEditor/",
      "repo": "https://github.com/SergiiDudkin/ChemicalStructureEditor",
      "docs": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md",
      "vendor": "SergiiDudkin",
      "license": {
        "kind": "unclear",
        "spdx": null,
        "text": "Public source repository; no software license specified.",
        "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor"
      },
      "price": {
        "text": "Free (hosted editor, checked 2026-11-05)",
        "source": "https://sergiidudkin.github.io/ChemicalStructureEditor/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/releases"
      },
      "engine": {
        "rendering": "Native SVG DOM for on-screen drawing and SVG export",
        "chemistry": "In-house JavaScript molecular graph and formula parser",
        "ui": "Vanilla JavaScript, HTML and SVG",
        "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/src/scripts/main.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L96-L104",
          "note": "Drew single and double; cycled single to triple."
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/src/scripts/ChemBond.js#L59-L104",
          "note": "Solid and hashed wedges work; no wavy tool found."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L106-L112",
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/src/scripts/main.js#L769-L772",
          "note": "Drew benzene; five-, six-, seven-membered ring tools visible.",
          "shot": {
            "image": "evidence/chemical-structure-editor/f-rings.webp",
            "caption": "Aromatic ring tool selected beside an oversized, clipped ring."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L221-L228",
          "note": "Templates beyond simple rings remain on the roadmap."
        },
        "custom-templates": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L221-L228",
          "note": "Custom templates remain on the roadmap."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L127-L131",
          "note": "Understands Me, Et, Pr, Bu, Ph, Bn, Ac, Bz and Ts."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md",
          "note": "Arbitrary atom labels work; charges remain on the roadmap."
        },
        "radicals": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L221-L228",
          "note": "Radicals remain on the roadmap."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/src/scripts/TransformTool.js",
          "note": "Four corner/side handles each; README says eight each."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L149-L159",
          "note": "Drew forward and equilibrium arrows."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Curve tool draws plain curves without arrowheads."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L221-L228",
          "note": "Free text and formatting remain on the roadmap."
        },
        "shapes": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L161-L179",
          "note": "Drew a curve; line, ellipse and rectangle tools visible."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L221-L228",
          "note": "User-facing font, color and bond styling remain on the roadmap."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L201-L206",
          "note": "Console calculation returned formula and molecular weight.",
          "engine": {
            "library": "In-house",
            "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/src/scripts/Selection.js#L508-L532"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name conversion command found."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view command found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML import or export command found."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/src/scripts/main.js#L26-L68",
          "note": "MOL import failed; Save as MOL did nothing."
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SMILES paste produced no drawing; no SMILES export found."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L189-L190",
          "note": "Save as SVG downloaded a vector file."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export command found."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG export command found."
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/src/scripts/Selection.js#L222-L274",
          "note": "Uses an internal clipboard; ChemDraw formats are not exchanged."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/README.md#L201-L219",
          "note": "Console helpers expose calculations and display toggles, not drawing operations."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor#run",
          "note": "Standalone app; no documented embedding interface found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/c1570babac17b5bc200357c603e4fe0d46f87a1d/src/scripts/Canvas.js#L85-L97",
          "note": "Blue selection halos only; SVG export omits them."
        }
      },
      "caveats": [
        "No software license is specified.",
        "Editable drawings use custom JSON; the MOL export menu entry is an unimplemented placeholder.",
        "Atomic-weight data contains errors: cobalt is assigned 194 instead of 58.933194."
      ],
      "github": {
        "url": "https://github.com/SergiiDudkin/ChemicalStructureEditor",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2022-01-10",
        "commits": 260,
        "contributors": 4,
        "pushedAt": "2026-05-24T14:51:10Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "c1570bab",
        "canvas": null,
        "canvasLight": "evidence/chemical-structure-editor/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 388,
          "paclitaxelMb": null,
          "baselineMb": 356,
          "rssIdleMb": 989.53,
          "rssPaclitaxelMb": null,
          "runs": 3,
          "processes": 7,
          "method": "Playwright Chromium; summed process-tree physical footprints; median of three runs.",
          "note": "Published MOL import failed; no paclitaxel drawing."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "MOL import failed; paclitaxel loaded from externally converted native JSON."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://sergiidudkin.github.io/ChemicalStructureEditor/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "SMILES paste did nothing; MOL opened as invalid JSON.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "SMILES paste did nothing; MOL did not load through JSON picker.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No 3D viewport found; fixture skipped.",
            "structure": null
          }
        ],
        "observations": [
          "The JSON picker reported a parse error for the caffeine MOL file.",
          "The SVG export retained the full canvas dimensions.",
          "The formula and mass result was available through the browser console.",
          "The aromatic ring tool produced oversized geometry during placement."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 69,
        "transferBytes": 52743
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/SergiiDudkin/ChemicalStructureEditor",
        "https://sergiidudkin.github.io/ChemicalStructureEditor/",
        "https://github.com/SergiiDudkin/ChemicalStructureEditor/blob/main/README.md"
      ]
    },
    {
      "id": "p112",
      "slug": "kemia",
      "name": "Kemia",
      "rank": 71,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "ported": [
          "CDK",
          "MX"
        ],
        "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/layout/coordinate_generator.js#L19-L25",
        "note": "Own canvas; CDK coordinate generation and MX ring perception are ported."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Kemia MoleculeRenderer over Closure graphics",
        "language": "JavaScript",
        "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/view/molecule_renderer.js#L17-L116"
      },
      "enginesChecked": true,
      "languageNote": "Java and Python files support builds and tests.",
      "video": null,
      "embedding": {
        "methods": [
          "script tag"
        ],
        "package": null,
        "limit": "Apache-2.0; pre-alpha",
        "how": "Load kemia.js; instantiate kemia.controller.ReactionEditor and register editing plugins."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Google Closure Library: Apache-2.0; MX-derived ring code: MIT upstream. CDK-derived layout files carry Apache-2.0 notices.",
        "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/layout/coordinate_generator.js",
        "notice": null,
        "libraries": [
          {
            "name": "Chemistry Development Kit",
            "license": "LGPL-2.1-or-later",
            "source": "https://github.com/cdk/cdk/blob/main/pom.xml"
          },
          {
            "name": "MX",
            "license": "MIT",
            "source": "https://github.com/metamolecular/mx/blob/master/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "Kemia provides a reusable browser structure and reaction editor, with incomplete document-authoring and export functionality.",
      "summary": "A JavaScript editor and chemistry toolkit for embedding 2D molecular structures and reactions in web pages.",
      "website": "https://kemia.github.io/",
      "repo": "https://github.com/kemia/kemia",
      "docs": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/README",
      "vendor": "European Bioinformatics Institute and Wingu Inc.",
      "license": {
        "kind": "open-source",
        "spdx": "Apache-2.0",
        "text": "Apache License 2.0.",
        "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/LICENSE"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.2",
        "date": "2010-12-16",
        "source": "https://api.github.com/repos/kemia/kemia/git/tags/338852fbb59e740af64c205bd86681f3c86fd7a3"
      },
      "engine": {
        "rendering": "Google Closure goog.graphics with SVG, VML, or HTML canvas backends",
        "chemistry": "Kemia's own JavaScript chemistry toolkit",
        "ui": "Google Closure Library (goog.ui)",
        "source": "https://github.com/kemia/kemia.github.com/blob/b137d0109871ea1531d34da89ed80a278def4eea/js/kemia.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/controller/plugins/bond_edit.js#L208-L252",
          "note": "Single, double, triple update atom labels; drawings are clipped."
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/view/single_up_or_down_bond_renderer.js#L24-L88",
          "note": "Up, down, and wavy tools respond; drawings are clipped."
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/controller/plugins/bond_edit.js#L95-L123",
          "note": "Quadruple bonds available; no dative option in bond menu."
        },
        "double-bond-side": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/view/double_bond_renderer.js#L85-L125",
          "note": "Automatic ring-interior or centered placement; no manual side selection."
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/controller/plugins/molecule_edit.js#L496-L1031",
          "note": "Benzene tool responds; drawing is clipped."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/controller/plugins/bond_edit.js#L138-L165",
          "note": "Number keys grow chains; no drag-chain tool."
        },
        "templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/controller/plugins/molecule_edit.js#L799-L937",
          "note": "Includes naphthalene beyond simple ring templates."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/controller/plugins/atom_edit.js#L123-L158",
          "note": "Element and charge editing; isotope labels are not rendered."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/controller/plugins/atom_edit.js#L123-L188",
          "note": "Hover an atom, then change its element or charge with shortcuts."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/controller/plugins/move.js#L949-L996",
          "note": "Molecule movement and rotation; rectangle selector remains a stub."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/view/arrow_renderer.js#L72-L107",
          "note": "Forward arrow tool responds; drawing is clipped."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow control in editor."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/io/json.js#L296-L404",
          "note": "Reactants and products serialize as molecular graphs in reaction JSON."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/controller/plugins/cleanup.js#L49-L83",
          "note": "Optional coordinate-regeneration command; omitted from default toolbar.",
          "engine": {
            "library": "Ported from CDK (JavaScript)",
            "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/layout/coordinate_generator.js#L19-L30"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/view/atom_renderer.js#L48-L65",
          "note": "Element-wide palette configuration; no individual atom color control."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass command in demo."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/kemia/kemia.github.com/blob/b137d0109871ea1531d34da89ed80a278def4eea/demos/_posts/2011-01-17-identifier-resolver.html",
          "note": "Aspirin resolver returned no structure."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command in demo."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/query/query_atom.js#L27-L57",
          "note": "R1 placement adds accessible label; drawing clipped."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/service/identifier.js",
          "note": "NIH resolver wrapper uses a legacy external proxy; availability unverified."
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view control in demos."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "File menu contains only New."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/io/mdl.js#L139-L385",
          "note": "MOL read/write API; SDF records split manually.",
          "engine": {
            "library": "In-house",
            "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/io/mdl.js#L139-L343"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/io/smiles/smiles_generator.js",
          "note": "Separate demo accepts SMILES; no output command; drawing clipped.",
          "engine": {
            "library": "In-house",
            "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/io/smiles/smiles_parser.js#L73-L208"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/kemia/kemia.github.com/blob/b137d0109871ea1531d34da89ed80a278def4eea/demos/_posts/2011-01-17-identifier-resolver.html",
          "note": "Resolver demo accepts InChI; remote backend availability unverified."
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/io/mdl.js#L252-L385",
          "note": "RXN reading and writing through JavaScript API."
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No image export command in demo."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export command in demo."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG export command in demo."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/README",
          "note": "Documents parsing, coordinate generation, and editor initialization."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/controller/plugin.js",
          "note": "Documented plugin base class with event and command extension hooks."
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/README",
          "note": "Load kemia.js; instantiate kemia.controller.ReactionEditor and register editing plugins."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/kemia/kemia/blob/3151b4e98a9eb376c8b01a4b1e4105705ff08a3b/kemia/view/atom_renderer.js#L135-L166",
          "note": "Renderer API draws customizable colored halos around atoms and bonds."
        }
      },
      "caveats": [
        "Pre-alpha software; repository last updated in June 2011.",
        "SMILES generation is a stub; MOL export omits charges and isotopes.",
        "Several capabilities require API integration; the default toolbar omits cleanup."
      ],
      "github": {
        "url": "https://github.com/kemia/kemia",
        "stars": 14,
        "checkedOn": "2026-11-06",
        "firstCommit": "2010-03-18",
        "commits": 721,
        "contributors": 10,
        "pushedAt": "2011-06-13T20:19:57Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "v0.2-79-gceacc9a",
        "canvas": "evidence/kemia/canvas.webp",
        "canvasLight": "evidence/kemia/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 494.24,
          "paclitaxelMb": 342.24,
          "baselineMb": 309.03,
          "rssIdleMb": 1076.91,
          "rssPaclitaxelMb": 1102.09,
          "runs": 3,
          "processes": 10,
          "method": "Chromium process-tree physical footprints; median of three fresh sessions.",
          "note": "SMILES demo rendered atom labels; drawing clipped to a thin strip."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Paclitaxel rendering is clipped to a thin strip."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://kemia.github.io/demos/2010/08/23/reaction-editor.html",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "SMILES produced clipped labels without visible bonds; no MOL import available.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "SMILES produced clipped labels without visible bonds; no MOL import available.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No 3D view found in the demos.",
            "structure": null
          }
        ],
        "observations": [
          "Hosted reaction editor loaded with a preset reaction.",
          "Drawings were clipped to a thin strip in WebKit and Chromium.",
          "The separate SMILES demo accepted caffeine and paclitaxel.",
          "The editor File menu offered only New.",
          "The name resolver produced no result for aspirin."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 95,
        "transferBytes": 107960
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/kemia/kemia"
      ]
    },
    {
      "id": "p108",
      "slug": "jmoldraw",
      "name": "JMolDraw",
      "rank": 72,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
        "note": "Own molecular canvas and chemistry; Apache Batik provides general SVG export."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "JMolDraw JMD molecular views",
        "language": "Java",
        "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download"
      },
      "enginesChecked": true,
      "languageNote": "HTML embeds the applet; XML configures the build.",
      "video": null,
      "embedding": {
        "methods": [
          "Java applet"
        ],
        "package": null,
        "limit": "GPL-2.0-or-later",
        "how": "Applet opens separate window; no inline integration supported"
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Includes Apache-1.1 (Batik 1.5.1) and permissive W3C API licenses; redistribution requires notices and attribution.",
        "source": "https://archive.apache.org/dist/xml/batik/batik-1.5.1.zip",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "The standalone editor supports chemical structure drawing, rich-text captions and vector SVG export.",
      "summary": "A Java application for drawing and editing two-dimensional chemical structures.",
      "website": "https://sourceforge.net/projects/jmoldraw/",
      "repo": "https://sourceforge.net/p/jmoldraw/code/",
      "docs": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
      "vendor": "Thomas A. Seidel",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-2.0-or-later",
        "text": "GNU GPL version 2 or later.",
        "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download"
      },
      "price": {
        "text": "Free",
        "source": "https://sourceforge.net/projects/jmoldraw/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "0.6alpha",
        "date": "2006-10-02",
        "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/"
      },
      "engine": {
        "rendering": "Java2D Graphics2D; Apache Batik for SVG; Java ImageIO for PNG/JPEG",
        "chemistry": "In-house JMD molecule model and chemistry algorithms",
        "ui": "Java Swing",
        "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download"
      },
      "languages": [
        "Java"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Drew single bond; repeated clicks changed it to double and triple.",
          "shot": {
            "image": "evidence/jmoldraw/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Filled wedges drawn; imported hashes render; wavy drawing unverified.",
          "shot": {
            "image": "evidence/jmoldraw/f-stereo-bonds.webp",
            "caption": "A molecular structure with solid and hashed wedge bonds."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "JMDBondDrawingToolBase cycles double bonds through left, centered and right."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Placed benzene; toolbar also exposes three- through eight-membered rings.",
          "shot": {
            "image": "evidence/jmoldraw/f-rings.webp",
            "caption": "Ring tool buttons and a benzene ring on the canvas."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Dragging chain tool produced one bond; longer chain creation unverified."
        },
        "templates": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Opened Bases palette and placed adenine from the library."
        },
        "custom-templates": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Save MOL/JME, then register it by editing template configuration."
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Atom dialogs set arbitrary symbols, charges and isotope numbers."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Singlet, doublet and triplet radicals have editable atom settings."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Lasso selection, rotation, flipping and resize handles are implemented.",
          "shot": {
            "image": "evidence/jmoldraw/f-selection-tools.webp",
            "caption": "A selected bond surrounded by square handles."
          }
        },
        "perspective": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Rotate 3D transforms drawings around X and Y axes."
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No reaction-arrow command found in inspected menus and toolbars."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved-arrow command found in inspected menus and toolbars."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "JMDTextEditDialog supports fonts, superscripts and subscripts."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "JMDColorEditDialogComponent applies foreground colors to selected objects."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "no",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "JMDImageFilter.read returns an empty document instead of importing images."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Bond edits trigger a Valence Warning with undo/reduction choices.",
          "engine": {
            "library": "In-house",
            "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass command found in menus or molecule dialog."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name conversion command found in inspected menus or dialogs."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found in inspected menus or molecule dialog."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Query Atom editor supports atom lists and Beilstein generic groups."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Cholesterol SDF opened as flat drawing with overlapping hydrogen labels."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Absent from Open and Save As format lists."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "MOL and first SDF structure import worked; writing remained unverified.",
          "shot": {
            "image": "evidence/jmoldraw/f-mol-sdf.webp",
            "caption": "A structure displayed from simple.mol."
          },
          "engine": {
            "library": "In-house",
            "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download"
          }
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Opening simple.smi failed: Cannot read field x because vec2 is null."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "JMDSVGExportFilter generates vector SVG using Apache Batik."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF format or print command found in File menu."
        },
        "png-export": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "PNG export uses drawing pixel bounds without a DPI setting."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "applet.txt documents JavaScript control through a legacy Java applet."
        },
        "cli": {
          "status": "no",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "main ignores arguments and always opens the GUI."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Applet opens separate window; no inline integration supported"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://sourceforge.net/projects/jmoldraw/files/jmoldraw/source/JMolDraw-0.6alpha.src.tar.gz/download",
          "note": "Temporary colored selection boxes only; foreground coloring is separate."
        }
      },
      "caveats": [
        "Latest listed release is 0.6alpha from 2006-10-02; current Java compatibility was not tested.",
        "MOL/JME saving omits free-text captions; SVG is export-only.",
        "Browser integration uses a legacy Java applet and opens its own window."
      ],
      "github": null,
      "hands": {
        "testedVersion": "V0.5",
        "canvas": "evidence/jmoldraw/canvas.webp",
        "canvasLight": "evidence/jmoldraw/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 182,
          "paclitaxelMb": 260,
          "baselineMb": null,
          "rssIdleMb": 218.61,
          "rssPaclitaxelMb": 299.06,
          "runs": 1,
          "processes": 1,
          "method": "footprint phys_footprint summed over owned process tree; 10-second idle waits.",
          "note": "Single GUI run; published MOL import through existing packaged V0.5 JAR launcher."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Interface and canvas remain light under both per-process appearance overrides."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "jar",
        "artifact": "JMolDraw-0.6alpha.bin.tar.gz",
        "ran": true,
        "failure": "Native image export and structure saving could not be completed: filename entry was inaccessible through computer-use automation.",
        "downloadBytes": 1186927,
        "installedBytes": 163483648,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/jmoldraw/simple.png",
            "note": "SMILES produced none; MOL rendered correctly. Canvas crop, not a native export.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/jmoldraw/complex.png",
            "note": "SMILES produced none; MOL rendered correctly. Canvas crop, not a native export.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": null
          }
        ],
        "observations": [
          "Archive is 0.6alpha; the unchanged application About box reports V0.5.",
          "Default drawings use thin black bonds and black atom labels.",
          "Paclitaxel retains visible filled wedges and hashed bonds from MOL.",
          "Cholesterol SDF projection has overlapping explicit hydrogen labels.",
          "Export PNGs are screenshot crops; native exports and MOL writing were unverified.",
          "Redraw retried both current Kekule SMILES fixtures; each produced no drawing and the same vec2-null error."
        ]
      },
      "perf": null,
      "downloadBytes": 1186927,
      "references": [
        "https://sourceforge.net/projects/jmoldraw/"
      ]
    },
    {
      "id": "p132",
      "slug": "moltouch",
      "name": "MolTouch",
      "rank": 73,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/Canvas_draw.js",
        "note": "Own atom/bond model and Canvas renderer; external scripts supply interface controls."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "MolTouch Canvas renderer",
        "language": "JavaScript",
        "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/Canvas_draw.js"
      },
      "enginesChecked": true,
      "languageNote": "HTML/CSS provide interface markup and styling; PHP handles downloads.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "License grant unclear",
        "how": "No embedding documentation; hosted framing headers do not block embedding."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": "MIT option for jQuery/Sizzle (GPL-2.0 alternative); other bundled UI licenses unconfirmed.",
        "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/tool/jquery-1.4.2.min.js",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Its documented workflow is browser-based molecular structure input and ChemSpider search, with MOL and canvas PNG output.",
      "summary": "A touch-friendly browser editor for drawing chemical structures and saving MOL files or PNG images.",
      "website": "https://apricot.cis.ibaraki.ac.jp/moltouch/",
      "repo": null,
      "docs": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/manual/index.html",
      "vendor": "Yuuki Nagai, Yuhei Fujishima, Shota Enokido, and Akio Fujiyoshi (Ibaraki University)",
      "license": {
        "kind": "unclear",
        "spdx": null,
        "text": "Homepage claims open source; source headers reserve all rights, with no license grant identified.",
        "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/index.html"
      },
      "price": {
        "text": "Not published",
        "source": null
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": "v1.0.0",
        "date": "2014-03-05",
        "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/"
      },
      "engine": {
        "rendering": "HTML5 Canvas 2D; PNG output uses canvas.toDataURL.",
        "chemistry": "In-house JavaScript atom/bond model and MOL-file parser/writer.",
        "ui": "HTML/CSS with jQuery 1.4.2, jQuery.radmenu, and Tinybox.",
        "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/index.html"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/manual/index.html#content1-3",
          "note": "Bond orders editable; blank-canvas mouse drag produced nothing.",
          "shot": {
            "image": "evidence/moltouch/f-bonds-core.webp",
            "caption": "Single and double bonds in a molecular drawing."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/manual/index.html#content1-3",
          "note": "Solid and hashed wedges work; no wavy option observed.",
          "shot": {
            "image": "evidence/moltouch/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedges in a molecular drawing."
          }
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/Event.js",
          "note": "Bond menu supports only single, double, triple, wedge, and hash."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/manual/index.html#content1-2",
          "note": "Imported rings display; no dedicated ring palette found.",
          "shot": {
            "image": "evidence/moltouch/f-rings.webp",
            "caption": "Fused rings in a molecular drawing on the canvas."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/CreateMolFile.js",
          "note": "Only element symbols are retained; isotope and charge fields are zeroed."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/Event.js",
          "note": "Typed characters replace a selected atom label when Enter is pressed."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/Event.js",
          "note": "Rotation and scaling supported; no lasso or flip controls."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/Canvas_draw.js",
          "note": "Invalid bond order produced a red underline on nitrogen.",
          "engine": {
            "library": "In-house",
            "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/Canvas_draw.js"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "partial",
          "evidence": "source",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/CreateMolFile.js",
          "note": "Submits ChemSpider searches; no returned structures are fetched into the editor.",
          "engine": {
            "library": "ChemSpider web service (outbound search form only)",
            "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/CreateMolFile.js"
          }
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SDF rendered flat; no rotatable 3D view found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/manual/index.html#content2",
          "note": "MOL and SDF import; MOL save returned blank response.",
          "shot": {
            "image": "evidence/moltouch/f-mol-sdf.webp",
            "caption": "SDF file contents and its structure in the editor."
          },
          "engine": {
            "library": "In-house (MOL V2000 parser/writer; SDF unconfirmed)",
            "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/CreateMolFile.js"
          }
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SMILES file displayed as text without a structure."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/CreateMolFile.js",
          "note": "Exports transparent 1176 × 833 PNG at 72 dpi.",
          "shot": {
            "image": "evidence/moltouch/f-png-export.webp",
            "caption": "Exported PNG of a molecular structure."
          }
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/index.html",
          "note": "No embedding documentation; hosted framing headers do not block embedding."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "no",
          "evidence": "docs",
          "source": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/js/Canvas_draw.js",
          "note": "Renderer lacks user-controlled atom or bond background highlighting."
        }
      },
      "caveats": [
        "Homepage claims open source, but public source headers reserve all rights without identifying a license.",
        "Latest release announcement is dated 2014-03-05; documented browser tests cover historical versions.",
        "MOL/PNG download forms submit drawings to server-side PHP handlers."
      ],
      "github": null,
      "hands": {
        "testedVersion": "v1.0.0",
        "canvas": "evidence/moltouch/canvas.webp",
        "canvasLight": "evidence/moltouch/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 459,
          "paclitaxelMb": 482,
          "baselineMb": 435,
          "rssIdleMb": 962.52,
          "rssPaclitaxelMb": 996.14,
          "runs": 3,
          "processes": 7,
          "method": "Playwright Chromium process tree; summed physical footprints; three-run medians.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/index.html",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/moltouch/simple.png",
            "note": "MOL imported; default PNG has a transparent background.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/moltouch/complex.png",
            "note": "MOL imported with solid and hashed wedges visible.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": null
          }
        ],
        "observations": [
          "The editor labels nitrogen blue and oxygen red by default.",
          "The exported PNGs retain the full transparent canvas.",
          "The MOL save endpoint returned HTTP 500 during the test.",
          "The cholesterol import panel obscured part of the flat projection.",
          "Several requested features had no discoverable controls and were not tested."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 171,
        "transferBytes": 416337
      },
      "downloadBytes": null,
      "references": [
        "https://apricot.cis.ibaraki.ac.jp/moltouch/",
        "https://apricot.cis.ibaraki.ac.jp/moltouch/editor/manual/index.html"
      ]
    },
    {
      "id": "p118",
      "slug": "chemeditor-lernprogramme",
      "name": "Chemeditor (Chemie-Lernprogramme)",
      "rank": 74,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/index.html",
        "note": "Own Unicode text composer and PNG renderer; FileSaver only handles downloads."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Unicode text and Canvas text renderer",
        "language": "JavaScript",
        "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/daten/js/funktionen.js"
      },
      "enginesChecked": true,
      "languageNote": "HTML and CSS provide layout and styling.",
      "video": null,
      "embedding": {
        "methods": [
          "iframe"
        ],
        "package": null,
        "limit": "GPLv3 code; supplied templates also labeled CC BY-NC 4.0.",
        "how": "Paste supplied data-URI iframe snippet into Moodle's HTML editor."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Offline download includes GPL-2.0 Liberation fonts with a font embedding exception.",
        "source": "https://github.com/liberationfonts/liberation-1.7-fonts/blob/c9bf24210d99ab6d1fe83745e6b58086bef61dda/License.txt",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "It composes Unicode text formulas and relies on a word processor for document layout and assembled reaction figures.",
      "summary": "A browser editor for composing Unicode chemical formulas, simple structural formulas, and reaction equations for word processors.",
      "website": "https://chemie-lernprogramme.de/daten/html/chemeditor.html",
      "repo": null,
      "docs": "https://chemie-lernprogramme.de/daten/ueb/ueb_chemeditor_libreoffice_loes.pdf",
      "vendor": "Joachim Jakob (Kronberg-Gymnasium Aschaffenburg)",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-3.0-only",
        "text": "Program code under GPLv3; original media under CC BY 4.0.",
        "source": "https://chemie-lernprogramme.de/daten/html/lizenz.html"
      },
      "price": {
        "text": "Free",
        "source": "https://chemie-lernprogramme.de/daten/html/lizenz.html"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://chemie-lernprogramme.de/daten/html/chemeditor.html"
      },
      "engine": {
        "rendering": "Browser text rendering; HTML Canvas 2D text rendering for PNG export",
        "chemistry": null,
        "ui": "Plain HTML/CSS and JavaScript",
        "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/daten/js/funktionen.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/index.html",
          "note": "Single, double, triple characters insert as text, not bonds.",
          "shot": {
            "image": "evidence/chemeditor-lernprogramme/f-bonds-core.webp",
            "caption": "Single, double and triple bond characters in the text editor."
          }
        },
        "stereo-bonds": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No wedge, hashed wedge, or wavy bond controls visible."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/index.html",
          "note": "Benzene text template inserts; no general ring tools.",
          "shot": {
            "image": "evidence/chemeditor-lernprogramme/f-rings.webp",
            "caption": "Benzene character diagram and selected structure template."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chemie-lernprogramme.de/daten/ueb/ueb_chemeditor_libreoffice_loes.pdf",
          "note": "Structure templates insert fixed character diagrams, not chemical objects."
        },
        "custom-templates": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chemie-lernprogramme.de/daten/ueb/ueb_chemeditor_libreoffice_loes.pdf",
          "note": "Offline templates require manual JavaScript and HTML edits."
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/index.html",
          "note": "Unicode charges and isotope digits; no atom-property editing."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/index.html",
          "note": "Lone pairs use text strokes around element symbols."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/index.html",
          "note": "Forward and equilibrium characters insert into text.",
          "shot": {
            "image": "evidence/chemeditor-lernprogramme/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrow characters in the text editor."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved electron-pushing arrow tool visible."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/index.html",
          "note": "Palette includes chemical charge, bond and electron-pair symbols."
        },
        "rich-text": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/index.html",
          "note": "Unicode subscripts and superscripts; fixed-width plain text without mixed styling."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No calculation command or computed formula and mass display."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Typing caffeine leaves literal text."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure naming command visible."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No rotatable 3D viewer control visible."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML import or export control visible."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No MOL or SDF import or export control visible."
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SMILES input remained literal text; no chemistry conversion."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No SVG export control visible."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export control visible."
        },
        "png-export": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/daten/js/funktionen.js",
          "note": "PNG button opened blank popup in isolated WebKit host."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chemie-lernprogramme.de/daten/ueb/ueb_chemeditor_libreoffice_loes.pdf",
          "note": "Copies editable Unicode text, without an embedded chemical structure object."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemie-lernprogramme.de/mebisvorlagen_chemie/daten/media/chemeditor_singlefile/embed.html",
          "note": "Paste supplied data-URI iframe snippet into Moodle's HTML editor."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://chemie-lernprogramme.de/daten/ueb/ueb_chemeditor_libreoffice_loes.pdf",
          "note": "Copies Unicode text into Office, without embedded chemical object editing."
        },
        "color-highlight": {
          "status": "no",
          "evidence": "docs",
          "source": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/daten/js/funktionen.js",
          "note": "Plaintext formulas and monochrome rendering lack atom or bond backgrounds."
        }
      },
      "caveats": [
        "Structures are Unicode text and require a monospaced font.",
        "Multiple structures must be arranged in a separate word processor.",
        "PNG export uses fixed 16-pixel monochrome text."
      ],
      "github": null,
      "hands": {
        "testedVersion": "sha256:4c8fae476591",
        "canvas": "evidence/chemeditor-lernprogramme/canvas.webp",
        "canvasLight": "evidence/chemeditor-lernprogramme/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 243,
          "paclitaxelMb": null,
          "baselineMb": 203,
          "rssIdleMb": 802.2,
          "rssPaclitaxelMb": null,
          "runs": 3,
          "processes": 6,
          "method": "Median physical footprint of dedicated Playwright Chromium process tree; RSS cross-check.",
          "note": "SMILES remains plain text; paclitaxel drawing unsupported."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Paclitaxel SMILES remains literal text; no molecular drawing."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://chemie-lernprogramme.de/daten/programme/js/chemeditor/index.html",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "SMILES remained plain text; no MOL import control.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "SMILES remained plain text; no MOL import control.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No rotatable 3D view; fixture skipped.",
            "structure": null
          }
        ],
        "observations": [
          "No version was shown; identifier is the served HTML SHA-256 prefix.",
          "The main editing area is a monospaced text field.",
          "Benzene and methane templates insert multiline character diagrams.",
          "Fixture screenshots show literal input rather than molecular drawings.",
          "PNG popup was blank in the isolated WebKit host; export remains unverified."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 3176,
        "transferBytes": 985314
      },
      "downloadBytes": null,
      "references": [
        "https://chemie-lernprogramme.de/daten/html/chemeditor.html",
        "https://chemie-lernprogramme.de/daten/html/chemeditor.html"
      ]
    },
    {
      "id": "p104",
      "slug": "sketchem",
      "name": "SketChem",
      "rank": 75,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "Kekule.js",
          "Open Babel",
          "Indigo"
        ],
        "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/features/sketchpad/SketchPad.tsx#L177-L218",
        "note": "Custom SVG sketchpad; Kekule.js provides chemistry with Open Babel and Indigo."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "In-house SVG renderer using SVG.js",
        "language": "TypeScript",
        "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/entities/Bond.ts#L270-L342"
      },
      "enginesChecked": true,
      "languageNote": "SCSS/CSS style the interface; HTML hosts it.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "MIT",
        "how": "Standalone React application; supported editor embedding remains unconfirmed."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Kekule.js chemistry and format integration"
        },
        {
          "language": "C++",
          "role": "Open Babel and Indigo WebAssembly chemistry"
        },
        {
          "language": "C",
          "role": "InChI compiled into Open Babel WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": "Includes GPL-2.0-only Open Babel code/data and copied valence routines alongside MIT Kekule.js and Apache-2.0 Indigo.",
        "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/utils/mdlValance.ts",
        "notice": null,
        "libraries": [
          {
            "name": "Kekule.js",
            "license": "MIT",
            "source": "https://github.com/partridgejiang/Kekule.js/blob/master/LICENSE"
          },
          {
            "name": "Open Babel",
            "license": "GPL-2.0-only",
            "source": "https://github.com/openbabel/openbabel/blob/master/COPYING"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its implemented interface focuses on molecular structure input, and publication-grade document output is unverified.",
      "summary": "A browser-based editor for creating and editing 2D chemical structures.",
      "website": "https://itayyaakov.github.io/SketChem/",
      "repo": "https://github.com/itayYaakov/SketChem",
      "docs": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/README.md",
      "vendor": "Itay Yaakov",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT license; free to use, modify and redistribute.",
        "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/License.md"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/README.md#what-is-sketchem"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/itayYaakov/SketChem/releases"
      },
      "engine": {
        "rendering": "Custom SVG drawing",
        "chemistry": "Kekule.js with Open Babel and Indigo (WebAssembly)",
        "ui": "React and Redux",
        "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/README.md#what-is-unique-about-sketchem"
      },
      "languages": [
        "TypeScript",
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/README.md#features",
          "note": "Bond tools selected; attempted canvas edits did not change drawing.",
          "shot": {
            "image": "evidence/sketchem/f-bonds-core.webp",
            "caption": "Bond buttons and single and double bonds on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/entities/Bond.ts#L270",
          "note": "Imported wedges render; attempted wedge edit did not change drawing.",
          "shot": {
            "image": "evidence/sketchem/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds in an imported structure."
          }
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/entities/Bond.ts#L270",
          "note": "Single-or-double query bonds only; no dative rendering."
        },
        "double-bond-side": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/constants/bond.constants.ts#L54",
          "note": "Double-bond geometry is fixed symmetrically around the bond axis."
        },
        "rings": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No dedicated ring tools found."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/features/toolbar-item/tools/Chain.ts#L65",
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No template library found."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/entities/Atom.ts#L286",
          "note": "Charges and element labels; no dedicated isotope-setting control.",
          "shot": {
            "image": "evidence/sketchem/f-atom-labels.webp",
            "caption": "Element palette beside a caffeine structure with labeled atoms."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/features/toolbar-item/ToolbarItems.tsx#L72",
          "note": "Shortcuts change tools or selections; hovering alone does not edit."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/features/toolbar-item/tools/SelectTemplate.ts#L261",
          "note": "Lasso and box selection with movement; no rotate, flip or resize.",
          "shot": {
            "image": "evidence/sketchem/f-selection-tools.webp",
            "caption": "Box and lasso selection buttons above the canvas."
          }
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No reaction arrow tool found."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow tool found."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/utils/KekuleUtils.js#L69",
          "note": "Automatic 2D layout on text import only.",
          "engine": {
            "library": "Open Babel (WebAssembly via Kekule.js; import layout only)",
            "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/public/kekule-js-dist/kekule.min.js#L1"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/README.md#features",
          "note": null,
          "engine": {
            "library": "Ported from Open Babel (MDL valence model rewritten in TypeScript)",
            "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/utils/mdlValance.ts#L1-L23"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass command found."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name input command found."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure naming command found."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SDF opened as flat projection; no 3D view found."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "CDXML absent from import and export format lists."
        },
        "cdx": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "CDX listed for import, not export.",
          "engine": {
            "library": "Open Babel (WebAssembly via Kekule.js; import only)",
            "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/public/kekule-js-dist/kekule.min.js#L1"
          }
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/public/kekule-js-dist/kekule.min.js#L1",
          "note": "MOL and SDF import; MOL export lost coordinates.",
          "engine": {
            "library": "Kekule.js (JavaScript MDL MOL/SDF readers and writers)",
            "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/public/kekule-js-dist/kekule.min.js#L1"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/public/kekule-js-dist/kekule.min.js#L1",
          "note": "Caffeine SMILES exported; pasted SMILES displayed blank.",
          "engine": {
            "library": "Kekule.js (JavaScript writer); Indigo (WebAssembly reader)",
            "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/public/kekule-js-dist/kekule.min.js#L1"
          }
        },
        "inchi": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "InChI listed in import and export menus.",
          "engine": {
            "library": "Open Babel with bundled InChI library (WebAssembly via Kekule.js)",
            "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/public/kekule-js-dist/kekule.min.js#L1"
          }
        },
        "rxn": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "RXN listed in import and export menus."
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No SVG export option found."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF export option found."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG export option found."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/README.md",
          "note": "Standalone React application; supported editor embedding remains unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/itayYaakov/SketChem/blob/34c45c041fc14788e76938f7d865e708ad367fa5/sketchem-react/src/entities/Entity.ts#L70",
          "note": "Cyan atom/bond selection backgrounds; chemical exports omit them."
        }
      },
      "caveats": [
        "Development-stage editor with no tagged releases; runtime usability was not tested.",
        "README calls copy/paste clipboard operations; the toolbar buttons use an internal buffer.",
        "Source review suggests changed wedge stereochemistry may be lost on export."
      ],
      "github": {
        "url": "https://github.com/itayYaakov/SketChem",
        "stars": 19,
        "checkedOn": "2026-11-06",
        "firstCommit": "2022-01-30",
        "commits": 138,
        "contributors": 3,
        "pushedAt": "2022-07-31T13:22:25Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "6ed8c631",
        "canvas": "evidence/sketchem/canvas.webp",
        "canvasLight": "evidence/sketchem/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 546,
          "paclitaxelMb": 565,
          "baselineMb": 443,
          "rssIdleMb": 1135.72,
          "rssPaclitaxelMb": 1165.05,
          "runs": 3,
          "processes": 7,
          "method": "Median Chromium process-tree phys_footprint; MOL file import; MiB.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": null
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://itayyaakov.github.io/SketChem/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/sketchem/simple.png",
            "note": "SMILES produced a blank canvas; MOL rendered. Exported MOL coordinates are zero.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/sketchem/complex.png",
            "note": "SMILES produced a blank canvas; MOL rendered. Exported MOL coordinates are zero.",
            "structure": "stereo"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": "mismatch"
          }
        ],
        "observations": [
          "Hosted bundle identifier is main.6ed8c631.js; no app version was displayed.",
          "MOL imports show explicit carbon labels and colored heteroatoms by default.",
          "Paclitaxel shows solid and hashed stereobonds from the MOL fixture.",
          "Image captures are crops of the isolated native web host window.",
          "The cholesterol MOL output contained zero atoms after SDF import."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 158,
        "transferBytes": 4709553
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/itayYaakov/SketChem",
        "https://itayyaakov.github.io/SketChem/",
        "https://github.com/itayYaakov/SketChem/blob/development/README.md"
      ]
    },
    {
      "id": "p90",
      "slug": "vue-chemdraw",
      "name": "vue-chemdraw (0chem)",
      "rank": 76,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/main.vue",
        "note": "Release 1.4.6 uses its own SVG editor, molecule model, and MOL parser."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "0chem in-house SVG DOM molecule renderer",
        "language": "JavaScript",
        "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeDraw/Draw/DrawBond.js"
      },
      "enginesChecked": true,
      "languageNote": "Vue templates and CSS provide presentation.",
      "video": null,
      "embedding": {
        "methods": [
          "npm package"
        ],
        "package": "vue-chemdraw",
        "limit": "Repository GPL-3.0 conflicts with npm ISC metadata.",
        "how": "Register Vue plugin with app.use(chemDraw); insert <draw-0chem> component."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Includes OFL-1.1 font derivatives (Source Han; font-only share-alike).",
        "source": "https://github.com/adobe-fonts/source-han-sans/blob/a4f7cf94edfb9d7ffbdfc4841de276358bd7e0f2/LICENSE.txt",
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "It is distributed as a Vue 3 structure-editor component for embedding in other applications.",
      "summary": "A Vue 3 component for embedding a browser-based chemical structure editor.",
      "website": "https://0chem.com",
      "repo": "https://gitee.com/linghuaxue/vue-chemdraw",
      "docs": "https://0chem.com/doc/start",
      "vendor": "0chem.com (Shi Yan)",
      "license": {
        "kind": "open-source",
        "spdx": null,
        "text": "npm declares ISC; repository LICENSE contains GPL-3.0.",
        "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://www.npmjs.com/package/vue-chemdraw"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.4.6",
        "date": "2024-09-12",
        "source": "https://registry.npmjs.org/vue-chemdraw"
      },
      "engine": {
        "rendering": "Custom SVG DOM renderer (npm 1.4.6)",
        "chemistry": "In-house atom/bond model, ring algorithms and MOL parser",
        "ui": "Vue 3",
        "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/main.vue"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeWeb/views/toolbar.vue",
          "note": "Single, double and triple drawn; changing order unconfirmed.",
          "shot": {
            "image": "evidence/vue-chemdraw/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds drawn on the canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeDraw/Draw/DrawBond.js",
          "note": "Solid and hashed wedges drawn; wavy placement unconfirmed.",
          "shot": {
            "image": "evidence/vue-chemdraw/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds drawn on the canvas."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeEdit/Edit/DrawChange.js",
          "note": "Repeated clicks cycle centered and both side placements."
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeEdit/Edit/DrawRing.js",
          "note": "Benzene drawn; five-membered tool also visible.",
          "shot": {
            "image": "evidence/vue-chemdraw/f-rings.webp",
            "caption": "Ring tools and a benzene ring on the canvas."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeEdit/Edit/DrawFast.js",
          "note": "Dragging progressively adds carbon atoms with snapped bond angles."
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Only ring tools found; no broader library visible."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeDraw/Draw/DrawAtom.js",
          "note": "Charges and element replacement; isotope rendering unfinished, arbitrary-label authoring undocumented.",
          "shot": {
            "image": "evidence/vue-chemdraw/f-atom-labels.webp",
            "caption": "Element and charge controls above a structure with oxygen labels."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeEdit/Edit/DrawTransform.js",
          "note": "Rectangular selection, move, rotate and resize; no lasso implementation."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "tested",
          "source": null,
          "note": "Forward and equilibrium arrows drawn.",
          "shot": {
            "image": "evidence/vue-chemdraw/f-reaction-arrows.webp",
            "caption": "Forward and equilibrium arrows drawn on the canvas."
          }
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved electron-pushing arrow control found."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Color palette and swatches visible; application untested.",
          "shot": {
            "image": "evidence/vue-chemdraw/f-color.webp",
            "caption": "Color swatches and palette control above the drawing."
          }
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Statistics entry did nothing when clicked."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No chemical-name input found."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command found."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeStream/ctfile.js",
          "note": "Numbered R-label import only; atom-list handling unfinished."
        },
        "polymers": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Group control shown; chemical repeat representation unverified."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D model view found in inspected tabs."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML import or export option found."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeStream/ctfile.js",
          "note": "MOL text did not render; Save did nothing."
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "SMILES in MOL input did not produce a structure."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://0chem.com/doc/introduction",
          "note": "Save did nothing; no SVG option appeared."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Save did nothing; no PDF option appeared."
        },
        "png-export": {
          "status": "no",
          "evidence": "tested",
          "source": "https://0chem.com/doc/introduction",
          "note": "Save did nothing; no PNG option appeared."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://0chem.com/doc/start",
          "note": "Vue registration documented; structure-control API documentation unavailable."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw",
          "note": "Register Vue plugin with app.use(chemDraw); insert <draw-0chem> component."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://gitee.com/linghuaxue/vue-chemdraw/blob/d89eabd571f7c4a796d840739b2ec8311266a607/v1.4/plugin/draw-0chem-js/MoleculeEdit/Edit/DrawSelect.js#L48",
          "note": "Selection backgrounds are temporary and reset when the structure redraws."
        }
      },
      "caveats": [
        "2024 beta with Chinese UI and placeholder controls; runtime usability untested.",
        "npm declares ISC, while the repository LICENSE contains GPL-3.0.",
        "README's CSS-only rendering claim conflicts with SVG code; advertised image exports lack released handlers."
      ],
      "github": null,
      "hands": {
        "testedVersion": "L1XkLMu0",
        "canvas": null,
        "canvasLight": "evidence/vue-chemdraw/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 492.48,
          "paclitaxelMb": null,
          "baselineMb": 416.67,
          "rssIdleMb": 992.78,
          "rssPaclitaxelMb": null,
          "runs": 3,
          "processes": 7,
          "method": "Playwright Chromium process tree; summed phys_footprint, MiB; three-run medians.",
          "note": "Idle contains built-in sample; New ineffective; MOL import failed."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Paclitaxel import failed; screenshot shows built-in sample."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://0chem.com/draw",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "MOL text entered; create left the built-in sample unchanged.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "SMILES and MOL attempts left the built-in sample unchanged.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No 3D view found; cholesterol test skipped.",
            "structure": null
          }
        ],
        "observations": [
          "The editor opens with a complex example already on the canvas.",
          "The New and Save sidebar entries did not open a blank document or save dialog.",
          "MOL input is a text area; attempted fixture imports left the example unchanged.",
          "The About version button produced no visible response; L1XkLMu0 identifies the served editor bundle.",
          "Supplemental screenshots show the failed import and manually drawn test tools."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 1449,
        "transferBytes": 231630
      },
      "downloadBytes": null,
      "references": [
        "https://www.npmjs.com/package/vue-chemdraw",
        "https://registry.npmjs.org/vue-chemdraw"
      ]
    },
    {
      "id": "p100",
      "slug": "chemwriter",
      "name": "ChemWriter",
      "rank": 77,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://depth-first.com/articles/2011/01/12/ten-reasons-to-use-chemwriter-in-your-next-web-application/",
        "note": "Creator documents a ground-up JavaScript rewrite and proprietary molecular renderer."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "ChemWriter",
          "level": "paid",
          "price": null
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "ChemWriter SVG/VML renderer",
        "language": "JavaScript",
        "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [
          "script tag"
        ],
        "package": null,
        "limit": "Commercial license required for production deployment",
        "how": "Load SDK JavaScript and CSS, then instantiate editor in HTML container."
      },
      "otherLanguages": [
        {
          "language": "Java",
          "role": "Optional legacy clipboard applet"
        }
      ],
      "thirdParty": {
        "summary": "Apache-2.0 libraries (Closure, Harmony); OFL-1.1 Nobile font data (font-only share-alike).",
        "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js",
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "Its documented purpose is embedding molecular structure editing and input into web applications.",
      "summary": "JavaScript component for drawing and editing molecular structures inside web applications.",
      "website": "https://chemwriter.com/",
      "repo": null,
      "docs": "https://chemwriter.com/user-guide/",
      "vendor": "Metamolecular, LLC",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary; production deployment requires licensing. Evaluation use was offered free.",
        "source": "https://depth-first.com/articles/2011/01/12/ten-reasons-to-use-chemwriter-in-your-next-web-application/"
      },
      "price": {
        "text": "Commercial licensing; current price unverified (2026-11-05).",
        "source": "https://depth-first.com/articles/2011/01/12/ten-reasons-to-use-chemwriter-in-your-next-web-application/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://depth-first.com/articles/2019/05/01/javascript-for-cheminformatics-part-2/"
      },
      "engine": {
        "rendering": "Custom JavaScript renderer using SVG",
        "chemistry": "In-house JavaScript cheminformatics toolkit",
        "ui": "Google Closure Library with custom HTML/CSS controls",
        "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js",
          "note": "Drew a bond and cycled single, double, triple.",
          "shot": {
            "image": "evidence/chemwriter/f-bonds-core.webp",
            "caption": "Single, double, and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js",
          "note": "Drew solid and hashed wedges; no wavy tool seen.",
          "shot": {
            "image": "evidence/chemwriter/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds on the drawing canvas."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js",
          "note": "Placed benzene and cyclohexane; other ring sizes visible.",
          "shot": {
            "image": "evidence/chemwriter/f-rings.webp",
            "caption": "Benzene and cyclohexane rings beside the ring tools."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No template library control visible beyond ring tools."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js",
          "note": "Charges and elements; isotope tools require host configuration.",
          "shot": {
            "image": "evidence/chemwriter/f-atom-labels.webp",
            "caption": "Nitrogen and oxygen labels with charge controls in the editor."
          }
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://tianlab-tsinghua.cn/wp-content/plugins/reaction-calculator-vue/assets/index.c007cdee.js",
          "note": "Radical editing in ChemWriter 3.15.1; older deployments differ."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://depth-first.com/articles/2010/12/01/javascript-now-works-keyboard-mouse-focus-and-molfile-copy-in-chemwriter/",
          "note": "Hover over an atom and type its element shortcut.",
          "plan": "ChemWriter",
          "planLevel": "paid"
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "ui",
          "source": null,
          "note": "Lasso icon visible; rotate, flip and resize not seen."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No reaction arrow control in embedded editor."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow control in embedded editor."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass command visible in editor."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Import rejected caffeine as invalid input."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No structure-to-name command visible in editor."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js",
          "note": "Atom lists, wildcard bonds and numbered R-groups; host-configurable."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "3D SDF displayed flat; no rotatable viewport visible."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Minimal CDXML rejected; export dialog offers MOL text."
        },
        "cdx": {
          "status": "partial",
          "evidence": "source",
          "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js",
          "note": "ChemWriter 2 imports limited CDX; export API writes MOL only.",
          "engine": {
            "library": "In-house (JavaScript; CDX import only)",
            "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://depth-first.com/articles/2011/01/24/reading-and-writing-the-sytem-clipboard-in-javascript-copy-and-paste-molfiles-in-chemwriter-on-internet-explorer/",
          "note": "MOL imported and exported; SDF opened as flat projection.",
          "engine": {
            "library": "In-house (JavaScript; MOL read/write)",
            "source": "https://search.emolecules.com/resources/js/chemwriter.1629951104.js"
          },
          "plan": "ChemWriter",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": "https://tianlab-tsinghua.cn/wp-content/plugins/reaction-calculator-vue/assets/index.c007cdee.js",
          "note": "Caffeine SMILES rejected; export dialog offers MOL text."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Export control opens only a MOL text dialog."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Export control opens only a MOL text dialog."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "Export control opens only a MOL text dialog."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "source",
          "source": "https://search.emolecules.com/",
          "note": "loadEditor, getMolfile and configurable drawing settings.",
          "plan": "ChemWriter",
          "planLevel": "paid"
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://depth-first.com/articles/2010/11/17/chemwriter-2-better-deployment-through-javascript/",
          "note": "Load SDK JavaScript and CSS, then instantiate editor in HTML container.",
          "plan": "ChemWriter",
          "planLevel": "paid"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Vendor site and manual were unreachable on 2026-11-05; latest release, SDK availability and current price remain unverified.",
        "eMolecules serves ChemWriter 2.15.7; query tools require login and other tools depend on host configuration.",
        "Interactive operation was not tested; publication document layout and graphics export remain unverified."
      ],
      "github": null,
      "hands": {
        "testedVersion": "2.15.7",
        "canvas": "evidence/chemwriter/canvas.webp",
        "canvasLight": "evidence/chemwriter/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 547,
          "paclitaxelMb": 538,
          "baselineMb": 464,
          "rssIdleMb": 1059.94,
          "rssPaclitaxelMb": 1066.81,
          "runs": 3,
          "processes": 7,
          "method": "Median Chromium process-tree physical footprint; MOL import; RSS cross-check.",
          "note": null
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Hosted editor remains light under both browser color schemes."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://search.emolecules.com/",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "ok",
            "input": "mol",
            "image": "evidence/chemwriter/simple.png",
            "note": "SMILES rejected; imported MOL text. Image is a canvas crop.",
            "structure": "match"
          },
          {
            "fixture": "complex",
            "result": "ok",
            "input": "mol",
            "image": "evidence/chemwriter/complex.png",
            "note": "Imported MOL text. Image is a canvas crop.",
            "structure": "match"
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "Opens the 3D file as a flat drawing",
            "structure": "stereo"
          }
        ],
        "observations": [
          "Tested the ChemWriter component embedded in eMolecules, as a guest.",
          "About reports version 2.15.7, revision 2c6181.",
          "MOL input preserves fixture coordinates; default atom colors distinguish nitrogen and oxygen.",
          "No image export was offered; PNG evidence consists of drawing-area window crops.",
          "The 3D SDF appears flat with overlapping explicit hydrogen labels."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 3982,
        "transferBytes": 684026
      },
      "downloadBytes": null,
      "references": [
        "https://search.emolecules.com/",
        "https://depth-first.com/articles/2011/01/12/ten-reasons-to-use-chemwriter-in-your-next-web-application/"
      ]
    },
    {
      "id": "p110",
      "slug": "mcdl-java-chemical-structure-editor",
      "name": "MCDL Java Chemical Structure Editor",
      "rank": 78,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/SourceMCDL.zip/download",
        "note": "Own Java drawing engine; source imports only JDK and bundled project packages."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "MCDL DrawMolecule",
        "language": "Java",
        "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/SourceMCDL.zip/download"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [
          "Java applet"
        ],
        "package": null,
        "limit": "Requires obsolete Java browser plug-in",
        "how": "Embed mcdl.MCDLEditor.class via <applet>; exchange structures using getMCDL/setMCDL."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Applet host interaction"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "It is a molecular structure input applet with JavaScript embedding examples, rather than a publication document editor.",
      "summary": "A Java applet for drawing and editing molecular structures encoded in Modular Chemical Descriptor Language.",
      "website": "https://sourceforge.net/projects/mcdl/",
      "repo": null,
      "docs": "https://link.springer.com/article/10.1186/1758-2946-3-5",
      "vendor": "Sergei V. Trepalin and Alexander V. Yarkov",
      "license": {
        "kind": "open-source",
        "spdx": null,
        "text": "Public-domain source code and executables.",
        "source": "https://sourceforge.net/projects/mcdl/"
      },
      "price": {
        "text": "Free",
        "source": "https://sourceforge.net/projects/mcdl/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": "2007-07-01",
        "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/"
      },
      "engine": {
        "rendering": "Custom DrawMolecule renderer using Java AWT Graphics; companion converter renders BufferedImage images to GIF.",
        "chemistry": "In-house molecule package, including MCDL, BondAlternate, TemplateRedraw and ProcessStereo.",
        "ui": "Java AWT editor; Swing companion converter.",
        "source": "https://sourceforge.net/projects/mcdl/files/MCDL%20to%20GIF%20convertor/Application%20and%20Source%20codes/Source.zip/download"
      },
      "languages": [
        "Java"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/SourceMCDL.zip/download",
          "note": "Drew all three orders and changed an existing single bond.",
          "shot": {
            "image": "evidence/mcdl-java-chemical-structure-editor/f-bonds-core.webp",
            "caption": "Double and triple bonds on the drawing canvas"
          }
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/SourceMCDL.zip/download",
          "note": "Drew solid wedge, hashed wedge, and wavy bonds.",
          "shot": {
            "image": "evidence/mcdl-java-chemical-structure-editor/f-stereo-bonds.webp",
            "caption": "Solid and hashed wedge bonds on the drawing canvas"
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/SourceMCDL.zip/download",
          "note": "Placed cyclopropane, cyclohexane, benzene, and seven-membered rings.",
          "shot": {
            "image": "evidence/mcdl-java-chemical-structure-editor/f-rings.webp",
            "caption": "Ring tools above triangular, seven-membered, and overlapping six-membered rings"
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-3-5",
          "note": "Cage and polycyclic templates generate layouts automatically."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/SourceMCDL.zip/download",
          "note": "Element placement works; isotope controls absent; charge effect unconfirmed."
        },
        "radicals": {
          "status": "no",
          "evidence": "tested",
          "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/SourceMCDL.zip/download",
          "note": "Radical button clicks produced no visible atom change."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No reaction-arrow control in toolbar or application menu."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved-arrow control in toolbar or application menu."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-3-5",
          "note": "Computes MCDL stereodescriptors; standard R/S and E/Z labels unverified.",
          "engine": {
            "library": "In-house",
            "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/SourceMCDL.zip/download"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/SourceMCDL.zip/download",
          "note": "SimpleMolecule.java computes formula and mass; editor readout unverified.",
          "engine": {
            "library": "In-house",
            "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/SourceMCDL.zip/download"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Pasting caffeine produced no drawing; clipboard was not read."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command exposed for the manually drawn structure."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No rotatable model viewport or 3D command exposed."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No file import/export control or CDXML option exposed."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": "https://link.springer.com/article/10.1186/1758-2946-3-5",
          "note": "MOL paste ignored; Open shortcut opened no dialog."
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Both fixture SMILES pastes left the canvas empty."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No SVG export command or output dialog exposed."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Print shortcut opened no dialog; no PDF export control."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG export command or output dialog exposed."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/mcdl.html/download",
          "note": "Example JavaScript calls the applet's getMCDL and setMCDL methods."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/mcdl.html/download",
          "note": "Requires obsolete Java browser plug-in"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sourceforge.net/projects/mcdl/files/MCDL%20to%20GIF%20convertor/Application%20and%20Source%20codes/Source.zip/download",
          "note": "Source API sets per-atom background colors rendered into exported images."
        }
      },
      "caveats": [
        "Legacy Java applet: current browsers cannot run it, and JDK 26 removed the Applet API.",
        "Latest listed editor files date to 2007-07-01; 2016-03-27 is a project update, not a verified release.",
        "The applet exchanges MCDL; MOL/SDF conversion uses library code and a separate GUI utility."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": "evidence/mcdl-java-chemical-structure-editor/canvas.webp",
        "canvasLight": "evidence/mcdl-java-chemical-structure-editor/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 89,
          "paclitaxelMb": null,
          "baselineMb": null,
          "rssIdleMb": 157.25,
          "rssPaclitaxelMb": null,
          "runs": 1,
          "processes": 1,
          "method": "One manual run; summed phys_footprint for complete owned Java process tree after 10-second idle.",
          "note": "Paclitaxel SMILES paste ignored; canvas stayed empty."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Fixed light appearance; paclitaxel paste unsupported, leaving canvas empty."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "jar",
        "artifact": "https://sourceforge.net/projects/mcdl/files/mcdl/MCDL%20applet/MCDL.jar/download",
        "ran": true,
        "failure": null,
        "downloadBytes": 266796,
        "installedBytes": 173277184,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "SMILES and MOL paste ignored; no Open dialog.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "SMILES paste ignored; no MOL file-import control.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "Skipped: no 3D viewport in standalone UI.",
            "structure": null
          }
        ],
        "observations": [
          "Default terminal carbon labels include hydrogen counts.",
          "Atoms and bonds draw black on a white canvas.",
          "Fixture paste attempts left empty canvases.",
          "Standalone UI exposes drawing tools and a periodic table.",
          "No image export or 3D viewport was found."
        ]
      },
      "perf": null,
      "downloadBytes": 266796,
      "references": [
        "https://sourceforge.net/projects/mcdl/"
      ]
    },
    {
      "id": "p61",
      "slug": "glass",
      "name": "Glass",
      "rank": 79,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/canvasfn.js#L609",
        "note": "Custom Canvas rendering and in-house chemistry; jQuery is UI only."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Glass Canvas 2D renderer",
        "language": "JavaScript",
        "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/canvasfn.js#L609"
      },
      "enginesChecked": true,
      "languageNote": "CSS styles the editor.",
      "video": null,
      "embedding": {
        "methods": [
          "script tag"
        ],
        "package": null,
        "limit": "Current main has syntax error; pin earlier revision.",
        "how": "Load scripts, then instantiate Glass in a DOM container."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "Glass is primarily a JavaScript sketcher and viewer library intended for embedding in web pages.",
      "summary": "A JavaScript library for embedding chemical structure and reaction drawing in web pages.",
      "website": "https://github.com/joe-glass/glass",
      "repo": "https://github.com/joe-glass/glass",
      "docs": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/README.md",
      "vendor": "Joseph Mason",
      "license": {
        "kind": "open-source",
        "spdx": "Apache-2.0",
        "text": "Apache License 2.0.",
        "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/LICENSE"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/joe-glass/glass/releases"
      },
      "engine": {
        "rendering": "HTML5 Canvas 2D",
        "chemistry": "In-house JavaScript",
        "ui": "jQuery with HTML/CSS",
        "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/README.md"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/canvasfn.js",
          "note": "Single, double, triple drawn; history raises errors.",
          "shot": {
            "image": "evidence/glass/f-bonds-core.webp",
            "caption": "Triple bond and benzene ring on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/canvasfn.js",
          "note": "Wedge and hash applied; no wavy tool visible.",
          "shot": {
            "image": "evidence/glass/f-stereo-bonds.webp",
            "caption": "Solid wedge on the canvas with the wedge tool selected."
          }
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/canvasfn.js",
          "note": "Switches left/right; centered rendering is automatic."
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/canvasfn.js",
          "note": "Six-membered and benzene rings drawn.",
          "shot": {
            "image": "evidence/glass/f-rings.webp",
            "caption": "Benzene ring on the canvas beside ring tools."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No templates beyond ring tools visible."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/README.md#functions-currently-included",
          "note": "Periodic-table elements and charges; isotope entry is not established."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/init.js",
          "note": "Hovered atoms and bonds respond to element, charge, and stereo keys."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/canvasfn.js",
          "note": "Rectangle selection and movement; no rotation, flip, or selection-resize controls."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/canvasfn.js",
          "note": "Forward arrow drag failed with JavaScript error."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow tool visible."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/fileIO.js",
          "note": "Exports reaction SMILES using the first arrow and molecule positions."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/canvasfn.js",
          "note": "Editable straight arrows only; brackets and curves are not implemented."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/fileIO.js",
          "note": "Native drawings preserve font size and bond length; no separate presets."
        },
        "color": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/init.js",
          "note": "Global color schemes only; individual object colors are not stored."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass command visible."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name input command visible."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command visible."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view control visible."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No CDXML option in import or export dialog."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/README.md#functions-currently-included",
          "note": "MOL import and export failed; SDF not tested."
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/README.md#functions-currently-included",
          "note": "SMILES import and export failed."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No SVG option in export dialog."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PDF option in export dialog."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No PNG option in export dialog."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/README.md#to-get-started",
          "note": "Documented JavaScript constructor and configuration options."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/joe-glass/glass/e210ea7a1b88c87ff98ea1793ad29417e43061bc/disconnect.js",
          "note": "Custom disconnection rules accepted through the JavaScript API."
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/joe-glass/glass/blob/9fcbb3f606f4c53c75117d3b32ae3eccc46bb83e/README.md#to-get-started",
          "note": "Current main has syntax error; pin earlier revision."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/canvasfn.js#L515-L564",
          "note": "Temporary selection outlines inherit bond color; no saved highlight styling."
        }
      },
      "caveats": [
        "Requires webpage integration and jQuery; no tagged releases or packaged application.",
        "The expected GitHub Pages demo could not be reached on 2026-11-05.",
        "Main-branch fileIO.js has a duplicate let declaration that prevents JavaScript parsing."
      ],
      "github": {
        "url": "https://github.com/joe-glass/glass",
        "stars": 1,
        "checkedOn": "2026-11-06",
        "firstCommit": "2021-11-01",
        "commits": 13,
        "contributors": 1,
        "pushedAt": "2022-02-18T21:39:43Z",
        "archived": false
      },
      "hands": {
        "testedVersion": null,
        "canvas": "evidence/glass/canvas.webp",
        "canvasLight": "evidence/glass/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 72.31,
          "paclitaxelMb": null,
          "baselineMb": 50.3,
          "rssIdleMb": 289.75,
          "rssPaclitaxelMb": null,
          "runs": 3,
          "processes": 4,
          "method": "Playwright headless Chromium; summed process-tree physical footprints; medians of three runs.",
          "note": "MOL import failed: importMol is not a function; molecule absent."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "MOL import fails; molecule absent from screenshot."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://github.com/joe-glass/glass",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "SMILES and MOL imports failed; file I/O script did not load.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "SMILES and MOL imports failed; file I/O script did not load.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "No 3D view found in the editor.",
            "structure": null
          }
        ],
        "observations": [
          "No HTML demo was bundled; the repository was embedded in a minimal local page.",
          "The fileIO.js script fails to parse because index2 is declared twice.",
          "MOL import reports that importMol is not a function.",
          "Drawing changes appear, but each canvas mousedown raises an exportGlass error.",
          "The export dialog offers Glass, Mol2000 and SMILES; all failed."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 294,
        "transferBytes": 2220020
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/joe-glass/glass",
        "https://github.com/joe-glass/glass/blob/e210ea7a1b88c87ff98ea1793ad29417e43061bc/README.md"
      ]
    },
    {
      "id": "p88",
      "slug": "molsketch-cljs",
      "name": "molsketch-cljs",
      "rank": 80,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/core.cljs",
        "note": "Custom SVG editor and molecular graph; manifests contain no third-party chemistry libraries."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "molsketch-cljs SVG molecule renderer",
        "language": "ClojureScript",
        "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/components.cljs#L8-L54"
      },
      "enginesChecked": true,
      "languageNote": "HTML/CSS provide presentation; generated JavaScript and build configuration excluded.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Standalone ClojureScript app; no documented embedding interface."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "ClojureScript runtime: EPL-1.0 (weak copyleft); Reagent/React: MIT; Specter and Closure Library: Apache-2.0.",
        "source": "https://github.com/clojure/clojurescript/blob/master/LICENSE",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "This basic browser structure editor lacks the document and reliable export workflows needed for publication-grade chemical drawing.",
      "summary": "A browser prototype for drawing basic two-dimensional molecular structures with keyboard shortcuts.",
      "website": "https://hessammehr.github.io/molsketch-cljs/",
      "repo": "https://github.com/hessammehr/molsketch-cljs",
      "docs": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/README.md",
      "vendor": "S. Hessam M. Mehr",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "The README declares the MIT License.",
        "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/README.md#license"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/README.md#license"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/hessammehr/molsketch-cljs/releases"
      },
      "engine": {
        "rendering": "Browser SVG elements generated by custom ClojureScript drawing code",
        "chemistry": "In-house molecular graph and geometry functions",
        "ui": "Reagent / React",
        "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/core.cljs"
      },
      "languages": [
        "ClojureScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/README.md#keybindings",
          "note": "Sprouted a bond and changed its order using 1, 2, 3.",
          "shot": {
            "image": "evidence/molsketch-cljs/f-bonds-core.webp",
            "caption": "Single, double and triple bonds on the drawing canvas."
          }
        },
        "stereo-bonds": {
          "status": "no",
          "evidence": "tested",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/components.cljs#L39",
          "note": "W key did not alter the bond; no stereo controls appeared."
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/components.cljs#L39",
          "note": "Only parallel-line bonds are rendered; no dative or specialist geometry."
        },
        "double-bond-side": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/components.cljs#L44",
          "note": "Multiple bonds always use symmetric, centered offsets."
        },
        "rings": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/templates.cljs#L32",
          "note": "The 6 key grafted a saturated ring; no aromatic tool visible.",
          "shot": {
            "image": "evidence/molsketch-cljs/f-rings.webp",
            "caption": "A six-membered ring containing a phosphorus atom."
          }
        },
        "conformers": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/templates.cljs#L32",
          "note": "Ring templates are regular polygons; no chair or Haworth projections."
        },
        "chains": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/core.cljs#L56",
          "note": "Dragging translates atoms or bonds; chain growth requires individual keystrokes."
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/elements.cljs#L6",
          "note": "Only C, N, O, P, S shortcuts; no charges or isotopes."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/README.md#keybindings",
          "note": "Keys changed selected bond orders and grafted a ring."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/core.cljs#L46",
          "note": "Single atom or bond selection and translation; no lasso, rotation, flip."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/README.md#todo",
          "note": "Style support remains on the TODO list."
        },
        "custom-styles": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/README.md#todo",
          "note": "Style support remains on the TODO list."
        },
        "color": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/resources/public/css/style.css#L1",
          "note": "Drawing colors are fixed CSS; selection highlights are automatic."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Open and save shortcuts produced no file dialogs."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Open shortcut produced no dialog; no file command visible."
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Pasting fixture SMILES did not import a structure."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/src/molsketch_cljs/actions.cljs#L78",
          "note": "Clipboard SVG serialization omits the external styles defining bond strokes."
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/hessammehr/molsketch-cljs#local-development",
          "note": "Standalone ClojureScript app; no documented embedding interface."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/hessammehr/molsketch-cljs/blob/eed9c3d828ea33515ada891e8a18994e86e8351d/resources/public/css/style.css#L22",
          "note": "Selection/hover halos only; clipboard SVG omits their external CSS."
        }
      },
      "caveats": [
        "Minimal drawing prototype with no tagged release; ring grafting onto bonds is explicitly unimplemented.",
        "Chemical-format import/export, custom atom labels and implicit hydrogens remain unfinished.",
        "README lists vector copying as unfinished; implemented SVG clipboard serialization omits required external drawing styles."
      ],
      "github": {
        "url": "https://github.com/hessammehr/molsketch-cljs",
        "stars": 4,
        "checkedOn": "2026-11-06",
        "firstCommit": "2015-11-27",
        "commits": 84,
        "contributors": 1,
        "pushedAt": "2025-05-25T21:17:31Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "sha256:322271d1520e",
        "canvas": null,
        "canvasLight": "evidence/molsketch-cljs/canvas-light.webp",
        "canvasDark": null,
        "memory": {
          "idleMb": 220,
          "paclitaxelMb": null,
          "baselineMb": 202,
          "rssIdleMb": 769,
          "rssPaclitaxelMb": null,
          "runs": 3,
          "processes": 6,
          "method": "Chromium process-tree physical footprint; three-run medians.",
          "note": "Default example; synthetic SMILES paste failed; no empty-document command."
        },
        "themes": {
          "light": true,
          "dark": false,
          "how": "fixed",
          "note": "Paclitaxel import unsupported; default example shown."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://hessammehr.github.io/molsketch-cljs/",
        "ran": true,
        "failure": null,
        "downloadBytes": 530768,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "Paste failed; no MOL import or new-document command was available.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "Paste failed; no MOL import or new-document command was available.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "smiles",
            "image": null,
            "note": "No 3D view was available.",
            "structure": null
          }
        ],
        "observations": [
          "The hosted JavaScript build hash is 322271d1520e; source package metadata says 0.1.0.",
          "The initial canvas contains a small P–C–O example and debug state text.",
          "No empty-document command or import interface was visible; both fixture pastes timed out.",
          "No visible commands for templates beyond rings, arrows, formula, names, exports or 3D.",
          "Ctrl+C produced no visible SVG confirmation; clipboard output was not verified."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 84,
        "transferBytes": 119488
      },
      "downloadBytes": 530768,
      "references": [
        "https://github.com/hessammehr/molsketch-cljs",
        "https://hessammehr.github.io/molsketch-cljs/",
        "https://github.com/hessammehr/molsketch-cljs/blob/master/README.md"
      ]
    },
    {
      "id": "p60",
      "slug": "molpad",
      "name": "MolPad",
      "rank": 81,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "@chemistry/molecule",
          "@chemistry/elements"
        ],
        "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/src/components/molpad-content/molpad-content.tsx",
        "note": "Custom SVG canvas; separate same-author chemistry toolkits."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "MolPad React/SVG renderer",
        "language": "TypeScript",
        "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/src/components/molpad-content/molpad-content.tsx#L83-L197"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript configures tooling; HTML hosts demos, CSS styles the editor.",
      "video": null,
      "embedding": {
        "methods": [
          "npm package"
        ],
        "package": "@chemistry/molpad",
        "limit": null,
        "how": "Render MolPad React component; ref handles import and export."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "MIT runtime dependencies, including React, Zustand and the @chemistry libraries.",
        "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/package-lock.json",
        "notice": null,
        "libraries": [
          {
            "name": "@chemistry/molecule",
            "license": "MIT",
            "source": "https://github.com/chemistry/chemical-libraries/blob/master/packages/molecule/LICENSE"
          },
          {
            "name": "@chemistry/elements",
            "license": "MIT",
            "source": "https://github.com/chemistry/chemical-libraries/blob/master/packages/elements/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "MolPad is primarily a React structure-input component with a custom JMol API and basic drawing tools.",
      "summary": "A React component for drawing and editing molecular structures in web applications.",
      "website": "https://vreshch.com/projects",
      "repo": "https://github.com/chemistry/molpad",
      "docs": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/README.md",
      "vendor": "Volodymyr Vreshch",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT license permits use, modification, and redistribution.",
        "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/LICENSE"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v3.2.13",
        "date": "2026-10-31",
        "source": "https://github.com/chemistry/molpad/releases/tag/v3.2.13"
      },
      "engine": {
        "rendering": "SVG elements generated by React",
        "chemistry": "@chemistry/molecule and @chemistry/elements",
        "ui": "React with Zustand state management",
        "source": "https://github.com/chemistry/molpad/tree/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/src"
      },
      "languages": [
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/src/reducers/commands/bond.commands.ts#L26-L73",
          "note": "Drew and changed single, double, and triple bonds.",
          "shot": {
            "image": "evidence/molpad/f-bonds-core.webp",
            "caption": "Single, double and triple bond tools beside a molecular drawing."
          }
        },
        "stereo-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/src/services/mol-svg.helper.ts#L45-L108",
          "note": "Renderer draws straight bond lines without stereochemical bond styles."
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/src/services/mol-svg.helper.ts#L45-L108",
          "note": "Orders other than two or three render as single lines."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "tested",
          "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/src/components/toolbar/left-toolbar/left-toolbar.tsx#L29-L56",
          "note": "Benzene and four-, five-, six-membered ring tools worked.",
          "shot": {
            "image": "evidence/molpad/f-rings.webp",
            "caption": "Benzene ring on the canvas beside ring tools."
          }
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/src/services/templates-helper.service.ts#L1-L15",
          "note": "Built-in library contains only benzene and three simple saturated rings."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/src/reducers/commands/atom.commands.ts#L12-L29",
          "note": "Element labels editable; charges and isotopes lack editor controls.",
          "shot": {
            "image": "evidence/molpad/f-atom-labels.webp",
            "caption": "Nitrogen and oxygen labels on a structure, with element tools."
          }
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No reaction arrow controls visible."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No curved arrow controls visible."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No formula or mass display or command visible."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No name input or conversion command visible."
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No naming command visible."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No 3D view control visible in MolPad."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No import or export controls visible."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Simulated MOL text paste produced no structure; no file controls."
        },
        "smiles": {
          "status": "no",
          "evidence": "tested",
          "source": null,
          "note": "Simulated SMILES paste produced no structure; no import control."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No export command visible."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No export command visible."
        },
        "png-export": {
          "status": "no",
          "evidence": "ui",
          "source": null,
          "note": "No export command visible."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/README.md#usage",
          "note": "React ref API exposes loadMolecule and getJmol."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/chemistry/molpad/blob/master/README.md#usage",
          "note": "Render MolPad React component; ref handles import and export."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/src/components/molpad-content/molpad-content.tsx#L126-L214",
          "note": "Green atom and bond halos appear only during hover."
        }
      },
      "caveats": [
        "Public API exchanges custom JMol objects; standard chemical file exchange is unverified.",
        "The renderer supports straight single, double, and triple bonds only.",
        "README differs from package.json on TypeScript/build tooling and from LICENSE on the copyright holder."
      ],
      "github": {
        "url": "https://github.com/chemistry/molpad",
        "stars": 8,
        "checkedOn": "2026-11-06",
        "firstCommit": "2020-12-27",
        "commits": 127,
        "contributors": 3,
        "pushedAt": "2026-10-31T02:14:27Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "v3.2.13",
        "canvas": "evidence/molpad/canvas.webp",
        "canvasLight": "evidence/molpad/canvas-light.webp",
        "canvasDark": "evidence/molpad/canvas-dark.webp",
        "memory": {
          "idleMb": 163,
          "paclitaxelMb": null,
          "baselineMb": 50.28,
          "rssIdleMb": 421.48,
          "rssPaclitaxelMb": null,
          "runs": 3,
          "processes": 4,
          "method": "Median Chromium process-tree physical footprints; MiB, headless Playwright.",
          "note": "Published MOL paste produced no structure; no import control."
        },
        "themes": {
          "light": true,
          "dark": true,
          "how": "in-app setting",
          "note": "Host darkens; canvas stays white. Paclitaxel import unsupported; caffeine shown."
        },
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://vreshch.com/projects",
        "ran": true,
        "failure": null,
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "New canvas ignored simulated SMILES and MOL paste; no import control.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "mol",
            "image": null,
            "note": "New canvas ignored simulated SMILES and MOL paste; no import control.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "unsupported",
            "input": "sdf",
            "image": null,
            "note": "No 3D view or SDF import control in MolPad.",
            "structure": null
          }
        ],
        "observations": [
          "The hosted editor initially displayed a caffeine-like structure.",
          "New cleared the preloaded drawing before fixture import attempts.",
          "No editor version was displayed; version uses the research file.",
          "The periodic table opens inside the editor.",
          "The adjacent CrystalView is a separate project, not MolPad's 3D view."
        ]
      },
      "perf": {
        "kind": "web",
        "launchMs": null,
        "idleMb": null,
        "loadMs": 2551,
        "transferBytes": 568477
      },
      "downloadBytes": null,
      "references": [
        "https://github.com/chemistry/molpad",
        "https://github.com/chemistry/molpad/blob/90b4c5cb8bf1f75cf18560e4b228f7449ec957b3/README.md"
      ]
    },
    {
      "id": "p85",
      "slug": "bkchem-python-3-modernized",
      "name": "BKChem Python 3 Modernized",
      "rank": 82,
      "builtOn": {
        "relation": "fork",
        "editor": "BKChem",
        "libraries": [
          "OASA",
          "InChI"
        ],
        "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/main.py",
        "note": "BKChem fork; bundled OASA; optional InChI executable provides identifier generation."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "BKChem custom bond and label renderer (Tkinter Canvas)",
        "language": "Python",
        "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/bond.py#L294-L414"
      },
      "enginesChecked": true,
      "languageNote": "HTML and XML are documentation and templates.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-2.0-or-later",
        "how": "External scripting launches its own Tk window; embedding unconfirmed."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Bundled OASA: GPL-2.0-or-later; PIDDLE: LGPL v2-or-later; PDFgen: permissive notice-retention and no-endorsement terms.",
        "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/oasa/oasa/__init__.py",
        "notice": null,
        "libraries": [
          {
            "name": "BKChem",
            "license": "GPL-2.0-or-later",
            "source": "https://bkchem.zirael.org/download/bkchem-0.13.0.tar.gz"
          },
          {
            "name": "OASA",
            "license": "GPL-2.0-or-later",
            "source": "https://bkchem.zirael.org/download/oasa-0.13.1.tar.gz"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A substantial standalone editor implements 2D chemical documents and vector exports, although source inspection reveals incomplete Python 3 modernization.",
      "summary": "A Python 3 fork of BKChem for drawing 2D molecular structures, reactions, and vector chemical figures.",
      "website": "https://github.com/vijaymasand/BKChem_python_3",
      "repo": "https://github.com/vijaymasand/BKChem_python_3",
      "docs": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/doc/html/index.html",
      "vendor": "Vijay Masand, Gaurav Masand and Krish Masand; original BKChem by Beda Kosata",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-2.0-or-later",
        "text": "GPL version 2 or later; package metadata abbreviates this as GPLv2.",
        "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/README.md"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/vijaymasand/BKChem_python_3/releases"
      },
      "engine": {
        "rendering": "Tkinter Canvas; custom SVG writer; Cairo and Piddle export backends",
        "chemistry": "Bundled OASA",
        "ui": "Tkinter with Pmw (Python MegaWidgets)",
        "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/paper.py"
      },
      "languages": [
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "tested",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/doc/html/x56.html",
          "note": "Bond buttons visible; automated canvas clicks produced no drawing."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/bond.py#L697",
          "note": "Wedge, hatch and wavy adder bonds are implemented."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/doc/html/x56.html",
          "note": "Shift-click cycles double-bond centering and side."
        },
        "rings": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/templates/templates.cdml#L12",
          "note": "Built-in benzene and three- through eight-membered ring templates."
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/templates/templates.cdml#L396",
          "note": "Includes a cyclohexane chair template."
        },
        "chains": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/modes.py#L731",
          "note": "Keyboard adds fixed-length chains; no drag-to-length chain tool."
        },
        "templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/templates/templates.cdml#L352",
          "note": "Includes purine and other heterocyclic structure templates."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/doc/custom_templates_en.html",
          "note": "Save As Template stores named reusable structures."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/group.py#L177",
          "note": "Known groups including Ph and OMe can be expanded."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/atom.py#L241",
          "note": "Charges and element labels supported; isotope editing is unverified."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/modes.py#L1710",
          "note": "Radical, biradical and electron-pair marks."
        },
        "keyboard-drawing": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/modes.py#L666",
          "note": "Keyboard label editing requires selecting atoms first."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/modes.py#L369",
          "note": "Rectangle selection; rotation, mirroring and scaling use separate commands."
        },
        "perspective": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/modes.py#L1281",
          "note": "Dedicated 3D rotation mode tilts molecular drawings."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/arrow.py#L53",
          "note": "Forward, equilibrium, retrosynthetic and resonance arrow types."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/arrow.py#L429",
          "note": "Editable curved electron and fishhook arrows."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/reaction.py#L31",
          "note": "Native CDML stores reactant and product references to molecular objects."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/modes.py#L1710",
          "note": "Includes a drawable pz orbital mark."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/doc/html/x56.html",
          "note": "Canvas text supports fonts, bold, italic, subscripts and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/modes.py#L1615",
          "note": "Rectangles, ellipses, polygons, polylines and bracket drawing modes."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/doc/html/x83.html",
          "note": "Aligns object edges or centers."
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/paper.py#L2139",
          "note": "Regenerates unselected geometry around a selected connected bond fragment.",
          "engine": {
            "library": "OASA (bundled Python coordinate generator)",
            "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/paper.py#L2139-L2179"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/paper.py#L1991",
          "note": "Document standards persist; personal-style saving uses removed Python 2 file()."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/context_menu.py#L275",
          "note": "Individual objects expose line and area colors."
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/paper.py#L1881",
          "note": "Page dimensions and orientation; tabs represent separate documents."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/validator.py#L59",
          "note": "Validator exists; lazy map() prevents molecule checks under Python 3.",
          "engine": {
            "library": "Ported from BKChem (Python validator using bundled OASA valence model)",
            "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/validator.py#L54-L71"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/paper.py#L1629",
          "note": "Computes formula, molecular weight and monoisotopic mass.",
          "engine": {
            "library": "OASA (bundled Python periodic_table.formula_dict); Ported from BKChem (Python formula assembly)",
            "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/paper.py#L1638-L1652"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/plugins/fetch_from_webbook.py#L1",
          "note": "Legacy NIST name lookup retains incompatible Python 2 imports.",
          "engine": {
            "library": "NIST Chemistry WebBook (remote HTTP lookup through legacy Python plugin)",
            "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/plugins/fetch_from_webbook.py#L13-L36"
          }
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/plugins/fetch_name_from_webbook.py#L1",
          "note": "Legacy NIST name lookup, not systematic naming; Python 2 imports remain.",
          "engine": {
            "library": "NIST Chemistry WebBook (remote HTTP name lookup by InChI through legacy Python plugin)",
            "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/plugins/fetch_name_from_webbook.py#L66-L120"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/oasa/oasa/query_atom.py#L52",
          "note": "Query atoms support R, A, Q, X and element lists."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/plugins/fetch_from_webbook.py#L1",
          "note": "NIST structure-fetch plugin retains incompatible Python 2 imports.",
          "engine": {
            "library": "NIST Chemistry WebBook (remote HTTP lookup through legacy Python plugin)",
            "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/plugins/fetch_from_webbook.py#L13-L36"
          }
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/plugins/CDXML.py#L42",
          "note": "Read/write implemented; importer retains Python 3 type errors.",
          "engine": {
            "library": "Ported from BKChem (Python CDXML importer and exporter)",
            "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/plugins/CDXML.py"
          }
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/plugins/molfile.py#L39",
          "note": "MOL read/write; editor exposes .mol rather than an SDF route.",
          "engine": {
            "library": "OASA (bundled Python MOL reader and writer)",
            "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/oasa_bridge.py#L64-L75"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/oasa_bridge.py#L38",
          "note": "Read/write implemented; legacy UI warnings conflict with bundled parser capabilities.",
          "engine": {
            "library": "OASA (bundled Python SMILES parser and writer)",
            "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/oasa_bridge.py#L38-L48"
          }
        },
        "inchi": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/main.py#L1266",
          "note": "Limited import; external-binary generation retains Python 3 string/bytes errors.",
          "engine": {
            "library": "OASA (bundled Python InChI parser); InChI (optional external local command-line executable for generation)",
            "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/oasa/oasa/inchi.py#L774-L870"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/doc/html/c112.html",
          "note": "Exports plain SVG and editable CDML embedded in SVG."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/plugins/pdf_cairo.py#L29",
          "note": "Vector PDF through Cairo; also includes a Piddle backend."
        },
        "png-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/plugins/image_export.py#L231",
          "note": "PNG exporter offers 300 and 600 dpi presets."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/doc/external_import_en.html",
          "note": "Legacy API documentation; Python 2 examples require adaptation."
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/doc/batch_mode_en.html",
          "note": "Batch scripts hide the window but still require Tk/X."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/doc/custom_plugins_en.html",
          "note": "XML descriptors register Python script and drawing-mode extensions."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/main/doc/external_import_en.html",
          "note": "External scripting launches its own Tk window; embedding unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vijaymasand/BKChem_python_3/blob/f30798c8c3c33e198bfdc1ad4a8ec7bf73714876/bkchem/xml_writer.py#L324",
          "note": "Atom area colors provide persistent backgrounds preserved in SVG exports."
        }
      },
      "caveats": [
        "Source distribution only; no tagged releases or binary installers. Runtime was not tested.",
        "The full Python 3 port claim conflicts with incompatible validation, style, CDXML, batch and legacy-plugin code.",
        "Legacy manual export lists and SMILES warnings disagree with current code; scripting examples retain Python 2 syntax."
      ],
      "github": {
        "url": "https://github.com/vijaymasand/BKChem_python_3",
        "stars": 211,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-04-15",
        "commits": 9,
        "contributors": 1,
        "pushedAt": "2026-04-23T08:38:01Z",
        "archived": false
      },
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "BKChem_python_3-main.zip",
        "ran": false,
        "failure": "GUI launched, but computer-use mouse actions did not open Tk menus or draw bonds. Stopped after about ten minutes; fixture imports and export checks could not be completed. This does not establish that those features are unsupported. --version also failed with TypeError: decoding str is not supported.",
        "downloadBytes": 3142789,
        "installedBytes": 28999680,
        "captures": [],
        "observations": [
          "Default startup shows a blank white canvas with two toolbar rows.",
          "No fixture structure was imported; startup-window.png records the test blocker.",
          "Mouse actions did not open Tk menus under either attempted runtime.",
          "The version command failed before printing a version.",
          "Source metadata says 1.0.5; its About-version constant says 0.14.0-pre2."
        ]
      },
      "perf": null,
      "downloadBytes": 3142789,
      "references": [
        "https://github.com/vijaymasand/BKChem_python_3",
        "https://github.com/vijaymasand/BKChem_python_3/blob/main/README.md"
      ]
    },
    {
      "id": "p03",
      "slug": "chemdoodle-2d",
      "name": "ChemDoodle 2D",
      "rank": 83,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "OPSIN"
        ],
        "source": "https://www.ichemlabs.com/support/version-history?product=ChemDoodle",
        "note": "OPSIN confirmed in vendor changelog; canvas provenance unestablished."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "iChemLabs Suite",
          "level": "paid",
          "price": "2026-11-06: US$29/month, US$199/year, or US$999 lifetime; +tax."
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "ChemDoodle Java graphics library",
        "language": "Java",
        "source": "https://www.ichemlabs.com/news/read?post=1708"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=gKPkSCF5nYU",
        "embed": "https://www.youtube-nocookie.com/embed/gKPkSCF5nYU",
        "title": "ChemDoodle 2D Introduction",
        "author": "ChemDoodle",
        "linkedFrom": "https://www.chemdoodle.com/",
        "poster": "https://www.chemdoodle.com/img/chemdoodle/video_splash.png"
      },
      "embedding": {
        "methods": [
          "script tag"
        ],
        "package": null,
        "limit": "Separate Web Components product; GPLv3 or proprietary license",
        "how": "Load ChemDoodleWeb.js and ChemDoodleWeb-uis.js; instantiate ChemDoodle.SketcherCanvas(canvasId,width,height)."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": "Linux bundle: LGPL libraries; LibrePDF MPL-1.1/LGPL; EPL-2.0; vecmath/Temurin GPL-2.0 with Classpath exceptions; Apache/BSD/MIT; FreeType FTL/GPL-2.0; MPL-2.0 Public Suffix List data. jsr-275 license unspecified.",
        "source": "https://www.ichemlabs.com/downloads/ChemDoodle-linux-12.12.1.bin",
        "notice": null,
        "libraries": [
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It creates multipage chemical drawing documents with reactions, styled text, and publication-ready vector exports.",
      "summary": "Desktop software for drawing chemical structures, reactions, and publication figures.",
      "website": "https://www.chemdoodle.com/",
      "repo": null,
      "docs": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf",
      "vendor": "iChemLabs, LLC",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary paid license; 14-day evaluation trial.",
        "source": "https://www.ichemlabs.com/licensing"
      },
      "price": {
        "text": "2026-11-05: USD $29/month, $199/year, or $999 lifetime; suite license, plus tax.",
        "source": "https://www.ichemlabs.com/store"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "12.12.1",
        "date": "2026-09-19",
        "source": "https://www.ichemlabs.com/support/version-history?product=ChemDoodle"
      },
      "engine": {
        "rendering": null,
        "chemistry": "ChemDoodle cheminformatics engine and OPSIN",
        "ui": null,
        "source": "https://www.ichemlabs.com/support/version-history?product=ChemDoodle"
      },
      "languages": [
        "Java"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Bonds",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Bonds%20Palette",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Coordinate%20Covalent",
          "note": "Dative, hydrogen, and zero-order bonds.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Double%20Bond%20Asymmetry",
          "note": "Flip asymmetric bonds; symmetry settings center them.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Rings",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Chair",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Chains",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Templates",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Templates",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Abbreviations",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Isotopes",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Radicals",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Changing%20Atom%20Labels",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Lasso",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Rotate%20in%203D",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Arrows",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Electron%20Pushing",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Reactions",
          "note": "RXN and reaction SMILES retain reactants and products.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Atom%20Mapping",
          "note": "Manual mapping; stored in RXN, SMILES, CDX, and CDXML.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Orbitals",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Text%20Areas",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Shapes",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Distributing",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Grouping",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Cleaning%20Structures",
          "note": null,
          "engine": {
            "library": "In-house (ChemDoodle 2D coordinate-layout algorithm, local Java library)",
            "source": "https://www.ichemlabs.com/news/read?post=cd2d11_10_released"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Style%20Sheets",
          "note": "ACS, RSC, and Nature presets.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Style%20Sheets",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Colors",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "pages": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Number%20of%20Pages",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Inserting%20Images",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=TLC",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Warnings",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Stereochemistry",
          "note": null,
          "engine": {
            "library": "CENTRES by John May (bundled Java library for CIP descriptors)",
            "source": "https://www.ichemlabs.com/news/read?post=cd2d11_13_released"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Elemental%20Analysis",
          "note": null,
          "engine": {
            "library": "In-house (ChemDoodle molecular-mass and elemental-analysis algorithms, local Java library)",
            "source": "https://www.ichemlabs.com/news/read?post=cd2d11_9_released"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Lipophilicity",
          "note": "Includes logP and TPSA estimates.",
          "engine": {
            "library": "In-house (ChemDoodle Java API descriptor algorithms, local)",
            "source": "https://www.ichemlabs.com/news/read?post=1708"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Name%20to%20Structure",
          "note": null,
          "engine": {
            "library": "OPSIN (bundled Java library)",
            "source": "https://www.ichemlabs.com/support/version-history?product=ChemDoodle"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Structure%20to%20Name",
          "note": null,
          "engine": {
            "library": "In-house (ChemDoodle Java API IUPAC naming algorithms, local)",
            "source": "https://www.ichemlabs.com/news/read?post=1708"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=NMR",
          "note": "Predicts proton and carbon-13 shifts.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Repeat%20Units",
          "note": "Integer repeat counts expand into all-atom structures.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Sequence%20Tool",
          "note": "Amino-acid sequence construction.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Chemical%20Image%20Recovery",
          "note": null,
          "engine": {
            "library": "In-house (ChemDoodle Chemical Image Recovery, local Java implementation)",
            "source": "https://www.ichemlabs.com/news/read?post=chemical_image_recovery"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=MolGrabber",
          "note": "Retrieves structures from PubChem, ChemSpider, and ChemExper.",
          "engine": {
            "library": "PubChem, ChemSpider and ChemExper (remote databases through MolGrabber)",
            "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#page=91"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=3D%20Graphics",
          "note": "Rotatable orthographic models; advanced graphics use companion ChemDoodle 3D.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Crystallographic",
          "note": "CIF import; vendor claim.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "cdxml": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=ChemDraw",
          "note": null,
          "engine": {
            "library": "In-house (ChemDoodle Java file-format interpreters, local)",
            "source": "https://www.ichemlabs.com/news/read?post=508"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=ChemDraw",
          "note": null,
          "engine": {
            "library": "In-house (ChemDoodle Java file-format interpreters, local)",
            "source": "https://www.ichemlabs.com/news/read?post=508"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=MDL%20Connection%20Table",
          "note": null,
          "engine": {
            "library": "In-house (ChemDoodle Java file-format interpreters, local)",
            "source": "https://www.ichemlabs.com/news/read?post=508"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=SMILES",
          "note": null,
          "engine": {
            "library": "In-house (ChemDoodle Java file-format interpreters, local)",
            "source": "https://www.ichemlabs.com/news/read?post=508"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=InChI",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=RXN",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Scalable%20Vector%20Graphics",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Portable%20Document%20Format",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "png-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Resolution",
          "note": "PNG resolution is configurable; default is 300 dpi.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Clipboard",
          "note": "Chemical clipboard formats; compatibility depends on platform.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#search=Round%20Trip%20Editing",
          "note": "Windows OLE; macOS copy-and-paste round-trip workflow.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://web.chemdoodle.com/tutorial/2d-structure-canvases/sketcher-canvas",
          "note": "Separate Web Components product; GPLv3 or proprietary license"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#page=449",
          "note": "Windows OLE; repeated Word double-click edits require delete/undo workaround.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemDoodleUserGuide.pdf#page=266",
          "note": "Filled highlights around selected atoms and bonds.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        }
      },
      "caveats": [
        "Sold only as part of the iChemLabs suite.",
        "Internet access is required for activation.",
        "Office round-trip editing depends on operating system and application compatibility."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.chemdoodle.com/",
        "https://ichemlabs.com/store"
      ]
    },
    {
      "id": "p73",
      "slug": "labcanvas-figure-editor",
      "name": "LabCanvas Figure Editor / MolDraw",
      "rank": 84,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Vendor documentation reviewed does not establish canvas provenance or chemistry dependencies."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "Free",
          "level": "account",
          "price": "2026-11-06: Free; up to 3 designs"
        },
        {
          "name": "LabCanvas Pro",
          "level": "paid",
          "price": "2026-11-06: US$19/month or US$199/year; applicable taxes extra"
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "MolDraw Canvas/SVG bond/label renderer",
        "language": "JavaScript",
        "source": "https://www.labcanvas.com/moldraw/assets/exportMoleculeBitmap-Dd_pWinV.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [
          "iframe"
        ],
        "package": null,
        "limit": "Free hosted editor; only /embed permits cross-site framing.",
        "how": "Embed https://www.moldraw.com/embed in an iframe; use height=\"640\" and width=\"100%\"."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "Indigo chemistry compiled to WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Implemented molecular drawing and editable figure integration support publication-oriented 2D documents, with paid exports and documented vector output.",
      "summary": "Browser-based molecule and reaction drawing integrated with editable scientific figures.",
      "website": "https://www.labcanvas.com/",
      "repo": null,
      "docs": "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing",
      "vendor": "LabCanvas Private Limited",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary service; free accounts allow three designs, while exports require LabCanvas Pro.",
        "source": "https://www.labcanvas.com/terms"
      },
      "price": {
        "text": "2026-11-05: Free for three designs; Pro US$19/month or US$199/year, before applicable taxes.",
        "source": "https://www.labcanvas.com/pricing"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://www.labcanvas.com/moldraw"
      },
      "engine": {
        "rendering": "HTML canvas 2D and a custom SVG serializer in MolDraw",
        "chemistry": "Indigo WebAssembly, in-house structure logic, and OpenChemLib for 3D conformers",
        "ui": "React",
        "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing",
          "note": "Manual drawing with single, double and triple bond tools.",
          "plan": "Free",
          "planLevel": "account"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/drawAtomDecorations-CufdJh65.js",
          "note": "Solid wedge, hashed wedge and wavy bond rendering.",
          "plan": "Free",
          "planLevel": "account"
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Dative and dotted hydrogen bonds have drawing handlers."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/drawing/special-bond-types-dative-hydrogen-bold-wavy-and-query/",
          "note": "Click double bonds to cycle centered, right and left."
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing",
          "note": "Dedicated benzene and other ring tools.",
          "plan": "Free",
          "planLevel": "account"
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Dedicated chair and boat cyclohexane placement commands."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Dragging generates zigzag chain coordinates at the configured bond length.",
          "plan": "Free",
          "planLevel": "account"
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing",
          "note": "Common group templates accompany the ring tools.",
          "plan": "Free",
          "planLevel": "account"
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/canvasAnnotationColors-BnBaEyYA.js",
          "note": "ExpandAlias converts recognized group labels into explicit atoms."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Element, formal charge, isotope and alias editing commands.",
          "plan": "Free",
          "planLevel": "account"
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Lone-pair and radical tools update individual atoms.",
          "plan": "Free",
          "planLevel": "account"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/shortcutCatalog-BLlbW4ux.js",
          "note": "Select an atom, then type an element or group abbreviation."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Lasso selection, rotation, scaling and horizontal/vertical reflection."
        },
        "perspective": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "3D cleanup creates a canvas pose that users can rotate."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing",
          "note": "Forward, equilibrium and retrosynthesis arrows with reagent text.",
          "plan": "Free",
          "planLevel": "account"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/paintStructure-D7DtQ6Ay.js",
          "note": "Editable curved electron-flow arrows support full and single-electron heads."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Reaction SMILES imports and exports chemically represented reaction sides."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/moleculeEngineWorker-CwnVYNCI.js",
          "note": "Indigo automapping returns atom maps applied to the drawing."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/paintStructure-D7DtQ6Ay.js",
          "note": "Placeable s, p, d and dz2 orbital graphics."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Canvas text supports font selection and subscript/superscript character ranges."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/documentation",
          "note": "Figure editor provides editable shapes, pen paths and freehand curves.",
          "plan": "Free",
          "planLevel": "account"
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/documentation",
          "note": "Figure editor supports alignment and even horizontal or vertical spacing.",
          "plan": "Free",
          "planLevel": "account"
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/documentation",
          "note": "Figure editor has Group and Ungroup commands.",
          "plan": "Free",
          "planLevel": "account"
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing",
          "note": "Structure cleanup is part of the documented drawing workflow.",
          "engine": {
            "library": "In-house (JavaScript local cleanup); optional Indigo (WebAssembly layout/clean2d)",
            "source": "https://www.labcanvas.com/moldraw/assets/moleculeEngineWorker-CwnVYNCI.js"
          },
          "plan": "Free",
          "planLevel": "account"
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/useStructureTheme-BuQl8-dY.js",
          "note": "ACS 1996, RSC, Nature and other drawing presets."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Bond and font preferences persist in local browser storage."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Selection color commands target atoms, bonds and canvas objects.",
          "plan": "Free",
          "planLevel": "account"
        },
        "pages": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/documentation",
          "note": "Figure artboards; multipage documents use the separate Slides app.",
          "plan": "Free",
          "planLevel": "account"
        },
        "pictures": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Image files and pasted raster images become canvas image objects.",
          "plan": "Free",
          "planLevel": "account"
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/documentation",
          "note": "Figure editor provides editable tables with scientific styles.",
          "plan": "Free",
          "planLevel": "account"
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/moleculeEngineWorker-CwnVYNCI.js",
          "note": "Local heuristic flags valence, charge and stereo problems.",
          "engine": {
            "library": "In-house (JavaScript valence, charge and stereo heuristics)",
            "source": "https://www.labcanvas.com/moldraw/assets/moleculeEngineWorker-CwnVYNCI.js"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/moleculeEngineWorker-CwnVYNCI.js",
          "note": "Native stereo tags and Indigo CIP fallback supply R/S and E/Z.",
          "engine": {
            "library": "In-house (JavaScript R/S and E/Z assignment); Indigo (WebAssembly calculateCip fallback)",
            "source": "https://www.labcanvas.com/moldraw/assets/moleculeEngineWorker-CwnVYNCI.js"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/moleculeEngineWorker-CwnVYNCI.js",
          "note": "Indigo computes molecular formula, molecular weight and monoisotopic mass.",
          "engine": {
            "library": "In-house (JavaScript formula/mass calculations); Indigo (WebAssembly calculated properties)",
            "source": "https://www.labcanvas.com/moldraw/assets/index-BIvqTKMQ.js"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/moleculeEngineWorker-CwnVYNCI.js",
          "note": "Indigo computes logP, pKa and molar refractivity.",
          "engine": {
            "library": "Indigo (WebAssembly logP, pKa and molar refractivity)",
            "source": "https://www.labcanvas.com/moldraw/assets/moleculeEngineWorker-CwnVYNCI.js"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing",
          "note": "PubChem name lookup opens matching structures for editing; network required.",
          "engine": {
            "library": "PubChem web service (PUG REST name lookup)",
            "source": "https://www.labcanvas.com/moldraw/assets/pubchemNameResolve-DMi3vDDx.js"
          },
          "plan": "Free",
          "planLevel": "account"
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "PubChem IUPAC lookup only; unindexed structures cannot receive generated names.",
          "engine": {
            "library": "PubChem web service (PUG REST SMILES-to-IUPACName lookup)",
            "source": "https://www.labcanvas.com/moldraw/assets/index-BIvqTKMQ.js"
          }
        },
        "nmr-prediction": {
          "status": "no",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/useStructureTheme-BuQl8-dY.js",
          "note": "NMR menu calls an always-null extension context; predictor is unwired."
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/useStructureTheme-BuQl8-dY.js",
          "note": "R/R1/R2 aliases and generic query bond tools."
        },
        "polymers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/canvasAnnotationColors-BnBaEyYA.js",
          "note": "Polymer presets create atom-linked repeating units with editable SRU brackets."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/tools/free-chem-tools/peptide-dna-sequence-to-structure.html",
          "note": "Sequence builder opens peptides, DNA and RNA in MolDraw."
        },
        "image-to-structure": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.moldraw.com/chrome-addon",
          "note": "MolDraw Pro; monthly scan allowance."
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing",
          "note": "Search PubChem by name and import an editable structure.",
          "engine": {
            "library": "PubChem web service (PUG REST and autocomplete)",
            "source": "https://www.labcanvas.com/moldraw/assets/pubchemNameResolve-DMi3vDDx.js"
          },
          "plan": "Free",
          "planLevel": "account"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing",
          "note": "The same molecule can be turned in a 3D view.",
          "engine": {
            "library": "3Dmol.js (JavaScript/WebGL viewer); OpenChemLib (JavaScript conformer option)",
            "source": "https://www.labcanvas.com/moldraw/assets/src-DfP_H2GS.js"
          },
          "plan": "Free",
          "planLevel": "account"
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/features",
          "note": "Separate LabCanvas 3D Studio opens CIF/POSCAR files; vendor claim.",
          "plan": "Free",
          "planLevel": "account"
        },
        "cdxml": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Native atom/bond import and export; Pro downloads; fidelity untested.",
          "engine": {
            "library": "In-house (JavaScript native CDXML atom/bond import and export)",
            "source": "https://www.labcanvas.com/moldraw/assets/index-BIvqTKMQ.js"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Indigo binary import/export; Pro downloads; fidelity untested.",
          "engine": {
            "library": "Indigo (WebAssembly binary CDX import/export conversion)",
            "source": "https://www.labcanvas.com/moldraw/assets/index-BIvqTKMQ.js"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "MOL read/write; Pro exports; SDF import reads first record only.",
          "engine": {
            "library": "In-house (JavaScript MOL parser/writer and first-record SDF import); Indigo (WebAssembly optional MOL V3000 conversion)",
            "source": "https://www.labcanvas.com/moldraw/assets/index-BIvqTKMQ.js"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing",
          "note": "Paste SMILES and read drawing SMILES; file exports require Pro.",
          "engine": {
            "library": "In-house (JavaScript native SMILES parser/writer); optional Indigo (WebAssembly conversion/layout)",
            "source": "https://www.labcanvas.com/moldraw/assets/moleculeEngineWorker-CwnVYNCI.js"
          },
          "plan": "Free",
          "planLevel": "account"
        },
        "inchi": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Indigo import/export and clipboard conversion; Pro downloads.",
          "engine": {
            "library": "Indigo (WebAssembly InChI import/export conversion)",
            "source": "https://www.labcanvas.com/moldraw/assets/index-BIvqTKMQ.js"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/index-BG9vBs9g.js",
          "note": "Indigo import/export; reaction layout fidelity unverified; Pro downloads."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/exportMoleculeBitmap-Dd_pWinV.js",
          "note": "Custom serializer emits vector SVG; downloads require Pro.",
          "plan": "LabCanvas Pro",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/documentation",
          "note": "Pro; vector PDF through Figure editor; vendor claim.",
          "plan": "LabCanvas Pro",
          "planLevel": "paid"
        },
        "png-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://www.labcanvas.com/moldraw/assets/RasterExportDialog-D1bn3vcK.js",
          "note": "Pro; physical width and 300/600 dpi export settings.",
          "plan": "LabCanvas Pro",
          "planLevel": "paid"
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/import-export/how-to-use-moldraw-structures-in-word-and-powerpoint/",
          "note": "Reopen embedded drawing in MolDraw; no Office add-in."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/documentation",
          "note": "Pro; MCP server supports figure editing; vendor claim.",
          "plan": "LabCanvas Pro",
          "planLevel": "paid"
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/plugins/moldraw-plugins-overview-and-how-to-install/",
          "note": "Installable plugins; most require a free account."
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.moldraw.com/docs/developers/how-to-embed-moldraw-and-interactive-demos/",
          "note": "Embed https://www.moldraw.com/embed in an iframe; use height=\"640\" and width=\"100%\"."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.labcanvas.com/documentation",
          "note": "Pro; built-in assistant edits figure objects; vendor claim.",
          "plan": "LabCanvas Pro",
          "planLevel": "paid"
        }
      },
      "caveats": [
        "An account is required; the free plan permits three designs and excludes downloads and exports.",
        "Standalone MolDraw PDF output is raster; vector PDF requires the Figure editor.",
        "NMR's menu is unwired in the inspected build; interactive usability was not tested."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://www.labcanvas.com/moldraw/",
        "ran": false,
        "failure": "The hosted editor redirected to LabCanvas sign-in before drawing; no account was used.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "Build identifier comes from the hosted index-CEdVcYSq.js bundle.",
          "The sign-in screen is saved as sign-in-window.png."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.labcanvas.com/",
        "https://www.labcanvas.com/blog/moldraw-chemical-structure-drawing"
      ]
    },
    {
      "id": "p05",
      "slug": "marvin-desktop-suite",
      "name": "Marvin Desktop Suite / MarvinSketch",
      "rank": 85,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "InChI",
          "RInChI"
        ],
        "source": "https://docs.chemaxon.com/latest/formats_iupac-inchi-inchikey-rinchi-and-rinchikey.html",
        "note": "Native InChI/RInChI libraries; original MarvinSketch canvas documented by Chemaxon."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "Marvin Desktop Suite / MarvinSketch",
          "level": "paid",
          "price": "2026-11-06: Contact sales."
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "In-house Marvin molecular renderer",
        "language": "Java",
        "source": "https://apidocs.chemaxon.com/marvin/developer/beans/api/chemaxon/marvin/beans/MolPrinter.html"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=BmFXD9BiXDo",
        "embed": "https://www.youtube-nocookie.com/embed/BmFXD9BiXDo",
        "title": "MarvinSketch - ChemAxon's chemical drawing tool",
        "author": "Certara - Chemaxon",
        "linkedFrom": "https://docs.chemaxon.com/latest/marvin_tutorials.html",
        "poster": "https://i.ytimg.com/vi_webp/BmFXD9BiXDo/maxresdefault.webp"
      },
      "embedding": {
        "methods": [
          "desktop widget"
        ],
        "package": "com.chemaxon:chemaxon-marvin-classic",
        "limit": "Proprietary license; Java Swing host required.",
        "how": "Instantiate MSketchPane; add it to a Swing JPanel."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Native InChI library"
        }
      ],
      "thirdParty": {
        "summary": "Vendor core inventory (2024): LGPL-2.1/3.0, MPL, EPL/CDDL/GPL-2.0+Classpath alternatives, Ubuntu Font Licence and restricted UnRAR/Oracle terms.",
        "source": "https://docs.chemaxon.com/latest/legal_used-libraries.html",
        "notice": null,
        "libraries": [
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          },
          {
            "name": "RInChI",
            "license": "IUPAC/InChI-Trust InChI Licence No. 1.0",
            "source": "https://github.com/IUPAC-InChI/RInChI/blob/main/src/LICENCES/RINCHI_LICENCE.TXT"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "MarvinSketch produces publication-quality 2D chemical documents with journal styles, annotations, and multipage layout.",
      "summary": "Desktop software for drawing publication-quality chemical structures, reactions, and multipage documents.",
      "website": "https://www.certara.com/marvin/",
      "repo": null,
      "docs": "https://docs.chemaxon.com/latest/marvin_marvinsketch_user-guide.html",
      "vendor": "Chemaxon (Certara)",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary commercial software requiring a Chemaxon license.",
        "source": "https://docs.chemaxon.com/latest/legal_end-user-license-agreement-eula.html"
      },
      "price": {
        "text": "Commercial; contact sales for pricing (2026-11-05).",
        "source": "https://docs.chemaxon.com/latest/licensing_index.html"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "26.1.4",
        "date": "2026-10-15",
        "source": "https://docs.chemaxon.com/latest/marvin_history-of-changes.html"
      },
      "engine": {
        "rendering": null,
        "chemistry": "Chemaxon chemistry toolkit (Marvin/JChem)",
        "ui": "Java Swing",
        "source": "https://docs.chemaxon.com/latest/general_public-repository.html"
      },
      "languages": [
        "Java"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_draw-bonds.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_stereochemistry-in-marvinsketch.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_draw-bonds.html",
          "note": "Coordinate and multicenter bonds.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_draw-bonds.html",
          "note": "Above, centered, and below alignments.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_templates-in-marvinsketch.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Conformer templates documented; chair/Haworth contents not verified."
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_draw-chains.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_templates-in-marvinsketch.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_pop-up-menus-of-marvinsketch.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_abbreviated-superatom-groups.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_pop-up-menus-of-marvinsketch.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_pop-up-menus-of-marvinsketch.html",
          "note": "Radical types can be assigned to individual atoms.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_marvinsketch_getting-started.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_geometric-transformation-of-structures-and-objects.html",
          "note": "Lasso selection, rotation, scaling, and flipping are documented.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_moving-and-rotating.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_creating-reactions.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_electron-flow-arrows.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_creating-reactions.html",
          "note": "Chemical reaction export supports single-step reactions only.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_mapping-reactions.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_adding-editing-and-formatting-text.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_drawing-shapes.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_marvinsketch_edit-menu.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Chemical S-groups documented; general object grouping not verified."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_cleaning.html",
          "note": null,
          "engine": {
            "library": "In-house Chemaxon Cleaner (local Java core library)",
            "source": "https://apidocs.chemaxon.com/marvin/developer/beans/api/chemaxon/core/calculations/clean/Cleaner.html"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_drawing-styles.html",
          "note": "Includes ACS and Royal Society of Chemistry presets.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_drawing-styles.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_pop-up-menus-of-marvinsketch.html",
          "note": "Individual bond colors are configurable through Format.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "pages": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_creating-a-multipage-document.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "pictures": {
          "status": "no",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_marvin-js-and-marvin-sketch.html",
          "note": "Official comparison explicitly marks picture import unsupported."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_valence-check.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_stereochemistry-in-marvinsketch.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_analysis-box.html",
          "note": null,
          "engine": {
            "library": "In-house Chemaxon ElementalAnalysisPlugin (local Java calculator)",
            "source": "https://docs.chemaxon.com/latest/marvin_marvin-beans-examples.html#events"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_calculations-plugins-in-marvinsketch.html",
          "note": "logP and TPSA available inside licensed MarvinSketch.",
          "engine": {
            "library": "In-house Chemaxon Calculator Plugins (local Java LogPPlugin/TPSAPlugin)",
            "source": "https://docs.chemaxon.com/latest/marvin_marvin-beans-examples.html#events"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/name-to-structure_user-guide.html",
          "note": null,
          "engine": {
            "library": "In-house Chemaxon Name to Structure (local Java; MolImporter name module)",
            "source": "https://docs.chemaxon.com/latest/name-to-structure_developer-guide.html"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/structure-to-name_user-guide.html",
          "note": null,
          "engine": {
            "library": "In-house Chemaxon Structure to Name (local Java; MolExporter name module)",
            "source": "https://docs.chemaxon.com/latest/structure-to-name_developer-guide.html"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/calculators_nmr-predictor.html",
          "note": "Predicts both proton and carbon-13 chemical shifts.",
          "engine": {
            "library": "In-house Chemaxon NMR Predictor (local Java NMRCalculator)",
            "source": "https://docs.chemaxon.com/latest/marvin_marvin-beans-examples.html#events"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_markush-structures-in-marvinsketch.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_structural-repeating-unit-sru-polymers.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_biomolecules.html",
          "note": "Imports peptide, DNA, and RNA sequences.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/formats_image-import-in-marvin.html",
          "note": "Ordinary raster recognition requires separately installed OSRA.",
          "engine": {
            "library": "OSRA (separately installed native C++ command-line utility)",
            "source": "https://docs.chemaxon.com/latest/formats_image-import-in-marvin.html"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/general_notice-about-cas-registry-numbers-r.html",
          "note": "CAS-number lookup retrieves structures from public NIH/Wikimedia sources.",
          "engine": {
            "library": "In-house Chemaxon name resolver (Java client; remote NIH/Wikimedia HTTPS services)",
            "source": "https://docs.chemaxon.com/latest/general_notice-about-cas-registry-numbers-r.html"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_moving-and-rotating.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/formats_chemdraw-sketch-file-cdx-cdxml.html",
          "note": "Import supported; alpha export through API or Source editor.",
          "engine": {
            "library": "In-house Chemaxon I/O CDXML module (local Java; alpha export)",
            "source": "https://docs.chemaxon.com/latest/formats_chemdraw-sketch-file-cdx-cdxml.html"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/formats_chemdraw-sketch-file-cdx-cdxml.html",
          "note": null,
          "engine": {
            "library": "In-house Chemaxon I/O CDX module (local Java MolImporter/MolExporter)",
            "source": "https://docs.chemaxon.com/latest/formats_chemdraw-sketch-file-cdx-cdxml.html"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/formats_mdl-mol-import-and-export-options.html",
          "note": "MOL V2000/V3000 and SDF supported.",
          "engine": {
            "library": "In-house Chemaxon I/O MDL module (local Java MolImporter/MolExporter)",
            "source": "https://docs.chemaxon.com/latest/formats_mdl-mol-import-and-export-options.html"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/formats_smiles.html",
          "note": null,
          "engine": {
            "library": "In-house Chemaxon I/O SMILES module (local Java MolImporter/MolExporter)",
            "source": "https://docs.chemaxon.com/latest/formats_smiles.html"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/formats_iupac-inchi-inchikey-rinchi-and-rinchikey.html",
          "note": "Windows/Linux; InChI input/output unavailable on macOS.",
          "engine": {
            "library": "InChI 1.06 (native C library; Windows/Linux Chemaxon integration)",
            "source": "https://docs.chemaxon.com/latest/formats_iupac-inchi-inchikey-rinchi-and-rinchikey.html"
          },
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/formats_mdl-molfiles-rgfiles-sdfiles-rxnfiles-rdfiles-formats.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_exporting-to-image.html",
          "note": null,
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/formats_pdf.html",
          "note": "Vector PDF export documented.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "PNG supported; 300 dpi export not verified."
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_copy-paste-and-draganddrop.html",
          "note": "Editable MOL/SMILES transfer; drawing-layout preservation is not guaranteed.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_ole-user-guide.html",
          "note": "Windows OLE; editing requires installed Marvin with OLE support.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/molconvert_index.html",
          "note": "Bundled Molconvert converts structures and renders images.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/calculators_custom-calculator-plugin-implementation.html",
          "note": "Custom Java Calculator Plugins and external services.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_marvinsketch_simple-bean.html",
          "note": "Instantiate MSketchPane; add it to a Swing JPanel."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_ole-user-guide.html",
          "note": "Windows MarvinOLE requires JChem_NET_API; embedded structures edit in MarvinSketch.",
          "plan": "Marvin Desktop Suite / MarvinSketch",
          "planLevel": "paid"
        },
        "color-highlight": {
          "status": "no",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_sketch-js-comparison.html#coloring-and-highlighting-options-for-atoms-bonds-and-shapes",
          "note": "Vendor comparison explicitly excludes atom and bond highlighting."
        }
      },
      "caveats": [
        "Free individual academic licenses ended on July 31, 2026.",
        "CDXML export is documented as alpha and limited to API/Source editor.",
        "InChI input/output is unavailable on macOS; Office OLE editing requires Windows."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.certara.com/marvin/",
        "https://www.certara.com/announcement/modernizing-the-academic-program-and-retiring-chemicalize/"
      ]
    },
    {
      "id": "p116",
      "slug": "chemdraft-yuansu",
      "name": "ChemDraft (元素智研)",
      "rank": 86,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://en.chemdraft.com/",
        "note": "Vendor claims independent development; external chemistry dependencies remain undisclosed."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": null,
        "name": "ChemDraft Qt/QPainter renderer (WCanvasImpl)",
        "language": "C++",
        "source": "https://web.chemdraft.com/ChemDraft.wasm?v=94ddc3b4ef67"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Vendor-arranged integration; commercial use requires separate authorization.",
        "how": "Contact vendor for JavaScript editor integration; public setup instructions unavailable."
      },
      "otherLanguages": [
        {
          "language": "QML",
          "role": "Qt Quick user interface"
        },
        {
          "language": "JavaScript",
          "role": "WebAssembly browser loader"
        },
        {
          "language": "C",
          "role": "InChI code compiled to WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "It supports complete 2D drawing documents with reaction schemes, publication styles, editable annotations and export for publication.",
      "summary": "Chemical drawing software for molecular structures, reaction schemes, publication figures, and editable Office documents.",
      "website": "https://en.chemdraft.com/",
      "repo": null,
      "docs": "https://en.chemdraft.com/help",
      "vendor": "深圳元素智研科技有限公司",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Proprietary; individual drawing is free, with noncommercial use by default.",
        "source": "https://en.chemdraft.com/legal/service"
      },
      "price": {
        "text": "Free individual drawing (2026-11-05); enterprise services require a quote.",
        "source": "https://en.chemdraft.com/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "0.9.43",
        "date": null,
        "source": "https://en.chemdraft.com/api/download/windows"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/5-2",
          "note": "Single, double and triple bonds; manual bond-order changes."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/5-2",
          "note": "Solid wedge, hashed wedge and wavy bonds explicitly listed."
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/5-2",
          "note": "Dative, hydrogen and quadruple bonds explicitly listed."
        },
        "double-bond-side": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/a-3",
          "note": "Direction cycling documented; left/right/center states not individually specified."
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/5-3",
          "note": "Three- through eight-membered rings and benzene tools."
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/5-3",
          "note": "Dedicated left and right chair conformation tools."
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/5-3",
          "note": "Drag zigzag chains with live carbon counts."
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/5-4",
          "note": "Functional groups, amino acids, peptides, sugars and supramolecular templates."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/5-4",
          "note": "Save selected structures into the custom template library."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/10-1",
          "note": "Chemically recognized groups expand and collapse."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/7-1",
          "note": "Elements and charges supported; general isotope mass editing unverified."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/7-1",
          "note": "Atom-associated radical dots and lone-pair markers."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/a-3",
          "note": "Hover atoms or bonds, then press drawing shortcuts."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/6-3",
          "note": "Lasso selection, scaling, rotation and flips documented across editing sections."
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/6-9",
          "note": "Rotate editable canvas structures to change their perspective."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/8-3",
          "note": "Forward, equilibrium, resonance and retrosynthetic arrows."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/8-3",
          "note": "Electron-transfer arrows with editable curvature and arrowhead styles."
        },
        "reaction-data": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/8-3",
          "note": "Recognizes reactant/product relationships; reaction-format storage not documented."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/10-3",
          "note": "Editable orbital shapes, including s, p, d and f."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/8-1",
          "note": "Canvas text supports fonts, subscripts and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/8-4",
          "note": "Editable shapes, brackets, arcs and free curves."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/6-4",
          "note": "Object alignment and horizontal or vertical equal distribution."
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/10-5",
          "note": "Group, move collectively, edit members and ungroup."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/6-8",
          "note": "Normalizes bond lengths, angles, rings and overall layout."
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/9-1",
          "note": "ACS, RSC and Nature presets explicitly listed."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/9-1",
          "note": "Custom mode saves bond, font and other drawing parameters."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/8-4",
          "note": "Selected objects support individual line and fill colors."
        },
        "pages": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/9-2",
          "note": "Page sizes and margins documented; multipage documents unverified."
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/11-2",
          "note": "Import PNG, JPEG, BMP, GIF and WebP images."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/7-6",
          "note": "Structure problems receive red warning borders."
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/7-4",
          "note": "Automatically computes atom R/S and bond E/Z descriptors."
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/12-1",
          "note": "Computes molecular formula, exact mass and molecular weight."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/12-4",
          "note": "Converts pasted IUPAC names into editable 2D structures."
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/12-4",
          "note": "Generates IUPAC names that update with structure edits."
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/12-5",
          "note": "Predicts proton and carbon-13 chemical shifts and spectra."
        },
        "markush": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/7-1",
          "note": "Markush attachment markers documented; full R-group/query handling unverified."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/10-2",
          "note": "Recognizes bracket-associated repeat units and supports polymer connection points."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/10-8",
          "note": "PNG/JPG uploads and screenshots become editable chemical structures."
        },
        "database-lookup": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/12-3",
          "note": "Searches PubChem/Reaxys externally; structure retrieval into editor unverified."
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/12-2",
          "note": "Generates rotatable, zoomable 3D molecular models."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/1-4",
          "note": "Import and export explicitly documented; clipboard exchange also supported."
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/1-4",
          "note": "Import and export explicitly documented; clipboard exchange also supported."
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/1-4",
          "note": "MOL, including V2000, and SDF import/export explicitly documented.",
          "engine": {
            "library": "RDKit FileParsers (C++ compiled to browser WebAssembly; confirmed MOL import)",
            "source": "https://web.chemdraft.com/ChemDraft.wasm?v=94ddc3b4ef67"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/11-7",
          "note": "Clipboard export; import through Special Paste in section 11.3.",
          "engine": {
            "library": "RDKit SmilesWrite (vendor SciRDKit C++ compiled to browser WebAssembly; confirmed SMILES clipboard export)",
            "source": "https://web.chemdraft.com/ChemDraft.wasm?v=94ddc3b4ef67"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/11-7",
          "note": "Copies structures as InChI and InChIKey.",
          "engine": {
            "library": "RDKit InChI adapter with InChI 1.07.3 (C/C++ compiled to browser WebAssembly; confirmed InChI clipboard export)",
            "source": "https://web.chemdraft.com/ChemDraft.wasm?v=94ddc3b4ef67"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/11-6",
          "note": "PDF export documented; vector output not specified."
        },
        "png-export": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/11-6",
          "note": "PNG export documented; 300-dpi output not specified."
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/11-4",
          "note": "Editable ChemDraw import; reverse direct clipboard editing unverified."
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/11-5",
          "note": "Double-click embedded Office/WPS structures to edit and update them."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/openapi",
          "note": "Vendor-arranged integration; commercial use requires separate authorization."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/13-6",
          "note": "Built-in assistant generates editable structures, mechanisms and routes on canvas."
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://en.chemdraft.com/help/11-5",
          "note": "Word/PowerPoint objects reopen ChemDraft on double-click; edits update the document."
        }
      },
      "caveats": [
        "Service terms restrict use to noncommercial purposes unless otherwise authorized.",
        "The browser edition has fewer functions; Linux and mobile clients are listed as coming soon.",
        "Live downloads supply 0.9.43 beta and Mac PKG; older pages claim 2.1.0, DMG, or additional platforms."
      ],
      "github": null,
      "hands": {
        "testedVersion": "build 3d096b252fa8",
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://web.chemdraft.com/",
        "ran": false,
        "failure": "The editor opened with a WeChat sign-in panel; Escape and canvas clicks did not dismiss it. Testing stopped without signing in.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "Startup displayed a WeChat sign-in panel.",
          "The build identifier comes from the hosted version.json.",
          "Login screen recorded in login-required.png."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://en.chemdraft.com/",
        "https://en.chemdraft.com/help/11-6"
      ]
    },
    {
      "id": "p96",
      "slug": "indraw",
      "name": "InDraw",
      "rank": 87,
      "builtOn": {
        "relation": "fork",
        "editor": "MolPad",
        "libraries": [
          "RDKit",
          "Indigo",
          "InChI"
        ],
        "source": "https://indrawforweb.atomdeep.com/src/js/core-1abaed23.js",
        "note": "Modified MolPad canvas; RDKit chemistry and desktop Indigo cleanup are visible in shipped code."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "InDraw Free",
          "level": "account",
          "price": "Free (2026-11-06)"
        },
        {
          "name": "InDraw Professional",
          "level": "paid",
          "price": "$96/user/month or $960/user/year (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "borrowed",
        "name": "Modified MolPad Canvas renderer",
        "language": "JavaScript",
        "source": "https://indrawforweb.atomdeep.com/src/js/core-1abaed23.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "file",
        "url": "https://resource.integle.com/video/product/indraw.mp4",
        "embed": null,
        "title": "InDraw简介",
        "author": null,
        "linkedFrom": "https://www.integle.com/",
        "poster": null
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Internal iframe bridge exists; public embedding support remains unconfirmed."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": "Bundled SVG parser code carries MPL-2.0 file-level copyleft; MIT/Zlib libraries are also included.",
        "source": "https://indrawforweb.atomdeep.com/src/js/lib-cac61bbd.js",
        "notice": null,
        "libraries": [
          {
            "name": "MolPad",
            "license": "MIT",
            "source": "https://github.com/chemistry/molpad/blob/master/LICENSE"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its documented structure, reaction, text and layout tools support complete publication figures and editable Office documents.",
      "summary": "A desktop and web editor for chemical structures, reactions, and publication figures.",
      "website": "https://www.atomdeep.com/en/site/indraw-office?slug=indraw",
      "repo": null,
      "docs": "https://www.integle.com/static/indraw-guide",
      "vendor": "AtomDeep Scientific Technologies Pte. Ltd. (Integle)",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary; free edition with paid Professional features.",
        "source": "https://www.atomdeep.com/en/site/indraw-office?slug=indraw"
      },
      "price": {
        "text": "Free edition; Professional listed at $96/user/month or $960/user/year (2026-11-05).",
        "source": "https://www.atomdeep.com/en/site/indraw-office?slug=indraw"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "8.0",
        "date": "2026-07-31",
        "source": "https://www.integle.com/news/news/detail?title_id=11744"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://blog.csdn.net/ShanghaiIntegle/article/details/147387849",
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": "Alignment switches; left, right and centered choices unspecified."
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.atomdeep.com/en/site/indraw-office?slug=indraw",
          "note": "Professional only; vendor claim.",
          "plan": "InDraw Professional",
          "planLevel": "paid"
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://blog.csdn.net/ShanghaiIntegle/article/details/163070563",
          "note": "Canvas structures rotate around X and Y axes."
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://blog.csdn.net/ShanghaiIntegle/article/details/168880159",
          "note": "Version 8.2 adds electron-cloud and orbital drawing."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null,
          "engine": {
            "library": "RDKit.js (browser WebAssembly get_new_coords); RDKit and Indigo (desktop Electron IPC); In-house (desktop normalClean)",
            "source": "https://indrawforweb.atomdeep.com/src/js/core-1abaed23.js"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zhuanlan.zhihu.com/p/2062539263732872163",
          "note": "ACS Document 1996 preset."
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://blog.csdn.net/ShanghaiIntegle/article/details/162278606",
          "note": "Bond settings persist; font persistence unverified."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/news/news/detail?title_id=11744",
          "note": "TIF/TIFF import."
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://blog.csdn.net/ShanghaiIntegle/article/details/163045552",
          "note": "Red warnings flag valence and connectivity errors."
        },
        "stereo-perception": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": "R/S computed; E/Z unverified.",
          "engine": {
            "library": "RDKit.js (browser WebAssembly get_stereo_tags); RDKit (desktop rdkitAPI.getStereoTags IPC)",
            "source": "https://indrawforweb.atomdeep.com/src/js/core-1abaed23.js"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null,
          "engine": {
            "library": "In-house (JavaScript getFormulaLayout and isotopicDistribution formula/mass calculators)",
            "source": "https://indrawforweb.atomdeep.com/src/js/core-1abaed23.js"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null,
          "engine": {
            "library": "RDKit.js (browser WebAssembly get_descriptors, CrippenClogP and TPSA); RDKit (desktop rdkitAPI IPC)",
            "source": "https://indrawforweb.atomdeep.com/src/js/core-1abaed23.js"
          },
          "plan": "InDraw Free",
          "planLevel": "account"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.atomdeep.com/en/site/indraw-office?slug=indraw",
          "note": "Vendor claim; Chinese and English IUPAC names.",
          "plan": "InDraw Free",
          "planLevel": "account"
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": "Free: 10/day; Professional: unlimited.",
          "engine": {
            "library": "NMRNet++ (remote prediction service, /predict for proton and carbon shifts)",
            "source": "https://indrawforweb.atomdeep.com/src/js/core-1abaed23.js"
          },
          "plan": "InDraw Free",
          "planLevel": "account"
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null,
          "plan": "InDraw Free",
          "planLevel": "account"
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": "Free: 10/day; Professional: unlimited.",
          "plan": "InDraw Free",
          "planLevel": "account"
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": "Built-in compound database.",
          "engine": {
            "library": "PubChem PUG REST (remote CAS-to-SMILES fallback to the internal compound database)",
            "source": "https://indrawforweb.atomdeep.com/src/js/core-1abaed23.js"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": null,
          "plan": "InDraw Free",
          "planLevel": "account"
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": "3D module reads mmCIF/bCIF."
        },
        "cdxml": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://zhuanlan.zhihu.com/p/2038310303029514913",
          "note": "Import documented in manual; export in publisher tutorial.",
          "engine": {
            "library": "In-house (JavaScript MPMolecule.loadCDXML/getCDXML parser and serializer)",
            "source": "https://indrawforweb.atomdeep.com/src/js/core-1abaed23.js"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.atomdeep.com/en/site/indraw-office?slug=indraw",
          "note": null,
          "engine": {
            "library": "CDXConverter 1.0.0 (bundled JavaScript cdx2cdxml/cdxml2cdx); In-house (CDXML drawing-model mapping)",
            "source": "https://indrawforweb.atomdeep.com/src/js/lib-cac61bbd.js"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://blog.csdn.net/ShanghaiIntegle/article/details/151624471",
          "note": "MOL/SDF export; imports documented in 3D and InTable.",
          "engine": {
            "library": "Ported from Ketcher (bundled JavaScript MolfileParser and MolfileSaver for MOL/SDF)",
            "source": "https://indrawforweb.atomdeep.com/src/js/lib-cac61bbd.js"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": "Bundled InTable reads and generates SMILES.",
          "engine": {
            "library": "RDKit.js (browser WebAssembly SMILES import); Ported from Ketcher (bundled JavaScript SmilesGenerator export)",
            "source": "https://indrawforweb.atomdeep.com/src/js/lib-cac61bbd.js"
          },
          "plan": "InDraw Free",
          "planLevel": "account"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/static/indraw-guide",
          "note": "InTable conversion.",
          "engine": {
            "library": "RDKit.js (browser WebAssembly get_inchi and get_inchikey_for_inchi)",
            "source": "https://indrawforweb.atomdeep.com/src/js/core-1abaed23.js"
          },
          "plan": "InDraw Free",
          "planLevel": "account"
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://blog.csdn.net/ShanghaiIntegle/article/details/151624471",
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://blog.csdn.net/ShanghaiIntegle/article/details/151624471",
          "note": "PNG export; 300 dpi output undocumented."
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/news/news/detail?title_id=11658",
          "note": null
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/news/news/detail?title_id=11658",
          "note": "Free Word copies watermarked; Professional removes watermark."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://indrawforweb.atomdeep.com/src/app-iframe-B6rDldjV.js",
          "note": "Internal iframe bridge exists; public embedding support remains unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.integle.com/news/news/detail?title_id=11658",
          "note": "Windows Word objects open in InDraw by double-click for editing."
        }
      },
      "caveats": [
        "Free Word copies and 3D exports carry watermarks; custom templates require Professional.",
        "Desktop requires registration and periodic login; naming, NMR and image recognition require internet.",
        "One desktop account can be active on only one device at a time."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://indrawforweb.atomdeep.com/",
        "ran": false,
        "failure": "The hosted app displayed “Login to Edit”; testing stopped as instructed.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "The hosted page opened to a blank canvas with a Login to Edit button.",
          "Build identifier taken from the served app-iframe-CiYMKsXf.js bundle name.",
          "The access screen is saved as login-required.png."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.atomdeep.com/en/site/indraw-office?slug=indraw"
      ]
    },
    {
      "id": "p30",
      "slug": "marvin-js",
      "name": "Marvin JS",
      "rank": 88,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://docs.chemaxon.com/latest/marvin-js_index.html",
        "note": "Vendor-developed sketcher; public third-party notices do not establish the chemistry-library implementation."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "Marvin JS",
          "level": "paid",
          "price": "Contact vendor (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "Marvin JS JsCanvas renderer",
        "language": "Java",
        "source": "https://github.com/wallerlab/decider/blob/a1917a049022645cf83539ca1093bdf29e84fa51/web-app/js/marvinjs/gui/FFF3F3986CD8945F5436630EEF492ED0.cache.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=stR2q5-hV7Y",
        "embed": "https://www.youtube-nocookie.com/embed/stR2q5-hV7Y",
        "title": "[NON JAVA Chemical Editor Tutorial Part 7] Marvin JS: Keyboard shortcuts to speed up drawing",
        "author": "Certara - Chemaxon",
        "linkedFrom": "https://docs.chemaxon.com/latest/marvin-js_video-tutorials.html",
        "poster": "https://i.ytimg.com/vi/stR2q5-hV7Y/hqdefault.jpg"
      },
      "embedding": {
        "methods": [
          "iframe"
        ],
        "package": null,
        "limit": "Commercial license required; new sales end December 2026.",
        "how": "Load editor.html in an iframe; control through the JavaScript helper API."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Compiled browser runtime and integration API"
        },
        {
          "language": "C",
          "role": "Remote native InChI conversion"
        }
      ],
      "thirdParty": {
        "summary": "Core: Apache-2.0, MIT, Bouncy Castle and es6-promise licenses; bundled examples: Apache-2.0/MIT.",
        "source": "https://docs.chemaxon.com/latest/marvin-js_third-party-licenses.html",
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "Primarily a licensed web component for chemical structure input inside other applications.",
      "summary": "A commercial web editor for drawing chemical structures and reactions inside other applications.",
      "website": "https://www.certara.com/marvin/",
      "repo": null,
      "docs": "https://docs.chemaxon.com/latest/marvin-js_user-guide.html",
      "vendor": "Chemaxon (Certara)",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary commercial license required for deployment.",
        "source": "https://docs.chemaxon.com/latest/marvin-js_installation-and-upgrade.html#license-requirement"
      },
      "price": {
        "text": "Commercial; contact vendor for pricing (2026-11-05).",
        "source": "https://www.certara.com/announcement/marvin-js-end-of-life-and-transition-notice/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "25.3.0",
        "date": "2025-09-12",
        "source": "https://docs.chemaxon.com/latest/marvin-js_history-of-changes.html"
      },
      "engine": {
        "rendering": "HTML5 canvas",
        "chemistry": "Chemaxon web services; optionally JChem Microservices",
        "ui": "Google Web Toolkit (GWT)",
        "source": "https://docs.chemaxon.com/latest/marvin-js_developer-resources.html"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_tools-toolbar-left-toolbar.html#bond-tools",
          "note": "Single, double and triple bonds can be drawn and changed.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_stereochemistry.html#stereo-bonds",
          "note": "Solid wedge, hashed wedge and wavy stereo bonds.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_tools-toolbar-left-toolbar.html#bond-tools",
          "note": "Coordinate and position-variation bonds.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_bond.html#type",
          "note": "Double bonds support left, right and middle alignment.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_template-toolbar-bottom-toolbar.html#structure-templates",
          "note": "Includes cyclopentane, cyclohexane, pyrrole and benzene.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_chains.html",
          "note": "Drag variable-length alkyl chains; Ctrl draws conjugated chains.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "templates": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_template-toolbar-bottom-toolbar.html#structure-templates",
          "note": "Default template toolbar contains five rings; other structures use abbreviations.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "custom-templates": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_history-of-changes.html",
          "note": "Integrator-configured templates; no documented end-user save-template command.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_abbreviations.html",
          "note": "Structured abbreviated groups can be expanded, contracted and ungrouped.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_atom.html",
          "note": "Elements, charges, isotopes, aliases and pseudo atoms.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_radicals-and-lone-pairs.html",
          "note": "Radical electrons and lone pairs can be assigned manually.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_bond.html#type",
          "note": "Hover over a bond and type its bond shortcut.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_selection-context-menu.html",
          "note": "Freehand, rotation and flipping supported; molecule resizing unverified.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_general-toolbar-top-toolbar.html#rotate-3d",
          "note": "Canvas molecules rotate in 3D; coordinate generation requires web services.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_tools-toolbar-left-toolbar.html#reaction-tools",
          "note": "Forward, equilibrium and resonance arrows.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_reaction-mechanism.html",
          "note": "Editable single- and double-electron arrows with adjustable curvature.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_reaction.html#reaction-export-technical-details",
          "note": "Single-step reactions retain roles; multistep schemes export as graphics.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_atom-mapping.html",
          "note": "Manual mapping; automatic mapping requires web services.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_text-dialog.html",
          "note": "Text palette includes Greek letters, arrows, and scientific symbols."
        },
        "rich-text": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_text-dialog.html",
          "note": "Bold, italic, subscript and superscript; font selection unavailable.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_tools-toolbar-left-toolbar.html",
          "note": "Rectangles, ellipses and chemical S-group brackets.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "align": {
          "status": "no",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_marvin-js-and-marvin-sketch.html",
          "note": "Official comparison explicitly excludes alignment."
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_general-toolbar-top-toolbar.html#clean-2d",
          "note": "Requires a configured 2D-clean web service.",
          "engine": {
            "library": "In-house Chemaxon Clean2D (remote Java REST service via MJSWS, JChem Web Services or JChem Microservices; clean2dws)",
            "source": "https://docs.chemaxon.com/latest/marvin-js_web-services-dev.html"
          },
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "no",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_marvin-js-and-marvin-sketch.html",
          "note": "Bond dimensions and text fonts cannot be configured."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_set-box-color-dialog.html",
          "note": "Individual graphical boxes have configurable outline and background colors.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "no",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_marvin-js-and-marvin-sketch.html",
          "note": "Official comparison explicitly excludes picture import."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_view-settings-dialog.html",
          "note": "Marks atoms with incorrect valence.",
          "engine": {
            "library": "In-house Marvin JS (Java compiled to browser JavaScript by GWT; native valence-error checking)",
            "source": "https://docs.chemaxon.com/latest/marvin-js_marvin-js-and-marvin-sketch.html"
          },
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_stereochemistry.html#checking-the-stereoisomerism",
          "note": "R/S and E/Z calculation requires web services.",
          "engine": {
            "library": "In-house Chemaxon CIP Stereo Info (remote Java REST service via MJSWS, JChem Web Services or JChem Microservices; stereoinfows)",
            "source": "https://docs.chemaxon.com/latest/marvin-js_web-services-dev.html"
          },
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_import-dialog.html#supported-import-formats-in-marvin-js",
          "note": "Requires web services and a separate Name to Structure license.",
          "engine": {
            "library": "In-house Chemaxon Name to Structure (remote Java web service through MolConvert/molconvertws; separate naming license)",
            "source": "https://docs.chemaxon.com/latest/marvin-js_import-dialog.html"
          },
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_general-toolbar-top-toolbar.html#export",
          "note": "IUPAC name export requires web services and separate naming license.",
          "engine": {
            "library": "In-house Chemaxon Structure to Name (remote Java web service through MolConvert/molconvertws; separate naming license)",
            "source": "https://docs.chemaxon.com/latest/marvin-js_export-dialog.html"
          },
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_markush-structures.html",
          "note": "R-groups, definitions, R-logic and atom lists.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_s-group-dialog.html",
          "note": "Repeating units, SRU polymers, link nodes and copolymers.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_peptides.html",
          "note": "Typed peptide sequences, cyclic peptides and disulfide bridges.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_marvin-js-and-marvin-sketch.html",
          "note": "Official comparison explicitly excludes structure-image import."
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_general-toolbar-top-toolbar.html#rotate-3d",
          "note": "Rotatable 3D displays; coordinate generation requires web services.",
          "engine": {
            "library": "In-house Marvin JS (GWT-compiled browser JavaScript for display/rotation); remote Chemaxon Clean3D Java web service for coordinate generation",
            "source": "https://docs.chemaxon.com/latest/marvin-js_history-of-changes.html"
          },
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_import-dialog.html#supported-import-formats-in-marvin-js",
          "note": "Import and export require web services; binary import uses files.",
          "engine": {
            "library": "Chemaxon MolConvert (remote Java REST service via MJSWS, JChem Web Services or JChem Microservices; CDX import/export)",
            "source": "https://docs.chemaxon.com/latest/marvin-js_export-dialog.html"
          },
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_export-dialog.html#supported-export-formats-in-marvin-js",
          "note": "MOL V2000 native; SDF and V3000 require web services.",
          "engine": {
            "library": "In-house Marvin JS (GWT-compiled browser JavaScript; native MOL V2000); Chemaxon MolConvert (remote Java web service for SDF and MOL V3000)",
            "source": "https://docs.chemaxon.com/latest/marvin-js_import-dialog.html"
          },
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_web-services-dev.html#molconvert",
          "note": "SMILES import and export require conversion web services.",
          "engine": {
            "library": "In-house Chemaxon MolConvert (remote Java REST service via MJSWS, JChem Web Services or JChem Microservices; molconvertws)",
            "source": "https://docs.chemaxon.com/latest/marvin-js_web-services-dev.html"
          },
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_export-dialog.html#supported-export-formats-in-marvin-js",
          "note": "InChI export requires web services.",
          "engine": {
            "library": "InChI native library (C on remote server, called by Chemaxon MolConvert Java web service; molconvertws)",
            "source": "https://docs.chemaxon.com/latest/formats_iupac-inchi-inchikey-rinchi-and-rinchikey.html"
          },
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_export-dialog.html#supported-export-formats-in-marvin-js",
          "note": "RXN export requires web services.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_history-of-changes.html",
          "note": "SVG export is available through the API.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_export-dialog.html#image-export",
          "note": "PNG pixel dimensions configurable; no documented 300 dpi setting.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_faq.html#copy-paste-fromto-marvin-js",
          "note": "Text-format transfer; browsers block binary CDX and OLE clipboard data.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "office": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/jchem-for-office_history-of-changes.html",
          "note": "Editable MOL/MRV transfer requires separate paid JChem for Office.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_how-to-embed.html#accessing-functions-of-the-sketcher",
          "note": "JavaScript API controls embedded editors.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_marvin-js-and-marvin-sketch.html",
          "note": "Custom buttons invoke user-defined JavaScript functionality.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_how-to-embed.html",
          "note": "Load editor.html in an iframe; control through the JavaScript helper API.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_marvin-js-and-marvin-sketch.html",
          "note": "MOL/MRV data pasting; OLE copy/paste explicitly unsupported in Marvin JS."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin-js_history-of-changes.html",
          "note": "Colored atom/bond patches through API.",
          "plan": "Marvin JS",
          "planLevel": "paid"
        }
      },
      "caveats": [
        "New license sales end December 31, 2026; maintenance and support end December 31, 2027.",
        "Cleanup, stereochemical calculations and extra file formats require configured web services; naming requires additional licenses.",
        "Marvin JS is the legacy embeddable editor, separate from the newer Marvin product."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://marvinjs-demo.chemaxon.com/latest/demo.html",
        "ran": false,
        "failure": "The public demo URL redirects immediately to a Marvin JS end-of-life notice; no drawing editor is served.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "The requested public demo redirected to Certara's end-of-life notice.",
          "The demo response contained no editor scripts or version identifier."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.certara.com/marvin/"
      ]
    },
    {
      "id": "p23",
      "slug": "bkchem",
      "name": "BKChem",
      "rank": 89,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "OASA",
          "InChI"
        ],
        "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/paper.py",
        "note": "Custom canvas uses OASA chemistry; InChI generation invokes an optional external executable."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "BKChem bond/atom/ftext renderer (Tk Canvas)",
        "language": "Python",
        "source": "https://gitlab.com/bkchem/bkchem/-/blob/adfa8595d999fecd6191ce096932c16db6321347/bkchem/bond.py#L279"
      },
      "enginesChecked": true,
      "languageNote": "Auxiliary browser JavaScript and release shell scripts are excluded.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-2.0-or-later",
        "how": "External Python API controls standalone application; editor embedding remains unconfirmed."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Bundled Windows InChI executable"
        },
        {
          "language": "Tcl",
          "role": "Tk GUI runtime"
        }
      ],
      "thirdParty": {
        "summary": "Includes GPL-2.0-or-later (OASA), LGPL (Piddle), MIT (Pmw) and legacy IUPAC/InChI Trust Licence 1.0 in Windows builds.",
        "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/README",
        "notice": null,
        "libraries": [
          {
            "name": "OASA",
            "license": "GPL-2.0-or-later",
            "source": "https://bkchem.zirael.org/download/oasa-0.13.1.tar.gz"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Standalone structure and reaction-scheme drawing, typography, layout controls and vector exports support publication figures.",
      "summary": "Desktop editor for drawing two-dimensional chemical structures, reaction schemes, and publication figures.",
      "website": "https://bkchem.zirael.org/",
      "repo": "https://gitlab.com/bkchem/bkchem",
      "docs": "https://bkchem.zirael.org/wiki/howtos",
      "vendor": "Beda Kosata; Reinis Danne",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-2.0-or-later",
        "text": "GNU GPL version 2 or later.",
        "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/config.py"
      },
      "price": {
        "text": "Free",
        "source": "https://bkchem.zirael.org/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "0.14.0-pre4",
        "date": "2014-01-19",
        "source": "https://gitlab.com/bkchem/bkchem/-/tags/v0.14.0-pre4"
      },
      "engine": {
        "rendering": "Tkinter Canvas on screen; custom SVG serialization and Cairo PDF/PNG export.",
        "chemistry": "OASA; external IUPAC InChI executable for InChI generation.",
        "ui": "Tkinter with Python megawidgets (Pmw).",
        "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/main.py"
      },
      "languages": [
        "Python"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/doc/doc.xml",
          "note": "Click existing bonds to cycle single, double and triple."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/modes.py",
          "note": "Wedge, hatch and wavy adder bond styles."
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/modes.py",
          "note": "Dashed and dotted bonds; no dedicated dative bond type."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/doc/doc.xml",
          "note": "Shift-click cycles centered and either-side double bonds."
        },
        "rings": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/templates/templates.cdml",
          "note": "Includes benzene and common carbocyclic ring templates."
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/templates/templates.cdml",
          "note": "Built-in chair template."
        },
        "chains": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/wiki/tips",
          "note": "Keyboard appends 2–9 atoms; no drag-to-length chain tool."
        },
        "templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/templates/templates.cdml",
          "note": "Includes a fused heterocyclic purine template."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/custom_templates_en.html",
          "note": "Save As Template creates reusable user templates."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/features_en.html",
          "note": "Common groups and linear formulas expand into structures."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/atom.py",
          "note": "Element labels and charges; isotope notation lacks chemical interpretation."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/modes.py",
          "note": "Radical, biradical and lone-pair marks."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/fna_en.html",
          "note": "Select an atom and type its replacement label."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/modes.py",
          "note": "Rectangular selection; no lasso. Rotation, mirroring and scaling available."
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/features_en.html",
          "note": "3D rotation of drawn molecules and fragments."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/features_en.html",
          "note": "Forward, retrosynthetic and equilibrium arrows."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/arrow.py",
          "note": "Editable splines with full or electron-transfer half heads."
        },
        "reaction-data": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/main.py",
          "note": "Legacy reactant/product serialization remains; reaction authoring mode is disabled."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/modes.py",
          "note": "Includes a pz orbital mark."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/doc/doc.xml",
          "note": "Free text supports font styling, subscripts and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/modes.py",
          "note": "Editable vector shapes, polylines and brackets."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/doc/doc.xml",
          "note": "Align selected objects by edges or centers."
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/dialogs.py",
          "note": "Save personal bond, font and color standards."
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/atom.py",
          "note": "Individual atom colors and configurable bond/object colors."
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/main.py",
          "note": "Page sizing supported; tabs save separate documents."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/validator.py",
          "note": "Reports exceeded valence and zero-order bonds.",
          "engine": {
            "library": "In-house (Python validator) with OASA (Python atom valence)",
            "source": "https://gitlab.com/bkchem/bkchem/-/blob/adfa8595d999fecd6191ce096932c16db6321347/bkchem/validator.py#L56"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/paper.py",
          "note": "Computes formula, molecular weight and monoisotopic mass.",
          "engine": {
            "library": "OASA (Python formula and periodic-table mass routines)",
            "source": "https://gitlab.com/bkchem/bkchem/-/blob/adfa8595d999fecd6191ce096932c16db6321347/bkchem/paper.py#L1305"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem-plugins/-/raw/f2600ac1672f98f93e36d5c382c4a80d47428a19/fetch_from_webbook.py",
          "note": "NIST WebBook lookup plugin; current service compatibility unverified.",
          "engine": {
            "library": "NIST Chemistry WebBook (remote HTTP name lookup plugin; OASA Python MOL import)",
            "source": "https://gitlab.com/bkchem/bkchem-plugins/-/blob/f2600ac1672f98f93e36d5c382c4a80d47428a19/fetch_from_webbook.py#L16"
          }
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem-plugins/-/raw/f2600ac1672f98f93e36d5c382c4a80d47428a19/fetch_name_from_webbook.py",
          "note": "Retrieves database names rather than generating systematic nomenclature."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/oasa/oasa/-/raw/40cdb2d7cac6bad44a93c0200eb93236d550e06e/oasa/query_atom.py",
          "note": "Atom lists and A/Q/X/R query atoms."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem-plugins/-/raw/f2600ac1672f98f93e36d5c382c4a80d47428a19/fetch_from_webbook.py",
          "note": "Imports NIST WebBook structures; current service compatibility unverified.",
          "engine": {
            "library": "NIST Chemistry WebBook (remote HTTP lookup plugin; OASA Python MOL import)",
            "source": "https://gitlab.com/bkchem/bkchem-plugins/-/blob/f2600ac1672f98f93e36d5c382c4a80d47428a19/fetch_from_webbook.py#L16"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/progress.log",
          "note": "Imported 3D structures rotate on the drawing canvas."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/plugins/CDXML.py",
          "note": "Experimental CDXML import and export.",
          "engine": {
            "library": "In-house (Python CDXML import/export plugin using xml.dom.minidom)",
            "source": "https://gitlab.com/bkchem/bkchem/-/blob/adfa8595d999fecd6191ce096932c16db6321347/bkchem/plugins/CDXML.py#L45"
          }
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/plugins/molfile.py",
          "note": "MOL read/write; single-molecule export; SDF support unverified.",
          "engine": {
            "library": "OASA (Python MOL reader/writer; SDF unconfirmed)",
            "source": "https://gitlab.com/bkchem/bkchem/-/blob/adfa8595d999fecd6191ce096932c16db6321347/bkchem/oasa_bridge.py#L66"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/features_en.html",
          "note": "Imports a SMILES subset and generates SMILES.",
          "engine": {
            "library": "OASA (Python SMILES parser/writer and coordinate generator)",
            "source": "https://gitlab.com/bkchem/bkchem/-/blob/adfa8595d999fecd6191ce096932c16db6321347/bkchem/oasa_bridge.py#L35"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/inchi_en.html",
          "note": "Subset import; export uses an external InChI executable.",
          "engine": {
            "library": "OASA (Python InChI parser); IUPAC InChI (external native C executable for generation)",
            "source": "https://gitlab.com/bkchem/bkchem/-/blob/adfa8595d999fecd6191ce096932c16db6321347/bkchem/oasa_bridge.py#L52"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/doc/doc.xml",
          "note": "Vector SVG; native CD-SVG also embeds editable BKChem data."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/plugins/pdf_cairo.py",
          "note": "Vector PDF via Cairo."
        },
        "png-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/plugins/png_cairo.py",
          "note": "Cairo export offers configurable resolution up to 10,000 dpi."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/external_import_en.html",
          "note": "Documented external Python control; API described as unstable."
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/batch_mode_en.html",
          "note": "Batch conversion hides windows but requires X on Unix."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://bkchem.zirael.org/custom_plugins_en.html",
          "note": "XML descriptors and Python script or mode extensions."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://bkchem.zirael.org/external_import_en.html",
          "note": "External Python API controls standalone application; editor embedding remains unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitlab.com/bkchem/bkchem/-/raw/adfa8595d999fecd6191ce096932c16db6321347/bkchem/xml_writer.py#L327",
          "note": "Colored backgrounds behind visible atom labels persist in SVG export."
        }
      },
      "caveats": [
        "Homepage lists pre2; latest tag is pre4 (2014); desktop binaries target legacy systems.",
        "Older docs conflict with source: CDXML exists, Cairo exports text on Windows, and SMILES imports E/Z stereochemistry.",
        "Batch conversion requires X on Unix; WebBook lookup plugins use legacy interfaces."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "bkchem-0.13.0.tar.gz",
        "ran": false,
        "failure": "Official stable 0.13.0 source fails before launch under uv Python 3.11.17 with Tk: Python 2 print syntax causes SyntaxError at bkchem.py:96. uv does not support Python 2.7. Official Mac fallback contains only PowerPC/i386 executables; open -n and computer-use fail with -10386 (i386 is no longer supported). No BKChem window opened.",
        "downloadBytes": 965969,
        "installedBytes": 11149312,
        "captures": [],
        "observations": [
          "No document window opened.",
          "Molecule imports, rendering, and feature checks could not be tested."
        ]
      },
      "perf": null,
      "downloadBytes": 965969,
      "references": [
        "https://bkchem.zirael.org/"
      ]
    },
    {
      "id": "p06",
      "slug": "biovia-draw",
      "name": "BIOVIA Draw",
      "rank": 90,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "OpenEye Lexichem"
        ],
        "source": "https://www.3ds.com/support/news/single/t65-2023-notification-regarding-biovia-draw-2024/",
        "note": "Lexichem confirmed for Draw 2024; current canvas provenance unestablished."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "Academic / non-commercial",
          "level": "account",
          "price": "2026-11-06: Free for academics/non-commercial users; registration required."
        },
        {
          "name": "BIOVIA Draw Standalone",
          "level": "paid",
          "price": null
        },
        {
          "name": "Enterprise Edition",
          "level": "paid",
          "price": "2026-11-06: Contact vendor for quote."
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=gi6xMNiDwAA",
        "embed": "https://www.youtube-nocookie.com/embed/gi6xMNiDwAA",
        "title": "NEW in BIOVIA Draw 2026",
        "author": "BIOVIA",
        "linkedFrom": "https://www.3ds.com/products/biovia/draw",
        "poster": "https://i.ytimg.com/vi/gi6xMNiDwAA/default.jpg"
      },
      "embedding": {
        "methods": [
          "desktop widget"
        ],
        "package": null,
        "limit": "Proprietary; embedded viewer only; editing opens separate desktop Draw.",
        "how": "Legacy Renderer/Renditor embeds in .NET forms; Java uses JMolRendererCom."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": [
          {
            "name": "OpenEye Lexichem",
            "license": null,
            "source": null
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It produces publication-quality 2D structures and reaction schemes for scientific documents and Office presentations.",
      "summary": "Windows software for drawing chemical structures, reactions, and chemically modified biological sequences for publications and informatics workflows.",
      "website": "https://www.3ds.com/products/biovia/draw",
      "repo": null,
      "docs": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
      "vendor": "Dassault Systèmes BIOVIA",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary commercial software with a free academic and non-commercial edition.",
        "source": "https://www.3ds.com/assets/Terms/OfferingSpecificTerms/CollaborativeScienceUnifiedLabManagement_2026.pdf"
      },
      "price": {
        "text": "2026-11-05: Free for academic/non-commercial use; contact vendor for commercial pricing.",
        "source": "https://discover.3ds.com/biovia-draw-academic"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": "BIOVIA Draw 2026",
        "date": null,
        "source": "https://www.3ds.com/support/documentation/t49-2025-notification-regarding-biovia-draw-2026"
      },
      "engine": {
        "rendering": null,
        "chemistry": "OpenEye Lexichem (chemical naming)",
        "ui": ".NET desktop application",
        "source": "https://www.3ds.com/support/news/single/t65-2023-notification-regarding-biovia-draw-2024/"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/products/biovia/draw",
          "note": "vendor claim; manually toggle single, double, and triple bonds.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/products/biovia/draw",
          "note": "vendor claim; benzene and cyclohexane ring tools.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/products/biovia/draw",
          "note": "vendor claim; drag to create zigzag carbon chains.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/documentation/resource-library/t104-2024-notification-regarding-biovia-draw-2025",
          "note": "Includes named-reaction templates and abbreviations.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/documentation/t30-2025-notification-regarding-biovia-draw-2025-sp1",
          "note": "Save structures as SCSR templates, including CHEM templates.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://blog.3ds.com/brands/biovia/introducing-a-new-but-familiar-way-to-sketch/",
          "note": "vendor claim; chemically understood abbreviations.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/products/biovia/draw",
          "note": "vendor claim; hover over atoms and type element symbols.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/fileadmin/PRODUCTS-SERVICES/BIOVIA/PDF/biovia-draw-ds.pdf",
          "note": "vendor claim; 3D rotation of drawn queries.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; RXN stores reactants, products, and reagents.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/news/single/t65-2023-notification-regarding-biovia-draw-2024/",
          "note": "Rectangle/square graphic tools and nonchemical brackets.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/documentation/t30-2025-notification-regarding-biovia-draw-2025-sp1",
          "note": "Align Reaction command aligns sequence reactions.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/news/single/t65-2023-notification-regarding-biovia-draw-2024/",
          "note": "Preserves grouping when copying and pasting graphical objects.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/products/biovia/draw",
          "note": "vendor claim; standardizes bond lengths and angles.",
          "engine": {
            "library": "BIOVIA Pipeline Pilot Chemistry SDK / PPChem SDK (local SDK; small-molecule cleanup since Draw 2021)",
            "source": "https://modularss.mood4apps.com/recordati/Server2021/BIOVIA%20Draw%202021%20PRD.pdf"
          },
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://discover.3ds.com/ja/biovia-draw-campaign",
          "note": "vendor claim; ACS and Wiley publication formats.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; colored reaction-scheme annotations.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; bitmap clipboard paste.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "tlc-tables": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://3dswym.3dexperience.3ds.com/wiki/biovia-drug-discovery-development/biovia-draw-add-ins-tlc-plate-authoring-tool_52wF367cTK-AHXurs_sJKw",
          "note": "TLC authoring add-in inserts images, rather than editable canvas objects."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/news/single/t65-2023-notification-regarding-biovia-draw-2024/",
          "note": "Flags excessive valences, overlaps, and stereochemistry rule violations.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/news/single/t65-2023-notification-regarding-biovia-draw-2024/",
          "note": "Computed tetrahedral labels and enhanced E/Z stereochemistry.",
          "engine": {
            "library": "In-house BIOVIA NEMA algorithm (built-in stereochemistry recognition)",
            "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf"
          },
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; formula, molecular weight, and composition.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; HlogP and polar surface area.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; included IUPAC name converter.",
          "engine": {
            "library": "NCI/CADD, PubChem and BIOVIA DiscoveryGate (remote web services via Structure Resolver)",
            "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf"
          },
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/documentation/resource-library/t49-2024-notification-regarding-biovia-draw-2024-sp1",
          "note": "Generates IUPAC names, including granular RNA sequences.",
          "engine": {
            "library": "OpenEye Lexichem Toolkit (integrated library; binding undisclosed)",
            "source": "https://www.3ds.com/support/news/single/t65-2023-notification-regarding-biovia-draw-2024/"
          },
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "nmr-prediction": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://3dswym.3dexperience.3ds.com/wiki/biovia-drug-discovery-development/biovia-draw-add-ins_82s_cafHRzuBOKB7FB6Kgw",
          "note": "External Mnova/NMRdb prediction add-ins; supported nuclei unspecified.",
          "engine": {
            "library": "Mnova (external-tool add-in) or NMRdb.org (remote-web-service add-in)",
            "source": "https://3dswym.3dexperience.3ds.com/wiki/biovia-drug-discovery-development/biovia-draw-add-ins_82s_cafHRzuBOKB7FB6Kgw"
          }
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; R-group queries and variable attachments.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/documentation/t49-2025-notification-regarding-biovia-draw-2026",
          "note": "Supports polymer Sgroups and expansion of MULT bracket structures.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/documentation/t49-2025-notification-regarding-biovia-draw-2026",
          "note": "SCSR, HELM, and BILN support for modified biological sequences.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; OSRA add-in.",
          "engine": {
            "library": "OSRA (local executable via optional OSRAAction .NET add-in)",
            "source": "https://downloads.sourceforge.net/project/osra/plugins/biovia%20draw%202019/OSRAAction.zip"
          },
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; Structure Resolver retrieves PubChem and NCI/CADD structures.",
          "engine": {
            "library": "NCI/CADD, PubChem and BIOVIA DiscoveryGate (remote web services via Structure Resolver)",
            "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf"
          },
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "model-3d": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/news/single/t65-2023-notification-regarding-biovia-draw-2024/",
          "note": "Separate 3D Visualizer removed in 2024; 3D editing remains advertised."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "CDX import documented; export unverified.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; MOL exchange and SDF opening/creation/export.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; SMILES conversion in both directions.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; InChI conversion and InChIKey generation.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/assets/invest/2024-02/biovia-draw-ds.pdf",
          "note": "vendor claim; saves RXN reactions with reagent information.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/documentation/t30-2025-notification-regarding-biovia-draw-2025-sp1",
          "note": "SVG saving and clipboard export added in 2025 SP1.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/documentation/resource-library/t49-2024-notification-regarding-biovia-draw-2024-sp1",
          "note": "Re-editable OLE objects retain updated drawing styles.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://3dswym.3dexperience.3ds.com/post/biovia-laboratory-informatics/integrating-biovia-draw-with-web-applications-%E2%80%93-the-drawbridge_MTK8jYocSMea5uv-7QkN-Q",
          "note": "Enterprise DrawBridge; JavaScript examples invoke installed desktop Draw.",
          "plan": "Enterprise Edition",
          "planLevel": "paid"
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://3dswym.3dexperience.3ds.com/wiki/biovia-drug-discovery-development/biovia-draw-add-ins_82s_cafHRzuBOKB7FB6Kgw",
          "note": "Documented .NET API supports custom C# and VB add-ins."
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://manualzz.com/doc/33298567/biovia-2016-draw-developers-guide?lang=en",
          "note": "Proprietary; embedded viewer only; editing opens separate desktop Draw.",
          "plan": "Enterprise Edition",
          "planLevel": "paid"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.3ds.com/support/documentation/resource-library/t49-2024-notification-regarding-biovia-draw-2024-sp1",
          "note": "Windows Draw OLE objects support structure re-editing.",
          "plan": "Academic / non-commercial",
          "planLevel": "account"
        }
      },
      "caveats": [
        "Free use is restricted to academics and non-commercial users; registration is required.",
        "Desktop support is Windows; Enterprise web integration launches an installed desktop editor.",
        "Some add-ins require separate products or licenses; the linked datasheet predates Draw 2026."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.3ds.com/products/biovia/draw",
        "https://discover.3ds.com/biovia-draw-academic"
      ]
    },
    {
      "id": "p10",
      "slug": "chemwindow",
      "name": "ChemWindow (KnowItAll ChemWindow Edition)",
      "rank": 91,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "OPSIN"
        ],
        "source": "https://sciencesolutions.wiley.com/knowitall-version-history/",
        "note": "Vendor documents OPSIN name conversion; canvas provenance remains unconfirmed."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "KnowItAll ChemWindow Edition",
          "level": "paid",
          "price": "2026-11-06: Quote required."
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Office OLE objects only, listed under Editable in Office. No developer route found."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": [
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "ChemWindow provides chemical structure drawing and ReportIt publishing tools for publication documents.",
      "summary": "Windows software for drawing chemical structures, preparing publication figures, and managing chemical databases.",
      "website": "https://sciencesolutions.wiley.com/chemwindow-chemical-structure-drawing-software/",
      "repo": null,
      "docs": "https://help.knowitall.com/home/Applications/ChemWindow",
      "vendor": "John Wiley & Sons, Inc.",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary commercial software licensed as KnowItAll ChemWindow Edition.",
        "source": "https://sciencesolutions.wiley.com/chemwindow-chemical-structure-drawing-software/"
      },
      "price": {
        "text": "Price by quotation (2026-11-05).",
        "source": "https://sciencesolutions.wiley.com/contact-us/"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "2026.1",
        "date": "2025-12-19",
        "source": "https://sciencesolutions.wiley.com/knowitall-version-history/"
      },
      "engine": {
        "rendering": null,
        "chemistry": "OPSIN (linked name-to-structure conversion)",
        "ui": null,
        "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2026/08/95375-Wiley_KnowItAll_Software_ChemWindow_Edition_Brochure.pdf#page=5"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ChemWindow/Training/Drawing/DrawingBonds",
          "note": "Click bond midpoints to cycle single, double, and triple bonds.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciencesolutions.wiley.com/wiley_chemwindow_hotkeys/",
          "note": "Official hotkey diagram shows wedge, hashed wedge, and wavy bonds.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Toolbars/ChemistryToolbar/Bonds/DativeBond",
          "note": "Dative, hydrogen, and quadruple bond tools.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ChemWindow/Training/Drawing/DrawingRings",
          "note": "Dedicated ring tools include aromatic rings.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Toolbars/ChemistryToolbar/Rings/CyclohexaneChair",
          "note": "Dedicated cyclohexane chair tool.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ChemWindow/Training/Drawing/DrawingBonds#using-the-chain-tool",
          "note": "Drag acyclic chains; Alt adds alternating double bonds.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ChemWindow/Training/Substituents#predefined-substituents",
          "note": "Built-in predefined substituent fragments.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2025/09/09_Training-Drawing_Structures_and_Reactions.pdf#page=8",
          "note": "Drawings save as ChemWindow Structure Template & Style files.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ChemWindow/Training/HotKeys",
          "note": "Ph, Boc, and other labels expand into structures.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ChemWindow/Training/HotKeys",
          "note": "Charges, element labels, and deuterium labels.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Toolbars/ChemistryToolbar/Atoms/RadicalTools",
          "note": "Dedicated radical tools; electron-pair tools also available.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ChemWindow/Training/EditingAtomLabels#using-the-keyboard",
          "note": "Hover over an atom and press its element hotkey.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ChemWindow/Training/SelectionMethods",
          "note": "Lasso selection with rotation, flips, scaling, and stretching.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Toolbars/ChemistryToolbar/Edit/3DRotationTool",
          "note": "Rotate selected canvas structures in three dimensions.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Toolbars/ChemistryToolbar/Reactions/EquilibriumArrow",
          "note": "Forward, equilibrium, resonance, and retrosynthetic arrow tools.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Toolbars/DrawingToolbar/Main/BezierTool",
          "note": "Editable curved arrows with changeable heads via included ReportIt.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/GettingStartedWithKnowItAll/KnowItAllSupportingInformation/InstrumentCompatibility/SupportedFileFormats#structures",
          "note": "RXN and RInChI formats preserve chemical reactions.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ReportIt/Drawing/Orbitals/OrbitalTools",
          "note": "Orbital shapes via included ReportIt.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ChemWindow/Toolbars/TextStyleToolbar",
          "note": "Fonts, superscripts, and subscripts; free captions through included ReportIt.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ReportIt/Drawing/BoxesAndBraces",
          "note": "Editable shapes, brackets, braces, and curves via included ReportIt.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ChemWindow/TitleAndMenuBars/ArrangeMenu",
          "note": "Align Objects and Space Evenly commands.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/ReportIt/Drawing/GroupAndUngroup",
          "note": "Group and ungroup separate objects via included ReportIt.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/TitleAndMenuBars/ChemistryMenu/CleanUp",
          "note": "Tidies structure geometry and bond lengths.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/TitleAndMenuBars/FileMenu/Preferences/ChemWindow/TemplatesStyles",
          "note": "Reusable style files and configurable default structure style.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Toolbars/ObjectStyleToolbar/ObjectColor",
          "note": "Selected objects can use custom colors.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "pages": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/TitleAndMenuBars/FileMenu/DocumentSize",
          "note": "Page setup and multipage documents via included ReportIt.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2025/09/10_Training-Creating_Reports.pdf#page=14",
          "note": "Paste raster pictures into included ReportIt.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/TitleAndMenuBars/EditMenu/InsertNewTable",
          "note": "Editable tables via included ReportIt.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/TitleAndMenuBars/ChemistryMenu/CheckChemistry",
          "note": "Flags invalid labels and incorrect valences.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2026/08/95375-Wiley_KnowItAll_Software_ChemWindow_Edition_Brochure.pdf#page=5",
          "note": "R/S and E/Z recognition; vendor claim.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/TitleAndMenuBars/ChemistryMenu/CalculateMass",
          "note": "Formula, molecular mass, exact mass, and composition.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/TitleAndMenuBars/ChemistryMenu/OPSINName2Structure",
          "note": "OPSIN Name2Structure adds structures from typed chemical names.",
          "engine": {
            "library": "OPSIN (integration form undisclosed)",
            "source": "https://help.knowitall.com/home/TitleAndMenuBars/ChemistryMenu/OPSINName2Structure?x=1"
          },
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "docs",
          "source": "https://sciencesolutions.wiley.com/knowitall-version-history/",
          "note": "IUPAC NameIt was discontinued in KnowItAll 2015."
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2026/08/95375-Wiley_KnowItAll_Software_ChemWindow_Edition_Brochure.pdf#page=10",
          "note": "13C batch prediction in MineIt; vendor claim.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Toolbars/ChemistryToolbar/Atoms/RGroup",
          "note": "Numbered R-groups act as variable groups in structure searches.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2026/08/95375-Wiley_KnowItAll_Software_ChemWindow_Edition_Brochure.pdf#page=10",
          "note": "PubChem structures via MineIt; vendor claim.",
          "engine": {
            "library": "PubChem web service (through KnowItAll MineIt)",
            "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2026/08/95375-Wiley_KnowItAll_Software_ChemWindow_Edition_Brochure.pdf?download=1#page=10"
          },
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/Applications/3DViewIt/GettingStarted",
          "note": "Included 3DViewIt supports rotation and 2D-to-3D conversion.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2025/09/09_Training-Drawing_Structures_and_Reactions.pdf#page=8",
          "note": "MOL read/write; SDF import/export via MineIt databases.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/GettingStartedWithKnowItAll/KnowItAllSupportingInformation/InstrumentCompatibility/SupportedFileFormats#structures",
          "note": "Supports InChI and InChIKey structure files.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.knowitall.com/home/GettingStartedWithKnowItAll/KnowItAllSupportingInformation/InstrumentCompatibility/SupportedFileFormats#structures",
          "note": "Supports MDL RXN and RXN V3000 files.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2025/09/09_Training-Drawing_Structures_and_Reactions.pdf#page=25",
          "note": "Pasted Office objects reopen in ChemWindow for editing.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2026/08/95375-Wiley_KnowItAll_Software_ChemWindow_Edition_Brochure.pdf#page=5",
          "note": "Office OLE objects only, listed under Editable in Office. No developer route found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sciencesolutions.wiley.com/wp-content/uploads/2025/09/09_Training-Drawing_Structures_and_Reactions.pdf#page=26",
          "note": "Windows Office OLE objects reopen in ChemWindow with double-click editing.",
          "plan": "KnowItAll ChemWindow Edition",
          "planLevel": "paid"
        }
      },
      "caveats": [
        "Requires Windows; Mac use requires Parallels 20 and Windows 11.",
        "Pricing requires a quotation; download requires a license verification code.",
        "Some KnowItAll capabilities require additional editions or database subscriptions."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://sciencesolutions.wiley.com/chemwindow-chemical-structure-drawing-software/"
      ]
    },
    {
      "id": "p57",
      "slug": "chemistry-draw",
      "name": "Chemistry Draw",
      "rank": 92,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "Ketcher",
          "Indigo",
          "Miew",
          "Imago"
        ],
        "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src/App.tsx",
        "note": "Embeds Ketcher with native Indigo; Imago recognition is Linux-only."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher Raphaël/SVG; native Indigo exports",
        "language": "TypeScript",
        "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/render/raphaelRender.ts"
      },
      "enginesChecked": true,
      "languageNote": "JavaScript is vendored Raphael and tooling; other scripts handle builds/packaging.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Desktop wrapper; no project-provided embedding route confirmed."
      },
      "otherLanguages": [
        {
          "language": "Rust",
          "role": "Desktop shell and native chemistry service"
        },
        {
          "language": "C++",
          "role": "Native Indigo chemistry/rendering and Imago recognition"
        },
        {
          "language": "JavaScript",
          "role": "Raphaël graphics and Miew 3D"
        }
      ],
      "thirdParty": {
        "summary": "Apache-2.0 Ketcher/Indigo/Imago; Windows also bundles proprietary Microsoft Visual C++ runtime DLLs.",
        "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/docs/architecture.md",
        "notice": "https://github.com/spalax-dev/chemistry_draw/blob/main/NOTICE",
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "Indigo",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Indigo/blob/master/LICENSE"
          },
          {
            "name": "Miew",
            "license": "MIT",
            "source": "https://github.com/epam/miew/blob/main/LICENSE.md"
          },
          {
            "name": "Imago",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/Imago/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "The desktop editor combines chemical drawing, captions, shapes, ACS styling and vector SVG export for publication figures.",
      "summary": "An offline desktop editor for chemical structures, reactions and biomolecules, built around Ketcher.",
      "website": "https://github.com/spalax-dev/chemistry_draw",
      "repo": "https://github.com/spalax-dev/chemistry_draw",
      "docs": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md",
      "vendor": "Chemistry Draw Contributors",
      "license": {
        "kind": "open-source",
        "spdx": "Apache-2.0",
        "text": "Apache License 2.0.",
        "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/README.md#license"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "chemistry-draw-v0.1.6",
        "date": "2026-11-04",
        "source": "https://github.com/spalax-dev/chemistry_draw/releases/tag/chemistry-draw-v0.1.6"
      },
      "engine": {
        "rendering": "SVG through Raphael on screen; native Indigo Renderer for image files.",
        "chemistry": "EPAM Indigo; EPAM Imago for Linux image recognition.",
        "ui": "Tauri v2 with React and TypeScript.",
        "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/docs/architecture.md"
      },
      "languages": [
        "Rust",
        "TypeScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-bonds",
          "note": null
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts",
          "note": "Solid wedge, hashed wedge and wavy bond tools."
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/toolbars/LeftToolbar/Bond/options.ts",
          "note": "Dative and hydrogen bond tools."
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": "Dedicated aromatic and three- through eight-membered ring templates."
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/templates/library.sdf#L8258",
          "note": "Built-in chair and boat templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/editor/tool/chain.ts",
          "note": "Dragging controls the number of chain segments."
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": null
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#templates-toolbar",
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#functional-groups",
          "note": "Functional groups expand, contract and retain underlying chemistry."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-atoms",
          "note": "Atom properties include labels, charges and isotopes."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/epam/ketcher/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/images/13_atom_propn.png",
          "note": "Atom Properties includes a radical selector."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-atoms",
          "note": "Click an atom and type its replacement label."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/editor/tool/select/select.ts",
          "note": "Lasso, rotate and flip; resizing limited to images and shapes."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-reactions",
          "note": "Forward, equilibrium, retrosynthetic and resonance-style arrows."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/editor/operations/rxn/RxnArrowResize.ts",
          "note": "Editable elliptical arrows; full and half heads are available."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/tests/stereochemistry.rs",
          "note": "Native automapping accepts reaction chemistry and produces mapped RXN."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-reactions",
          "note": "Manual mapping, automatic mapping and unmapping."
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#adding-text-objects-on-the-canvas",
          "note": "Font settings, bold, italic, subscripts and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-graphical-objects",
          "note": "Ellipse, rectangle and line tools; structural S-group brackets."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#ketcher-molecules-mode",
          "note": "Clean Up standardizes bond lengths and angles.",
          "engine": {
            "library": "Indigo (native C++ via Rust FFI; indigoClean2d and indigoLayout)",
            "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/ffi/indigo.rs#L151-L159"
          }
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#acs-american-chemical-society-style",
          "note": "Built-in ACS settings preset."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/modal/components/meta/Settings/Settings.tsx",
          "note": "Font and bond settings can be saved and imported as JSON."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Individual atoms and bonds support eight highlight colours."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#adding-images-on-the-canvas",
          "note": "PNG and SVG images can be placed on canvas."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-atoms",
          "note": "Invalid valences are underlined; structure-check command also available.",
          "engine": {
            "library": "Indigo (native C++ via Rust FFI; indigoCheckObj)",
            "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/ffi/indigo.rs#L209-L221"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#stereochemistry",
          "note": "Calculates R/S, r/s and E/Z descriptors.",
          "engine": {
            "library": "Indigo (native C++ via Rust FFI; indigoAddCIPStereoDescriptors)",
            "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/ffi/indigo.rs#L273-L280"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/service/indigo_ops.rs",
          "note": "Computes molecular formula, molecular weight and isotope masses.",
          "engine": {
            "library": "Indigo (native C++ via Rust FFI)",
            "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/service/indigo_ops.rs#L83-L115"
          }
        },
        "properties": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/service/indigo_ops.rs",
          "note": "Calculation backend implements formula and masses, excluding logP and TPSA."
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#drawing-r-groups",
          "note": null
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#marking-s-groups",
          "note": "SRU and copolymer groups encode repeat-unit connectivity."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#ketcher-macromolecules-mode",
          "note": "Peptide and nucleic-acid monomer libraries and sequence editing."
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/README.md#features",
          "note": "Imago recognition is Linux-only; disabled on Windows.",
          "engine": {
            "library": "Imago v2 (native C++ via Rust FFI, Linux only); Indigo (native C++ postprocessing)",
            "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/service/imago_ops.rs"
          }
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#3d-viewer",
          "note": "Rotatable Miew viewer.",
          "engine": {
            "library": "Miew (browser JavaScript via miew-react 0.11.0 in Ketcher)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-react/src/script/ui/views/modal/components/process/Miew/Miew.tsx"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/ffi/indigo.rs",
          "note": "Native converter writes CDXML; Ketcher recognizes CDXML input.",
          "engine": {
            "library": "Indigo (native C++ via Rust FFI; CDXML loading and indigoCdxml output)",
            "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/ffi/indigo.rs#L82-L131"
          }
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/ffi/indigo.rs",
          "note": "Native CDX export absent; native import support unverified."
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/ffi/indigo.rs",
          "note": "MOL supported; native converter lacks SDF output.",
          "engine": {
            "library": "Ketcher MolSerializer (TypeScript, MOL V2000); Indigo (native C++ via Rust FFI, other MOL conversion; no SDF output)",
            "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/packages/ketcher-core/src/application/formatters/formatterFactory.ts"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/tests/convert.rs",
          "note": "SMILES/MOL round trips and canonical SMILES output.",
          "engine": {
            "library": "Indigo (native C++ via Rust FFI; SMILES loading and canonical SMILES output)",
            "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/ffi/indigo.rs#L82-L131"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/ffi/indigo.rs",
          "note": "Native InChI export absent; native import support unverified."
        },
        "rxn": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/service/indigo_ops.rs",
          "note": "Native automapping supports RXN; ordinary conversion uses a molecule loader."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/README.md#features",
          "note": null
        },
        "pdf-export": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/service/indigo_ops.rs",
          "note": "Native renderer accepts PDF; editor save dialog omits PDF."
        },
        "png-export": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/9064819e949d3c4c7d2c2f5888a03894c12a406c/src-tauri/sidecar/src/transport/indigo.rs",
          "note": "PNG export works; native backend ignores requested image resolution."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/spalax-dev/chemistry_draw/blob/main/README.md",
          "note": "Desktop wrapper; no project-provided embedding route confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/epam/ketcher/blob/f4f013e1855b71b0cbd37fc79d55b0cbe51c2371/documentation/help.md#highlighting-atoms-and-bonds",
          "note": "Ketcher provides eight background highlight colors for atoms and bonds."
        }
      },
      "caveats": [
        "Community-maintained packaging without official EPAM support.",
        "Image recognition is Linux-only; Linux requires x86_64 and glibc 2.36.",
        "Native conversion and rendering implement fewer formats and settings than Ketcher exposes."
      ],
      "github": {
        "url": "https://github.com/spalax-dev/chemistry_draw",
        "stars": 6,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-06-12",
        "commits": 59,
        "contributors": 2,
        "pushedAt": "2026-11-04T02:56:20Z",
        "archived": false
      },
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://codeload.github.com/spalax-dev/chemistry_draw/tar.gz/refs/tags/chemistry-draw-v0.1.6",
        "ran": false,
        "failure": "No macOS arm64 release. Unmodified v0.1.6 source selects Linux x86_64 native libraries and sidecars, requires Linux .so libraries, and supplies no macOS sidecar/resource configuration. Native macOS execution requires patches, which this run forbids. Stopped before installation or launch; see source-compatibility.txt.",
        "downloadBytes": 2056573,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "Latest stable release inspected: chemistry-draw-v0.1.6 (9064819).",
          "Release binaries target Linux x86_64 and Windows x64.",
          "No app was installed or launched.",
          "No molecule captures or hands-on feature checks were possible.",
          "Version 0.1.6 appears in source metadata; no app version was observable."
        ]
      },
      "perf": null,
      "downloadBytes": 2056573,
      "references": [
        "https://github.com/spalax-dev/chemistry_draw",
        "https://github.com/spalax-dev/chemistry_draw/blob/71cf437e4363cc64eca28845516ada0021d80cec/README.md"
      ]
    },
    {
      "id": "p99",
      "slug": "zoho-chemstudio",
      "name": "Zoho ChemStudio",
      "rank": 93,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Public vendor materials do not establish editor provenance or chemistry dependencies."
      },
      "appKind": {
        "desktop": true,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "link",
        "url": "https://workdrive.zohoexternal.in/embed/e3a7e5e203aa855664c34b296f5d1029f1946",
        "embed": null,
        "title": "ChemStudio editor overview",
        "author": null,
        "linkedFrom": "https://www.zoho.com/chemstudio/help/videos/editor-overview/",
        "poster": "https://www.zohowebstatic.com/sites/zweb/images/chemstudio/video/chemstudioeditor.jpg"
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Zoho Writer only; reusable embedding API unconfirmed",
        "how": "Use ChemStudio's Zoho Writer extension to draw inside Writer."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Documented multipage layouts, journal presets, editable structures, and SVG exports support publication-grade 2D drawing.",
      "summary": "A web and desktop editor for drawing chemical structures, reaction schemes, and publication figures.",
      "website": "https://www.zoho.com/chemstudio/",
      "repo": null,
      "docs": "https://help.zoho.com/portal/en/kb/chemstudio",
      "vendor": "Zoho Corporation",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Currently free to use.",
        "source": "https://www.zoho.com/chemstudio/"
      },
      "price": {
        "text": "Free (2026-11-05)",
        "source": "https://www.zoho.com/chemstudio/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://www.zoho.com/chemstudio/chemstudio-desktop-app.html"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-in-chemstudio/articles/add-edit-format-chemical-structures-zoho-chemstudio",
          "note": null
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-tools/articles/molecule-drawing-tool",
          "note": "Wedge, hashed wedge, and wavy bonds appear in official screenshots."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-tools/articles/molecule-drawing-tool",
          "note": "Common ring sizes and aromatic ring tools appear in official screenshots."
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-tools/articles/molecule-drawing-tool",
          "note": "Horizontal and vertical cyclohexane chair tools."
        },
        "chains": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-tools/articles/molecule-drawing-tool",
          "note": "Chains are inserted by carbon count through a dialog."
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-tools/articles/importing-standard-structures",
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-in-chemstudio/articles/add-edit-format-chemical-structures-zoho-chemstudio",
          "note": null
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-in-chemstudio/articles/add-edit-format-chemical-structures-zoho-chemstudio",
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-in-chemstudio/articles/add-edit-format-chemical-structures-zoho-chemstudio",
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-tools/articles/reaction-drawing-tools",
          "note": "Forward, equilibrium, and resonance arrows appear in official screenshots."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-in-chemstudio/articles/add-edit-format-chemical-structures-zoho-chemstudio",
          "note": null
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/security-compliance/articles/encryption-at-zoho-chemstudio",
          "note": "RXN import and native reaction storage are documented."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/utility/articles/utility-tools",
          "note": "Official screenshot shows font controls, subscripts, and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/utility/articles/utility-tools",
          "note": "Shapes; brackets also covered in the drawing guide."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.zoho.com/chemstudio/help/videos/draw-krebs-cycle/",
          "note": "Molecules can be aligned in pathway drawings."
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-in-chemstudio/articles/add-edit-format-chemical-structures-zoho-chemstudio",
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-in-chemstudio/articles/add-edit-format-chemical-structures-zoho-chemstudio",
          "note": null
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/file-operation/document-settings-in-chemstudio/articles/document-settings-in-chemstudio",
          "note": "ACS, RSC, and Wiley presets."
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/file-operation/document-settings-in-chemstudio/articles/document-settings-in-chemstudio",
          "note": "Saved settings and styles affect the current document only."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-tlc-plate-in-chemstudio/articles/how-to-draw-a-tlc-plate-in-chemstudio",
          "note": "Individual TLC spots have color controls."
        },
        "pages": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/file-operation/document-settings-in-chemstudio/articles/document-settings-in-chemstudio",
          "note": "Page size plus page rows and columns."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-tlc-plate-in-chemstudio/articles/how-to-draw-a-tlc-plate-in-chemstudio",
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/utility/articles/utility-tools",
          "note": "Structure errors are indicated on hover."
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/file-operation/document-settings-in-chemstudio/articles/document-settings-in-chemstudio",
          "note": "R/S and E/Z stereo annotations."
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/analysis-and-reports/articles/chemical-analysis-tools-zoho-chemstudio",
          "note": null
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/utility/articles/utility-tools",
          "note": "cLogP appears in the official properties-panel screenshot."
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-tools/articles/importing-standard-structures",
          "note": null
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.zoho.com/chemstudio/chemstudio-desktop-app.html",
          "note": "IUPAC name generation; vendor claim."
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/analysis-and-reports/articles/chemical-analysis-tools-zoho-chemstudio",
          "note": "Web only; unavailable in the desktop app."
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-in-chemstudio/articles/add-edit-format-chemical-structures-zoho-chemstudio",
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/drawing-tools/articles/importing-standard-structures",
          "note": "Sequence tool accepts peptide, DNA, and RNA sequences."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/security-compliance/articles/privacy-and-compliance",
          "note": "PubChem data populates structures on the drawing board.",
          "engine": {
            "library": "PubChem (remote database service)",
            "source": "https://help.zoho.com/portal/en/kb/chemstudio/security-compliance/articles/privacy-and-compliance"
          }
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/security-compliance/articles/privacy-and-compliance",
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.zoho.com/chemstudio/",
          "note": "MOL and SDF import/export also appear in help documentation."
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/security-compliance/articles/privacy-and-compliance",
          "note": null
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/security-compliance/articles/export-options-available-in-zoho-chemstudio",
          "note": null
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/security-compliance/articles/encryption-at-zoho-chemstudio",
          "note": "Imported RXN files are explicitly listed."
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/chemstudio/security-compliance/articles/export-options-available-in-zoho-chemstudio",
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://help.zoho.com/portal/en/kb/writer/for-developer/extensions/utility/articles/chemstudio-extension-in-zoho-writer",
          "note": "Zoho Writer only; reusable embedding API unconfirmed"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "The web app requires a Zoho account and a team workspace.",
        "NMR reports require the connected web version; desktop drawing and export work offline.",
        "CDX and RXN marketing claims differ from the dedicated export-format list."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://chemstudio.zoho.com/",
        "ran": false,
        "failure": "The hosted ChemStudio home route redirects unauthenticated users to Zoho sign-in; the isolated browser also remained blank while loading.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "The server redirects /chemstudio/home to Zoho sign-in for ChemStudio.",
          "No ChemStudio version was exposed before sign-in."
        ]
      },
      "perf": null,
      "downloadBytes": 322964776,
      "references": [
        "https://www.zoho.com/chemstudio/",
        "https://www.zoho.com/chemstudio/chemstudio-desktop-app.html"
      ]
    },
    {
      "id": "p95",
      "slug": "gchempaint",
      "name": "GChemPaint",
      "rank": 94,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "Open Babel"
        ],
        "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/dcfb878e2f04e4b3bbbc0951ace8ccb436c0186d/libs/gcp/view.cc#L151-L173",
        "note": "Custom GCCV canvas; Open Babel provides chemical format conversion."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "GChemPaint GCCV renderer",
        "language": "C++",
        "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/libs/gcp/bond.cc#L646"
      },
      "enginesChecked": true,
      "languageNote": "Shell and M4 are build scripts.",
      "video": null,
      "embedding": {
        "methods": [
          "desktop widget"
        ],
        "package": "libgcu0v5",
        "limit": "GPL-3.0-or-later; GOffice rendering only; editing opens separate window",
        "how": "Load libgcu0v5's GOffice gchemutils plugin in compatible desktop applications."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Periodic table and template widgets"
        }
      ],
      "thirdParty": {
        "summary": "Uses GPL-2.0 (Open Babel), GPL (GOffice), and LGPL (GTK) dependencies.",
        "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/README",
        "notice": null,
        "libraries": [
          {
            "name": "Open Babel",
            "license": "GPL-2.0-only",
            "source": "https://github.com/openbabel/openbabel/blob/master/COPYING"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A standalone document editor with structures, reaction schemes, text, printing and vector export can produce publication figures.",
      "summary": "Desktop editor for drawing two-dimensional chemical structures, reaction schemes and mechanisms.",
      "website": "https://gchemutils.nongnu.org/gchempaint.html",
      "repo": "https://github.com/dleidert/gnome-chemistry-utils",
      "docs": "https://gchemutils.nongnu.org/paint/gchempaint.pdf",
      "vendor": "Jean Bréfort / GNOME Chemistry Utils",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-3.0-or-later",
        "text": "GNU GPL version 3 or later; Open Babel helper uses GPL-2.0-or-later.",
        "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/README"
      },
      "price": {
        "text": "Free",
        "source": "https://gchemutils.nongnu.org/paint/gchempaint.pdf#page=74"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.14.17",
        "date": "2020-10-29",
        "source": "https://github.com/dleidert/gnome-chemistry-utils/releases/tag/v0.14.17"
      },
      "engine": {
        "rendering": "Cairo through the custom GCCV canvas",
        "chemistry": "GNOME Chemistry Utils classes; Open Babel for conversion and identifiers",
        "ui": "GTK 3",
        "source": "https://gchemutils.nongnu.org/reference/classgcp_1_1View.html"
      },
      "languages": [
        "C++",
        "C"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x1125.html#gchempaint-normal-bond",
          "note": null
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x1125.html#gchempaint-stereobonds",
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x1273.html",
          "note": "Cycle tools and aromatic ring templates."
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/templates/paint/haworth.xml.in",
          "note": "Built-in Haworth saccharide templates."
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x1210.html",
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x842.html",
          "note": null
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x842.html#gchempaint-new-template",
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x890.html",
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x937.html",
          "note": "Charges and element labels; isotope editing unverified."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x1052.html",
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x937.html#gchempaint-atom",
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/gchempaint.pdf#page=28",
          "note": "Lasso, rotate and flip; resizing unverified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/c1464.html#gchempaint-arrow",
          "note": null
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x1558.html",
          "note": null
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/libs/gcp/reactant.cc#L96",
          "note": "Native XML stores reactants and products as chemical objects."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x1066.html",
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x1806.html",
          "note": null
        },
        "shapes": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/gchempaint.pdf#page=71",
          "note": "Brackets and mechanism curves; general shape tools unverified."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x698.html",
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x698.html",
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "no",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/gchempaint.pdf#page=16",
          "note": "Only the default theme is shipped."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x394.html#gchempaint-themes",
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/plugins/paint/text/texttool.cc#L1233",
          "note": "Text foreground color can be changed individually."
        },
        "pages": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/gchempaint.pdf#page=19",
          "note": "Paper size and margins; multipage printing explicitly unsupported."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/gchempaint.pdf#page=59",
          "note": "Opens GChemCalc for formula and mass; fragments unsupported.",
          "engine": {
            "library": "In-house (GChemCalc external C++ executable)",
            "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/libs/gcp/molecule.cc#L672-L685"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x890.html",
          "note": "Generic R, Ar, X and M residues."
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/gchempaint.pdf#page=54",
          "note": "Polymer units carry stoichiometric coefficients."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/gchempaint.pdf#page=57",
          "note": "Opens installed GChem3D, Ghemical or Avogadro; requires Open Babel.",
          "engine": {
            "library": "Open Babel (C++ library in local babelserver helper); GChem3D, Ghemical or Avogadro (external viewers)",
            "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/libs/gcp/molecule.cc#L82-L138"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/plugins/loaders/cdxml/plugin.xml.in#L13",
          "note": null,
          "engine": {
            "library": "In-house (C++ CDXML loader plugin using libxml2)",
            "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/plugins/loaders/cdxml/cdxml.cc"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/plugins/loaders/cdx/plugin.xml.in#L13",
          "note": null,
          "engine": {
            "library": "In-house (C++ CDX loader plugin using Open Babel constants header)",
            "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/plugins/loaders/cdx/cdx.cc"
          }
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x240.html",
          "note": "MOL read/write through Open Babel; SDF unverified.",
          "engine": {
            "library": "Open Babel (C++ library in local babelserver helper; MOL read/write, SDF unconfirmed)",
            "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/libs/gcp/application.cc#L450-L457"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/gchempaint.pdf#page=59",
          "note": "Canonical SMILES generation documented; direct import unverified.",
          "engine": {
            "library": "Open Babel (C++ library in local babelserver helper; canonical SMILES export)",
            "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/libs/gcu/molecule.cc#L477-L493"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/gchempaint.pdf#page=59",
          "note": null,
          "engine": {
            "library": "Open Babel (C++ library in local babelserver helper)",
            "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/libs/gcu/molecule.cc#L439-L455"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x369.html",
          "note": null
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/paint/manual/x369.html",
          "note": null
        },
        "png-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/reference/classgcp_1_1View.html#ac4f2f471f4ccd2dda42e0c111f9fb47d",
          "note": "Bitmap resolution is configurable for print-quality PNG export."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gchemutils.nongnu.org/reference/classgcp_1_1Plugin.html",
          "note": "Documented C++ plugins can add tools and UI elements."
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/master/goffice/gogcpapp.cc",
          "note": "GPL-3.0-or-later; GOffice rendering only; editing opens separate window"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/dleidert/gnome-chemistry-utils/blob/1962f11a2be5296a05afc6a7a59b8ad3a1be47b9/libs/gcp/atom.cc#L1393",
          "note": "Selection squares mark unlabeled carbons only; image export hides them."
        }
      },
      "caveats": [
        "Latest stable release is from 2017; the website still advertises 0.14.16.",
        "The older HTML manual omits newer features and CDX/CDXML export; its SMILES description incorrectly says InChI.",
        "Printing is limited to one page; non-native formats can lose drawing features."
      ],
      "github": {
        "url": "https://github.com/dleidert/gnome-chemistry-utils",
        "stars": 1,
        "checkedOn": "2026-11-06",
        "firstCommit": "2002-11-11",
        "commits": 1421,
        "contributors": 4,
        "pushedAt": "2020-11-02T19:04:43Z",
        "archived": false
      },
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "gnome-chemistry-utils-0.14.17.tar.xz",
        "ran": false,
        "failure": "Unmodified 0.14.17 compilation failed in libs/gccv/text.cc:1129: invalid conversion from const char* to char* with GLib 2.90.1. No executable produced. First configure error was missing intltool >= 0.40.6, subsequently installed; see build-notes.md and logs.",
        "downloadBytes": 5911248,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "Source archive declares version 0.14.17; app version could not be queried.",
          "Compilation stopped before any application window opened.",
          "No molecules, exports, or drawing features were tested."
        ]
      },
      "perf": null,
      "downloadBytes": 5911248,
      "references": [
        "https://github.com/dleidert/gnome-chemistry-utils",
        "https://gchemutils.nongnu.org/gchempaint.html"
      ]
    },
    {
      "id": "p07",
      "slug": "kingdraw",
      "name": "KingDraw",
      "rank": 95,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://www.kingagroot.com/En/html/qycx.html",
        "note": "Vendor explicitly claims independently developed chemical editor; third-party chemistry dependencies unestablished."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "Personal 3.0 / Free mobile",
          "level": "free",
          "price": "2026-11-06: Free basic editor."
        },
        {
          "name": "Education 4.0 (university email)",
          "level": "account",
          "price": "2026-11-06: Free after binding a university email."
        },
        {
          "name": "Membership",
          "level": "paid",
          "price": "2026-11-06: US iOS lists $1.99–$11.99/month; $14.99–$99.99/year."
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "KingDraw molecular drawing engine",
        "language": null,
        "source": "https://www.kingagroot.com/En/html/qycx.html"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Developer platform suspended; legacy SDK documentation unavailable.",
        "how": "Historical JS editor existed; current embedding support cannot be confirmed."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Standalone drawing tools, reaction schemes, ACS styling, vector SVG export and editable Office objects support publication figures.",
      "summary": "Desktop and mobile chemical drawing software for preparing molecular structures, reaction schemes, and scientific figures.",
      "website": "https://www.kingdraw.com/indexen",
      "repo": null,
      "docs": "https://www.kingdraw.com/bookpc?name=1-1",
      "vendor": "Qingdao KingAgroot Precision Agriculture Technology Co., Ltd.",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary software with free drawing and paid membership features.",
        "source": "https://www.kingdraw.com/service?name=Sa"
      },
      "price": {
        "text": "Free tier; US iOS lists $9.99/month and $99.99/year memberships (2026-11-05).",
        "source": "https://apps.apple.com/us/app/kingdraw/id1336806206"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": true,
        "android": true,
        "offline": true
      },
      "version": {
        "name": "5.0",
        "date": null,
        "source": "https://www.kingdraw.com/index?name=download"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-2",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-2",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-2",
          "note": "Dative, hydrogen and ionic bonds.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-3",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-3",
          "note": "Left and right chair templates.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-3",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cloud.tencent.com/developer/news/939666",
          "note": "KingDraw-authored tutorial lists amino acids, peptides and nanotube templates.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/indexen?name=membership",
          "note": "Paid PC membership.",
          "plan": "Education 4.0 (university email)",
          "planLevel": "account"
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://kingdraw.medium.com/kingdraw-pc-tutorial-group-advanced-chapter-adjust-copy-and-expand-group-7e5ab6f424e2",
          "note": "Label expansion requires membership.",
          "plan": "Education 4.0 (university email)",
          "planLevel": "account"
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-5",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-2",
          "note": "Hover over bonds and press number keys.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/index?name=download",
          "note": "Windows lasso, rotation, resizing and mirror flip.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://kingdraw.medium.com/kingdraw-pc-unlock-the-secrets-of-professional-chemistry-equation-creation-56ad16be868e",
          "note": "Forward and reversible arrows.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://kingdraw.medium.com/kingdraw-pc-tutorial-drawing-reaction-mechanisms-how-to-add-a-variety-of-arrows-ed7565428fae",
          "note": "Electron-flow arrows with editable curvature, angle and length.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://kingdraw.medium.com/kingdraw-update-pc-official-v2-1-is-coming-8b1f2eac8fa7",
          "note": "Adjustable orbital templates.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-6",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-7",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-10",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=1-1",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=1-1",
          "note": "ACS Document 1996 preset.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-18",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://kingdraw.medium.com/kingdraw-update-pc-official-v2-1-is-coming-8b1f2eac8fa7",
          "note": "Imports BMP, JPG, PNG, TIFF and JPEG.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=3-1",
          "note": "Incorrect structures receive red error frames.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/index?name=download",
          "note": "Paid stereochemistry; Windows Professional adds E/Z labeling.",
          "plan": "Education 4.0 (university email)",
          "planLevel": "account"
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-12",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookapp?name=3-10",
          "note": "IUPAC name conversion.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookapp?name=3-10",
          "note": "IUPAC naming.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/index?name=download",
          "note": "Windows, mobile and HD image recognition.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/index?name=download",
          "note": "Integrated KDpedia lookup and structure downloads.",
          "engine": {
            "library": "KingDraw Compound Encyclopedia / KD Pedia (remote database service)",
            "source": "https://www.kingdraw.com/index?name=download"
          },
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-13",
          "note": null,
          "engine": {
            "library": "In-house KingDraw 3D model conversion module (iOS app; vendor-confirmed module)",
            "source": "https://apps.apple.com/cn/app/kingdraw/id1336806206?platform=ipad"
          },
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=1-1",
          "note": null,
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=1-1",
          "note": "MOL import/export; SDF support unverified.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=1-1",
          "note": "Copy As exports; Paste Special imports.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://kingdraw.medium.com/kingdraw-update-pc-official-v2-1-is-coming-8b1f2eac8fa7",
          "note": "Windows vector SVG export; PC export requires membership.",
          "plan": "Education 4.0 (university email)",
          "planLevel": "account"
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-16",
          "note": "Editable structure exchange through SMILES or MOL.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-15",
          "note": "Windows Office objects reopen in KingDraw and synchronize edits.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://open.kingdraw.com/index.php/article/9.html",
          "note": "Separate legacy web SDK; developer platform currently suspended."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://open.kingdraw.com/",
          "note": "Historical JS editor existed; current embedding support cannot be confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.kingdraw.com/bookpc?name=2-15",
          "note": "Word double-click opens KingDraw; edits synchronize to embedded Office object.",
          "plan": "Personal 3.0 / Free mobile",
          "planLevel": "free"
        }
      },
      "caveats": [
        "Membership gates PC image export, custom templates, label expansion and stereochemistry.",
        "Mac availability is the mobile app on Apple silicon, unverified for macOS.",
        "The legacy web SDK platform homepage is suspended."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "not installed",
        "artifact": "https://www.kingdraw.com/indexen?name=download",
        "ran": false,
        "failure": "No direct macOS installer was found through the official English and Chinese download pages or their linked download script. The desktop buttons target Windows .exe files; the published Apple routes lead to the App Store, which this run explicitly excludes. KingDraw could not be installed or launched through a permitted route.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "The supplied English page lists Android, iOS, and Windows PC downloads.",
          "The Chinese page also lists mobile/tablet platforms and Windows desktop editions.",
          "No installer was downloaded, no app was installed, and no KingDraw process was launched.",
          "Default rendering, molecule imports, exports, and app features remain untested."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.kingdraw.com/indexen?name=download"
      ]
    },
    {
      "id": "p93",
      "slug": "chempencil",
      "name": "ChemPencil",
      "rank": 96,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "InChI"
        ],
        "source": "https://chempencil.app/tutorials/inchi-inchikey.html",
        "note": "Official InChI library confirmed; other components and canvas provenance remain undisclosed."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "ChemPencil",
          "level": "paid",
          "price": "US$9.99 one-time, Mac App Store (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "link",
        "url": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12",
        "embed": null,
        "title": "App Store preview",
        "author": null,
        "linkedFrom": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12",
        "poster": null
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Desktop exports and clipboard documented; no supported editor embedding confirmed."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Official InChI native library"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": [
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Released desktop editors support 2D structures, reaction schemes, and vector publication exports.",
      "summary": "A desktop editor for drawing 2D chemical structures, reaction schemes, and publication figures.",
      "website": "https://chempencil.app/",
      "repo": null,
      "docs": "https://chempencil.app/tutorials/",
      "vendor": "Code Maker Inc.",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary paid app under Apple or Microsoft standard store licenses.",
        "source": "https://chempencil.app/terms.html"
      },
      "price": {
        "text": "US$9.99 on Mac App Store (2026-11-05).",
        "source": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "2.1.0",
        "date": "2026-10-20",
        "source": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12"
      },
      "engine": {
        "rendering": null,
        "chemistry": "Official InChI library for identifiers; other chemistry toolkit undisclosed.",
        "ui": "AppKit (macOS); WPF (Windows).",
        "source": "https://chempencil.app/"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12",
          "note": "Single, double and triple drawing tools; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/wedge-hash-stereochemistry.html",
          "note": null,
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12",
          "note": "Left, right and center alignment; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/",
          "note": "Three- to eight-membered rings and benzene; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/",
          "note": "Cyclohexane chair tools; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/reaction-scheme.html",
          "note": "Templates panel inserts common molecules.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12",
          "note": "Mac personal structure templates; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/",
          "note": "Set and expand named groups; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12",
          "note": "Element editing, formal charges and isotopes; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/wedge-hash-stereochemistry.html",
          "note": "Hover over bonds and press editing hotkeys on Mac.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/reaction-scheme.html",
          "note": null,
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/reaction-scheme.html",
          "note": "Draw curved double-barbed and fishhook arrows.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/",
          "note": "RXN and RDF read/write; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/reaction-scheme.html",
          "note": "Map Reaction numbers corresponding atoms.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/reaction-scheme.html",
          "note": null,
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://displaycatalog.mp.microsoft.com/v7.0/products/9WZDNCRDMDBP?market=US&languages=en-US",
          "note": "Windows Structure menu includes grouping; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/smiles-to-structure.html",
          "note": "Clean Up Structure and Auto-Orient commands.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/structures-in-word-powerpoint.html",
          "note": "Global bond and label preferences apply across documents.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/stoichiometry-percent-yield.html",
          "note": "Editable reaction stoichiometry table."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12",
          "note": "Live valence warnings and Structure Check; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/wedge-hash-stereochemistry.html",
          "note": "Computed R/S and E/Z appear in generated names.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/molecular-weight-properties.html",
          "note": null,
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/molecular-weight-properties.html",
          "note": "TPSA and Mannhold/Crippen logP.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/iupac-name-to-structure.html",
          "note": "Common functional groups and ring families.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/iupac-name-to-structure.html",
          "note": "Complex fused polycycles may not be named.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://displaycatalog.mp.microsoft.com/v7.0/products/9WZDNCRDMDBP?market=US&languages=en-US",
          "note": "Windows 1H/13C shift summaries; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/",
          "note": "Query atoms, atom lists and SMARTS; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "no",
          "evidence": "docs",
          "source": "https://chempencil.app/privacy.html",
          "note": "Both desktop builds explicitly lack network access."
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/view-molecule-3d.html",
          "note": "Rotatable viewer; Mac requires imported 3D MOL/SDF coordinates.",
          "engine": {
            "library": "SceneKit (macOS native framework)",
            "source": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12"
          },
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chempencil/id687559805?mt=12",
          "note": "Mac read/write; Windows export documentation conflicts; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/",
          "note": "MOL and SDF read/write; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/smiles-to-structure.html",
          "note": null,
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/inchi-inchikey.html",
          "note": "Copy standard InChI and InChIKey.",
          "engine": {
            "library": "InChI (official native desktop library)",
            "source": "https://chempencil.app/tutorials/inchi-inchikey.html"
          },
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/",
          "note": "RXN read/write; vendor claim.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/structures-in-word-powerpoint.html",
          "note": null,
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/structures-in-word-powerpoint.html",
          "note": null,
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "png-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/structures-in-word-powerpoint.html",
          "note": "Mac up to 600 dpi; Windows 300 dpi.",
          "plan": "ChemPencil",
          "planLevel": "paid"
        },
        "clipboard-chemdraw": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chempencil.app/tutorials/structures-in-word-powerpoint.html",
          "note": "Windows copies editable structures to ChemDraw."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://chempencil.app/support.html",
          "note": "Desktop exports and clipboard documented; no supported editor embedding confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Version 2.1 asks users to recheck stereochemistry imported from SMILES or names in earlier versions.",
        "Windows Store describes CML and CDXML import; website advertises .chemp and CDXML read/write.",
        "Store claims of viewing 2D structures in 3D conflict with the tutorial's coordinate requirement."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": 126172860,
      "references": [
        "https://chempencil.app/"
      ]
    },
    {
      "id": "p34",
      "slug": "acd",
      "name": "ACD/ChemSketch",
      "rank": 97,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Public vendor materials do not establish canvas provenance or chemistry libraries."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "ChemSketch Freeware",
          "level": "free",
          "price": "$0 historical; home/education, existing installations only (2026-11-06)"
        },
        {
          "name": "ChemSketch",
          "level": "paid",
          "price": "Unavailable to new customers (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=hM6f-UWZSLM",
        "embed": "https://www.youtube-nocookie.com/embed/hM6f-UWZSLM",
        "title": "ChemSketch: Drawing Tools",
        "author": "ACDLabs",
        "linkedFrom": "https://www.acdlabs.com/resource/drawing-tools/",
        "poster": "https://www.acdlabs.com/wp-content/uploads/complianz/placeholders/youtubehM6f-UWZSLM-maxresdefault.webp"
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Discontinued; unavailable to new customers",
        "how": "OLE objects supported; in-place editor hosting unconfirmed."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Native InChI chemistry library"
        },
        {
          "language": "ChemBasic",
          "role": "Optional bundled automation scripts"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "ChemSketch creates publication-grade 2D chemical structures, reaction schemes, and reports, although it is discontinued and unavailable to new customers.",
      "summary": "A discontinued Windows application for drawing chemical structures, reaction schemes, and publication figures.",
      "website": "https://www.acdlabs.com/resources/free-chemistry-software-apps/chemsketch-freeware/",
      "repo": null,
      "docs": "https://www.acdlabs.com/wp-content/uploads/download/quickstart/draw/qsg_chemsketch_trial.pdf",
      "vendor": "Advanced Chemistry Development, Inc. (ACD/Labs), now part of Revvity Signals",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Formerly free for home and educational use, with a separate commercial edition; freeware discontinued.",
        "source": "https://www.acdlabs.com/resource/acd-chemsketch-freeware-celebrates-one-million-downloads-with-a-new-version/"
      },
      "price": {
        "text": "Unavailable to new customers (2026-11-05).",
        "source": "https://www.acdlabs.com/products/buy-chemsketch-online/"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "2025",
        "date": null,
        "source": "https://www.acdlabs.com/technical-support/current-software-versions/chemsketch/"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/drawing-tools/",
          "note": "Click bonds to cycle single, double, and triple orders."
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Wedges and hashes documented; wavy bond support unverified."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/drawing-tools/",
          "note": "Drag chains with the atom count displayed beside the pointer."
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/wp-content/uploads/download/quickstart/draw/qsg_chemsketch_trial.pdf",
          "note": "Molecule, laboratory equipment, and orbital templates."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/blog/how-to-draw-better-chemical-structures-and-reactions-with-chemsketch/",
          "note": "Save persistent user templates with configurable attachment points."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/blog/how-to-draw-better-chemical-structures-and-reactions-with-chemsketch/",
          "note": "Expand shorthand formulas into explicit structural fragments."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/wp-content/uploads/download/quickstart/draw/qsg_chemsketch_trial.pdf",
          "note": "Set elements, charges, valence, and isotopes."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/draw-and-edit-reaction-mechanisms-with-chemsketch/",
          "note": "Attach horizontal or vertical lone pairs to atoms."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Shortcuts documented; atom-hover editing unverified."
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Lasso and rotation documented; complete transform set unverified."
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/wp-content/uploads/download/quickstart/draw/qsg_chemsketch_trial.pdf",
          "note": "Rotate structures in two or three dimensions on the canvas."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/draw-and-edit-reaction-mechanisms-with-chemsketch/",
          "note": "Forward and equilibrium arrows with adjustable length."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/draw-and-edit-reaction-mechanisms-with-chemsketch/",
          "note": "Editable arcs with arrowheads provide curved mechanism arrows."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://revvitysignals.com/data-format-support-integrations",
          "note": "Vendor claim: RXN reaction exchange."
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/products/chemsketch/",
          "note": "Historical vendor claim: associate reactant atoms with product atoms."
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/wp-content/uploads/download/quickstart/draw/qsg_chemsketch_trial.pdf",
          "note": "Insert and edit orbital templates."
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Text fields documented; required formatting controls unverified."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/blog/how-to-draw-better-chemical-structures-and-reactions-with-chemsketch/",
          "note": "Draw mode provides squares, lines, arrows, and curved lines."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/draw-and-edit-reaction-mechanisms-with-chemsketch/",
          "note": "Align selected objects horizontally, vertically, or to the left."
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/wp-content/uploads/download/quickstart/draw/qsg_chemsketch_trial.pdf",
          "note": "Clean Structure standardizes bond lengths and angles."
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/draw-and-edit-reaction-mechanisms-with-chemsketch/",
          "note": "ACS and RSC drawing presets demonstrated."
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/draw-and-edit-reaction-mechanisms-with-chemsketch/",
          "note": "Save modified drawing styles and set defaults."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/draw-and-edit-reaction-mechanisms-with-chemsketch/",
          "note": "Change individual atom and bond colors."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Page size documented; multipage documents unverified."
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://revvitysignals.com/data-format-support-integrations",
          "note": "Vendor claim: import JPG, PNG, GIF, and bitmap images."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Valence editing documented; error flagging unverified."
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "R/S designation documented; computed R/S and E/Z unverified."
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/wp-content/uploads/download/quickstart/draw/qsg_chemsketch_trial.pdf",
          "note": "Calculates molecular formula and formula weight."
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/acd-chemsketch-freeware-celebrates-one-million-downloads-with-a-new-version/",
          "note": "Freeware includes logP prediction.",
          "plan": "ChemSketch Freeware",
          "planLevel": "free"
        },
        "name-to-structure": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/blog/how-to-draw-better-chemical-structures-and-reactions-with-chemsketch/",
          "note": "Commercial dictionary lookup; general conversion requires separately purchased ACD/Name.",
          "engine": {
            "library": "In-house (ACD/Dictionary desktop lookup; optional ACD/Name native desktop name-to-structure)",
            "source": "https://www.acdlabs.com/blog/how-to-draw-better-chemical-structures-and-reactions-with-chemsketch/"
          },
          "plan": "ChemSketch",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/products/chemsketch/",
          "note": "Limited elements, 50 atoms, three rings, and 100-character names.",
          "engine": {
            "library": "In-house (ACD/Name Freeware proprietary desktop module; limited structure naming)",
            "source": "https://support.revvitysignals.com/hc/en-us/articles/47037475963412-ChemSketch-Access-to-Name-Freeware-vs-full-commercial-Name-version-via-the-same-button"
          },
          "plan": "ChemSketch Freeware",
          "planLevel": "free"
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Separate NMR prediction products exist; ChemSketch inclusion unverified."
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/blog/markush-structures-what-they-are-and-how-to-draw-them/",
          "note": "R-groups, positional variants, and structure enumeration.",
          "plan": "ChemSketch Freeware",
          "planLevel": "free"
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Bracket drawing documented; chemical repeat-unit semantics unverified."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://revvitysignals.com/data-format-support-integrations",
          "note": "Vendor claim: peptide sequences through FASTA and HELM."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/resource/acd-chemsketch-freeware-celebrates-one-million-downloads-with-a-new-version/",
          "note": "Vendor claim: access PubChem, eMolecules, and ChemSpider databases.",
          "engine": {
            "library": "EPA iCSS Chemistry Dashboard (remote database through ChemSketch EPA iCSS Add-on)",
            "source": "https://www.acdlabs.com/resources/free-chemistry-software-apps/chemsketch-epa-icss-add-on/"
          },
          "plan": "ChemSketch Freeware",
          "planLevel": "free"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/technical-support/faq/",
          "note": "Included 3D Viewer supports rotating molecules.",
          "engine": {
            "library": "In-house (ACD/3D Viewer proprietary desktop application; optional OpenGL rendering)",
            "source": "https://www.acdlabs.com/technical-support/faq/"
          },
          "plan": "ChemSketch Freeware",
          "planLevel": "free"
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://revvitysignals.com/data-format-support-integrations",
          "note": "Vendor format table specifies CDXML import only."
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://revvitysignals.com/data-format-support-integrations",
          "note": "Vendor claim: CDX import and export."
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://revvitysignals.com/data-format-support-integrations",
          "note": "Vendor claim: MOL import/export; SDF support unverified."
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://revvitysignals.com/data-format-support-integrations",
          "note": "Vendor claim: SMILES input and output."
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/wp-content/uploads/download/quickstart/draw/qsg_chemsketch_trial.pdf",
          "note": "Generate InChI identifiers from drawn structures.",
          "engine": {
            "library": "InChI/libinchi (native C library; integration binding undisclosed)",
            "source": "https://www.inchi-trust.org/technical-faq/"
          }
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://revvitysignals.com/data-format-support-integrations",
          "note": "Vendor claim: RXN import and export."
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "PDF output documented; vector preservation unverified."
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "PNG output documented; 300 dpi capability unverified."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "ChemDraw paste-in documented; editable roundtrip unverified."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "OLE embedding documented; re-editing not explicitly verified."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.acdlabs.com/blog/markush-structures-what-they-are-and-how-to-draw-them/",
          "note": "Add-On Organizer installs ChemSketch extensions."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://www.acdlabs.com/products/chemsketch/",
          "note": "OLE objects supported; in-place editor hosting unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Freeware is discontinued; existing installations may continue under their applicable license terms.",
        "No longer sold to new customers; no current public installation download is offered.",
        "Some historical feature evidence comes from indexed official product pages that now redirect to ChemDraw."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.acdlabs.com/products/chemsketch/",
        "https://www.acdlabs.com/resources/free-chemistry-software-apps/chemsketch-freeware/"
      ]
    },
    {
      "id": "p52",
      "slug": "ferrum-chemical-forge",
      "name": "Ferrum Chemical Forge",
      "rank": 98,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "RDKit",
          "InChI"
        ],
        "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/PROVENANCE.md",
        "note": "BKChem-Qt lineage documented; current canvas derivation not established."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Ferrum-Chem molecular renderer",
        "language": "Rust",
        "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/render/src/atom_bond.rs#L204"
      },
      "enginesChecked": true,
      "languageNote": "C headers define bindings; Shell, CMake and Ruby support builds.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "AGPL-3.0-only editor; LGPL-3.0-only engine",
        "how": "Public Python API handles documents; Qt editor bridge is private."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "Qt desktop frontend"
        },
        {
          "language": "C++",
          "role": "Native RDKit chemistry adapter"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-3.0 PySide6/Qt, BSD-3-Clause RDKit, MIT/Apache-2.0/BSD Rust dependencies and bundled OFL-1.1 Atkinson fonts.",
        "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/PROVENANCE.md",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A standalone 2D chemical document editor provides structure and reaction authoring, annotations, and vector SVG/PDF export.",
      "summary": "Pre-alpha desktop editor for drawing chemical structures, composing reaction documents, and exporting vector figures.",
      "website": "https://github.com/vosslab/ferrum-chemical-forge",
      "repo": "https://github.com/vosslab/ferrum-chemical-forge",
      "docs": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/USAGE.md",
      "vendor": "Neil R. Voss",
      "license": {
        "kind": "open-source",
        "spdx": "AGPL-3.0-only",
        "text": "Application: AGPL-3.0-only; Rust engine: LGPL-3.0-only.",
        "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/PROVENANCE.md"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/PROVENANCE.md"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/vosslab/ferrum-chemical-forge/releases"
      },
      "engine": {
        "rendering": "Custom Rust render plans replayed by Qt QPainter; Rust SVG, tiny-skia PNG, and pdf-writer PDF export.",
        "chemistry": "Ferrum-Chem Rust model with RDKit through a private native adapter.",
        "ui": "PySide6 / Qt Widgets with PyO3 bindings.",
        "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/PROVENANCE.md"
      },
      "languages": [
        "Rust",
        "Python",
        "C++"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/QT_CONTRACT.md#L445-L452",
          "note": "Manual single, double, and triple bond authoring and property editing."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/CDML_AUTHORING_GESTURE_CONTRACT.md#directed-stereobond-creation",
          "note": "Wedge and hashed tools; wavy bonds through Bond Properties."
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/document/src/bond_presentation.rs#L6-L26",
          "note": "Closed authoring vocabulary excludes dative, hydrogen, and quadruple bonds."
        },
        "double-bond-side": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-chem-qt.app/ferrum_qt/dialogs/bond_dialog.py#L80-L82",
          "note": "Center checkbox only; no explicit left/right choice."
        },
        "rings": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/domain/src/catalog/template_manifest_v1.rs#L237-L299",
          "note": "Common ring templates include benzene and aromatic heterocycles."
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/QT_CONTRACT.md#L503-L522",
          "note": "Four alpha/beta D-glucose pyranose/furanose Haworth recipes."
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/domain/src/catalog/template_manifest_v1.rs#L237-L349",
          "note": "Built-ins include substituted D-glucose Haworth structures and purine."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-chem-qt.app/ferrum_qt/ferrum/user_templates.py#L29-L43",
          "note": "Save Current as Template publishes reusable single-molecule CDML templates."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/document-model/src/compact_group_catalog_v1.rs#L488-L563",
          "note": "Nine expandable compact groups include Me, Et, Ph, and OMe."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-chem-qt.app/ferrum_qt/dialogs/atom_dialog.py#L20-L81",
          "note": "Atom Properties edits element symbols, charge, isotope, and multiplicity."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/render/src/atom_bond/atom.rs#L499-L532",
          "note": "Radical dots, paired dots, and electron-pair marks."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-chem-qt.app/ferrum_qt/ferrum/top_level_transform.py#L242-L267",
          "note": "Rotation, scaling and mirroring available; lasso selection unverified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-chem-qt.app/ferrum_qt/ferrum/line_tool_actions.py#L81-L110",
          "note": "Forward and equilibrium arrows; additional curved reaction-arrow tools."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/CDML_AUTHORING_GESTURE_CONTRACT.md#curved-electron-arrow-v1",
          "note": "Three-point curved electron arrows with Rust-generated heads."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/CDML_FORMAT_SPEC.md#reaction",
          "note": "CDML reactions reference reactant and product molecular graphs."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/render/src/atom_bond/atom.rs#L534-L555",
          "note": "Pz-orbital atom marks render as two lobes."
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-chem-qt.app/ferrum_qt/ferrum/text_properties.py#L189-L211",
          "note": "Size, color, subscript and superscript; fixed typeface, no bold/italic."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/QT_CONTRACT.md#selection-and-interaction",
          "note": "Editable geometric shapes, rectangular brackets, round brackets, and wavy lines."
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-chem-qt.app/ferrum_qt/ferrum/top_level_transform.py#L12-L19",
          "note": "Six alignment commands operate on complete selected roots."
        },
        "groups": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/CDML_FORMAT_SPEC.md#deferred-document-concepts",
          "note": "Visual grouping remains a proposal outside current document grammar."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-chem-qt.app/ferrum_qt/ferrum/geometry_repair.py#L121-L165",
          "note": "Clean Geometry plus bond-length, bond-angle, and ring normalization.",
          "engine": {
            "library": "RDKit (C++)",
            "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/chemistry/native/ferrum_chem_adapter.cpp#L447"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-chem-qt.app/ferrum_qt/ferrum/geometric_properties.py#L107-L137",
          "note": "Individual geometric objects have editable stroke and fill colors."
        },
        "pages": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/CDML_FORMAT_SPEC.md#paper",
          "note": "Paper sizes and orientation supported; multipage model remains deferred."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/QT_CONTRACT.md#selection-and-interaction",
          "note": "Bounded neutral-atom capacity warnings; explicitly not general chemical-validity checking.",
          "engine": {
            "library": "In-house (Rust neutral bond-capacity check)",
            "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/domain/src/neutral_bond_capacity_diagnostic_v1.rs#L89"
          }
        },
        "stereo-perception": {
          "status": "no",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/vosslab/ferrum-chemical-forge/main/docs/active_plans/audits/ferrum_qt_capability_matrix.md",
          "note": "Stereochemical inference explicitly dropped; authored depiction remains."
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/QT_CONTRACT.md#selection-and-interaction",
          "note": "Formula, average molecular weight, monoisotopic mass, and elemental composition.",
          "engine": {
            "library": "RDKit (C++)",
            "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/chemistry/native/ferrum_chem_composition.cpp#L252"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/active_plans/active/FULL_PARITY_RUST_FIRST.md#L656-L658",
          "note": "Authored display names only; generated naming is future work."
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/active_plans/decisions/native_peptide_sequence_import_v1.md#closed-contract",
          "note": "One-letter peptide sequences; bounded native-17 residue profile with zwitterionic termini."
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "no",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/vosslab/ferrum-chemical-forge/main/docs/active_plans/audits/ferrum_qt_capability_matrix.md",
          "note": "Live PubChem lookup explicitly dropped."
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/FILE_FORMATS.md#conversion-is-not-desktop-fileopen",
          "note": "Bounded simple-molecule import only; no CDXML export.",
          "engine": {
            "library": "In-house (Rust CDXML importer)",
            "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/chemistry/src/cdxml_decoder.rs#L158"
          }
        },
        "cdx": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/FILE_FORMATS.md#refused-format-families",
          "note": "Binary CDX input is explicitly refused."
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/FERRUM_API_CONTRACT.md#operations",
          "note": "MOL and SDF V2000/V3000 molecular interchange.",
          "engine": {
            "library": "RDKit (C++)",
            "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/chemistry/native/ferrum_chem_sdf.cpp#L215"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/FERRUM_API_CONTRACT.md#operations",
          "note": "SMILES conversion input and output through the local chemistry runtime.",
          "engine": {
            "library": "RDKit (C++)",
            "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/chemistry/native/ferrum_chem_smiles.cpp#L84"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/FERRUM_API_CONTRACT.md#operations",
          "note": "Standard and fixed-H InChI interchange.",
          "engine": {
            "library": "RDKit (C++, RDInchiLib)",
            "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/chemistry/native/ferrum_chem_inchi.cpp#L122"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/FILE_FORMATS.md#rendered-document-artifacts",
          "note": "Complete vector SVG document export."
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/FILE_FORMATS.md#rendered-document-artifacts",
          "note": "Complete vector PDF document export."
        },
        "png-export": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/FILE_FORMATS.md#rendered-document-artifacts",
          "note": "PNG uses one pixel per page point, below 300 dpi."
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-chem-qt.app/ferrum_qt/ferrum/clipboard.py#L273-L315",
          "note": "Editable clipboard transfer accepts Ferrum CDML only."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/FERRUM_API_CONTRACT.md#python-boundary",
          "note": "Documented ferrum_chem operation protocol binding."
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/docs/USAGE.md#common-document-tasks",
          "note": "Inspect, validate, render, convert, and protocol commands without the GUI."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "no",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/vosslab/ferrum-chemical-forge/main/docs/active_plans/audits/ferrum_qt_capability_matrix.md",
          "note": "Third-party execution explicitly dropped; built-in actions remain."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/main/docs/FERRUM_API_CONTRACT.md#python-boundary",
          "note": "Public Python API handles documents; Qt editor bridge is private."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/packages/ferrum-rust/crates/render/src/document/depiction_profile_resolution.rs#L93-L103",
          "note": "Per-atom colored label backgrounds through native CDML attributes."
        }
      },
      "caveats": [
        "Pre-alpha macOS arm64 source build; no released distribution or completed native accessibility acceptance.",
        "CDXML supports bounded simple-molecule import only; binary CDX is refused.",
        "Contract docs understate implemented ring choices, templates, atom properties, and paper controls."
      ],
      "github": {
        "url": "https://github.com/vosslab/ferrum-chemical-forge",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-08-03",
        "commits": 65,
        "contributors": 1,
        "pushedAt": "2026-10-11T19:34:35Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "commit 349438d",
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://github.com/vosslab/ferrum-chemical-forge.git",
        "ran": false,
        "failure": "Unmodified ./build.sh exited 1 while building pinned RDKit Release_2026_03_5. With Homebrew LLVM/Clang 23.1.5 and CMake 4.4.5, RealValueVect.h lines 90, 91 and 96 report: no template named 'vector' in namespace 'std'. CMake's FileParsers target exited 2. The build removed its staging output and produced no build/current runtime or runnable GUI. See build.log and install-checks.json. No app version command could run; testedVersion records the checkout commit as requested.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [
          {
            "fixture": "simple",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "Not attempted: source build failed before GUI launch.",
            "structure": null
          },
          {
            "fixture": "complex",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "Not attempted: source build failed before GUI launch.",
            "structure": null
          },
          {
            "fixture": "threed",
            "result": "failed",
            "input": "smiles",
            "image": null,
            "note": "Not attempted: source build failed before GUI launch.",
            "structure": null
          }
        ],
        "observations": [
          "No app window opened; default rendering could not be assessed.",
          "No fixture imports or exports were attempted.",
          "No feature statuses assigned because the GUI was unavailable."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/vosslab/ferrum-chemical-forge",
        "https://github.com/vosslab/ferrum-chemical-forge/blob/349438dcb6eae37bed92a4158389b94161c92963/README.md"
      ]
    },
    {
      "id": "p04",
      "slug": "marvin-cloud",
      "name": "Marvin Cloud",
      "rank": 99,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Current canvas provenance and third-party chemistry dependencies unestablished."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "Marvin Cloud",
          "level": "paid",
          "price": "2026-11-06: US$99/month; academic US$29/month; annual US$990/US$290."
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "In-house Marvin SVG renderer",
        "language": "JavaScript",
        "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=QE1Wn2FQb8I",
        "embed": "https://www.youtube-nocookie.com/embed/QE1Wn2FQb8I",
        "title": "Marvin Product Introduction",
        "author": "Certara - Chemaxon",
        "linkedFrom": "https://marvincloud.marvin.cxn.io/",
        "poster": "https://i.ytimg.com/vi/QE1Wn2FQb8I/maxresdefault.jpg"
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Integration requires separate Marvin Enterprise or Partners edition",
        "how": "Cloud FAQ explicitly excludes integration and API access."
      },
      "otherLanguages": [
        {
          "language": "Java",
          "role": "Remote services and GWT valence source"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Its standalone editor combines chemical structures, reaction schemes, rich text, shapes, journal styles and SVG export for publication figures.",
      "summary": "Browser-based chemical drawing software for publication figures, reaction schemes, and chemical property calculations.",
      "website": "https://marvincloud.marvin.cxn.io/",
      "repo": null,
      "docs": "https://docs.chemaxon.com/latest/marvin_index.html",
      "vendor": "Chemaxon (Certara)",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary subscription service with a 14-day trial.",
        "source": "https://docs.chemaxon.com/latest/legal_end-user-subscription-agreement-eusa.html"
      },
      "price": {
        "text": "2026-11-05: US$99/month professional; US$29/month academic; annual billing 20% off.",
        "source": "https://marvincloud.marvin.cxn.io/"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://docs.chemaxon.com/latest/marvin_index.html"
      },
      "engine": {
        "rendering": null,
        "chemistry": "In-house Chemaxon chemistry (Marvin Web Services; JChem Microservices calculations)",
        "ui": "React",
        "source": "https://docs.chemaxon.com/latest/marvin_installation-guide.html"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_shortcuts-and-tricks.html#bond-context-shortcuts",
          "note": "Single, double and triple bond editing shortcuts.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_shortcuts-and-tricks.html#bond-context-shortcuts",
          "note": "Wedge, down-wedge and wavy bond shortcuts.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_shortcuts-and-tricks.html#canvas-context-shortcuts",
          "note": "Benzene and three- through eight-membered ring templates.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_shortcuts-and-tricks.html#canvas-context-shortcuts",
          "note": "Two cyclohexane chair templates.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Chain tool documented; drag-to-length behavior not established."
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Template library documented; inventory beyond simple rings not established."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/interfaces/api_marvinEditorSettings.EditorSettings.html#customAbbreviatedGroups",
          "note": "Abbreviated groups retain molecular structures and attachment points.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Charges and elements documented; isotope editing not established."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/interfaces/api_marvinToolSettings.ToolSettings.html#type",
          "note": "Explicit add-radical drawing tool.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_shortcuts-and-tricks.html#bond-context-shortcuts",
          "note": "Keys change focused atoms and bonds.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Lasso, rotation and flips documented; resizing not established."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/interfaces/api_marvinToolSettings.ToolSettings.html#subType",
          "note": "Forward, equilibrium, resonance and retrosynthesis arrows.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Curved graphical arrows documented; electron-pushing tools not established."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/types/api_marvinTypes.DocumentType.html",
          "note": "RXN is a supported chemical document format.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/interfaces/api_marvinToolSettings.ToolSettings.html#type",
          "note": "Dedicated reaction-map tool.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Scientific symbols documented; chemical-symbol library scope not established."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/interfaces/api_marvinToolSettings.ToolSettings.html#subType",
          "note": "Font family, size, subscript and superscript tools.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_sketch-js-comparison.html#additional-arrow-types-shapes-and-brackets",
          "note": "Editable geometric shapes, arcs, lines and multiple bracket types.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_sketch-js-comparison.html#fast-drawing-analysis",
          "note": "Alignment and distribution guidelines.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_shortcuts-and-tricks.html#canvas-context-shortcuts",
          "note": "Dedicated 2D clean command.",
          "engine": {
            "library": "In-house Marvin Web Services structure clean (remote Java service)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/interfaces/api_marvinVisualizationSettings.VisualizationSettings.html#styleSettings",
          "note": "ACS 1996 is the default journal style.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/interfaces/api_marvinVisualizationSettings.VisualizationSettings.html#customJournalStyles",
          "note": "User-defined journal styles include bond and font settings.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_sketch-js-comparison.html#coloring-and-highlighting-options-for-atoms-bonds-and-shapes",
          "note": "Atoms, bonds, properties and graphical shapes can be colored.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_sketch-js-comparison.html#importexport-and-crop-multiple-image-formats",
          "note": "Images can be pasted, imported and cropped.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/interfaces/api_marvinVisualizationSettings.VisualizationSettings.html#valenceErrorVisible",
          "note": "Valence errors are highlighted by default.",
          "engine": {
            "library": "In-house ValenceCalculator (Java compiled by GWT to browser JavaScript)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/interfaces/api_marvinVisualizationSettings.VisualizationSettings.html#cipStereoRSVisible",
          "note": "Computed CIP R/S and E/Z labels.",
          "engine": {
            "library": "In-house Marvin Web Services CIP calculation (remote Java service)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Molecular weight documented; molecular formula output not established."
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://marvincloud.marvin.cxn.io/",
          "note": "vendor claim; logP, logS and pKa predictions.",
          "engine": {
            "library": "In-house Marvin Web Services calculator and JChem Microservices calculations (remote Java services)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.certara.com/marvin/",
          "note": "vendor claim; chemical names convert through the search bar.",
          "engine": {
            "library": "In-house Marvin Web Services name conversion (remote Java service)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.certara.com/on-demand-webinar/why-upgrade-to-marvin-unlocking-speed-accuracy-and-scientific-intelligence/",
          "note": "vendor claim; automated IUPAC naming.",
          "engine": {
            "library": "In-house Marvin Web Services IUPAC naming (remote Java service)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://marvincloud.marvin.cxn.io/",
          "note": "vendor claim; both 1H and 13C predictions.",
          "engine": {
            "library": "In-house Marvin Web Services NMR predictor (remote Java service)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_index.html#advanced-drawing",
          "note": "Markush structures, R-groups and query properties.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Polymer drawing claimed; chemical repeat-unit semantics not established."
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.certara.com/on-demand-webinar/chemaxon-presents-too-many-tools-not-enough-chemistry/?p=87616",
          "note": "vendor claim; peptide sequence import.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "CDXML export documented; import not established."
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/types/api_marvinTypes.DocumentType.html",
          "note": "CDX is supported for export and template import.",
          "engine": {
            "library": "In-house Marvin Web Services MolConvert (remote Java service)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/types/api_marvinTypes.DocumentType.html",
          "note": "MOL V2000, MOL V3000 and SDF are supported.",
          "engine": {
            "library": "In-house Marvin Web Services MolConvert (remote Java service)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/types/api_marvinTypes.DocumentType.html",
          "note": "SMILES import and export; CXSMILES also supported.",
          "engine": {
            "library": "In-house Marvin Web Services MolConvert (remote Java service)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/types/api_marvinTypes.DocumentType.html",
          "note": "InChI and InChIKey export types are documented.",
          "engine": {
            "library": "Marvin Web Services MolConvert (remote Java service; underlying InChI implementation undisclosed)",
            "source": "https://marvincloud.marvin.cxn.io/assets/index-DipA2Vjw.js"
          },
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apidocs.chemaxon.com/marvinpro/types/api_marvinTypes.DocumentType.html",
          "note": "RXN export is documented.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_sketch-js-comparison.html#importexport-and-crop-multiple-image-formats",
          "note": "SVG vector export.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "PNG export documented; 300 dpi support not established."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.certara.com/blog/cheminformatics-trends-in-2026-ai-is-your-new-favorite-labmate/",
          "note": "Cloud excludes integrations; Office integration requires enterprise Marvin."
        },
        "python-api": {
          "status": "no",
          "evidence": "docs",
          "source": "https://marvincloud.marvin.cxn.io/",
          "note": "Cloud explicitly excludes API access."
        },
        "ts-api": {
          "status": "no",
          "evidence": "docs",
          "source": "https://marvincloud.marvin.cxn.io/",
          "note": "Cloud explicitly excludes API access; separate enterprise product supports JavaScript."
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://marvincloud.marvin.cxn.io/",
          "note": "Cloud FAQ explicitly excludes integration and API access."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/jchem-for-office_history-of-changes.html#sept-14th-2023-jchem-for-office-2350",
          "note": "JChem Office add-in; OLE copy-paste removed since version 23.5.0."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://docs.chemaxon.com/latest/marvin_sketch-js-comparison.html#coloring-and-highlighting-options-for-atoms-bonds-and-shapes",
          "note": "Atom and bond highlighting, distinct from foreground coloring.",
          "plan": "Marvin Cloud",
          "planLevel": "paid"
        }
      },
      "caveats": [
        "The 14-day trial requires a card and converts to automatic billing.",
        "Cloud excludes API access and embedding; enterprise integration is sold separately.",
        "Office re-editing requires JChem for Office and is unavailable on macOS."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://marvincloud.marvin.cxn.io/",
        "https://www.certara.com/marvin/"
      ]
    },
    {
      "id": "p25",
      "slug": "chem4word",
      "name": "Chem4Word",
      "rank": 100,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Controls/ChemistryCanvas.cs",
        "note": "Current ACME canvas is original; ChemDoodle license notice references an absent legacy ZIP."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Chem4Word ACME (WPF DrawingVisual) and OoXmlV4 (DrawingML)",
        "language": "C#",
        "source": "https://github.com/Chem4Word/Version3-3/blob/2723a9ea50033152485c7df374b90f481c0d3011/src/Chemistry/Chem4Word.ACME/Drawing/Visuals/BondVisual.cs#L361"
      },
      "enginesChecked": true,
      "languageNote": "PHP supplies web utilities; PowerShell and batch scripts handle builds.",
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=C8LL37IOKXo",
        "embed": "https://www.youtube-nocookie.com/embed/C8LL37IOKXo",
        "title": "Adding chemical reactions in Chem4Word",
        "author": "Chemistry For Word",
        "linkedFrom": "https://www.chem4word.co.uk/2023/03/26/drawing-chemical-reactions/",
        "poster": "https://i.ytimg.com/vi/C8LL37IOKXo/hqdefault.jpg"
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Apache-2.0; bundled ChemDoodle Web files require GPL-3.0 compliance.",
        "how": "Word add-in launches modal editor; reusable editor SDK unconfirmed."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Native SQLite structure library storage"
        }
      ],
      "thirdParty": {
        "summary": "MIT/Apache-2.0/BSD-3-Clause/MS-PL dependencies, public-domain SQLite and CC0 oils data; proprietary Microsoft VSTO terms; Arial glyph-data license unspecified.",
        "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/README.md",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Creates editable vector chemical structures and reaction schemes within printable Word documents.",
      "summary": "A Microsoft Word add-in for drawing and editing chemical structures and reactions in documents.",
      "website": "https://www.chem4word.co.uk/",
      "repo": "https://github.com/Chem4Word/Version3-3",
      "docs": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/docs/Chem4Word-Version3-3-User-Manual.docx",
      "vendor": "Chem4Word project",
      "license": {
        "kind": "open-source",
        "spdx": "Apache-2.0",
        "text": "Apache 2.0; bundled ChemDoodle Web files use GPLv3.",
        "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/LICENCE.md"
      },
      "price": {
        "text": "Free",
        "source": "https://www.chem4word.co.uk/2023/07/05/why-should-i-use-chem4word/"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "V3.3.17",
        "date": "2026-09-09",
        "source": "https://github.com/Chem4Word/Version3-3/releases/tag/V3.3.17"
      },
      "engine": {
        "rendering": "WPF DrawingVisual/DrawingContext in the editor; OOXML DrawingML in Word documents",
        "chemistry": "In-house Chem4Word.Model2; online services for names and identifiers",
        "ui": "WPF/XAML and Windows Forms; Microsoft Word VSTO add-in",
        "source": "https://github.com/Chem4Word/Version3-3/tree/25211e33f6d5f3c5b9c550379211ccb778cda924/src"
      },
      "languages": [
        "C#"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Behaviors/DrawBehavior.cs",
          "note": "Clicking cycles single, double, and triple bond orders."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Controls/BondPropertyEditor.xaml",
          "note": "Wedge, hatch, and indeterminate wavy bonds."
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Resources/BondOptions.xaml",
          "note": "Hydrogen and fractional bonds; no dative option in the bond palette."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Controls/BondPropertyEditor.xaml",
          "note": "Clockwise, anticlockwise, and centered double-bond placement."
        },
        "rings": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Editor.xaml",
          "note": "Benzene, common saturated rings, and variable ring sizes."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Behaviors/ChainBehavior.cs",
          "note": "Dragging places successive bonds at alternating 60-degree angles."
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chem4word.co.uk/2023/06/14/improved-chemical-libraries-are-coming-to-chem4word/",
          "note": "Includes about 2,000 reusable natural-product structures."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chem4Word.V3/Ribbon/Chem4WordRibbon.cs",
          "note": "Save drawn structures to the reusable chemistry library."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.Model2/Resources/FunctionalGroups.xml",
          "note": "Functional groups include chemical compositions and expandable OMe structures."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Controls/AtomPropertyEditor.xaml",
          "note": "Periodic-table element selection, formal charges, and isotope selection."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Chem4Word/Version3-3/releases/tag/V3.3.16",
          "note": "Electrons and lone pairs can be added to atoms."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Editor.xaml",
          "note": "Lasso selection; molecules support rotation, flips, and resizing."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Resources/ReactionOptions.xaml",
          "note": "Forward, equilibrium, resonance, and retrosynthetic arrow types."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Editor.xaml",
          "note": "Editable double-headed electron pushers and radical fishhook arrows."
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.Model2/Converters/CML/CMLConverter.cs",
          "note": "CML stores reactant and product references to molecule structures."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Editor.xaml",
          "note": "Subscripts and superscripts; annotation editor specifies Arial."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/EditController/EditController.AlignmentOperations.cs",
          "note": "Align selected molecules, annotations, and reaction arrows."
        },
        "groups": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Editor.xaml",
          "note": "Group and ungroup molecular fragments."
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Drawing/Visuals/AtomVisual.cs",
          "note": "Overbonded atoms receive warning circles.",
          "engine": {
            "library": "In-house Chem4Word.Model2 PeriodicTable.SpareValencies/Atom.Overbonded (C#)",
            "source": "https://github.com/Chem4Word/Version3-3/blob/2723a9ea50033152485c7df374b90f481c0d3011/src/Chemistry/Chem4Word.Model2/PeriodicTable.cs#L190"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.Model2/Molecule.cs",
          "note": "Computes molecular formula and molecular weight locally.",
          "engine": {
            "library": "In-house Chem4Word.Model2 Molecule/FormulaHelper (C#)",
            "source": "https://github.com/Chem4Word/Version3-3/blob/2723a9ea50033152485c7df374b90f481c0d3011/src/Chemistry/Chem4Word.Model2/Molecule.cs#L425"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/PlugIns/Searchers/Chem4Word.Searcher.OpsinPlugIn/SearchOpsin.cs",
          "note": "Chemical names are submitted to the online OPSIN service.",
          "engine": {
            "library": "OPSIN (remote EBI web service; in-house C# client importing CML)",
            "source": "https://github.com/Chem4Word/Version3-3/blob/2723a9ea50033152485c7df374b90f481c0d3011/src/PlugIns/Searchers/Chem4Word.Searcher.OpsinPlugIn/SearchOpsin.cs#L50"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.WebServices/PropertyCalculator.cs",
          "note": "Online resolver returns an IUPAC name for drawn structures.",
          "engine": {
            "library": "Chem4Word ChemicalServices Resolve API (remote server; underlying naming engine undisclosed)",
            "source": "https://github.com/Chem4Word/Version3-3/blob/2723a9ea50033152485c7df374b90f481c0d3011/src/Chemistry/Chem4Word.WebServices/PropertyCalculator.cs#L154"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.Model2/Resources/FunctionalGroups.xml",
          "note": "R-group residue labels include R1, R2, and numbered variants."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/PlugIns/Searchers/Chem4Word.Searcher.PubChemPlugIn/Searcher.cs",
          "note": "PubChem search imports retrieved structures as CML.",
          "engine": {
            "library": "PubChem E-utilities/PUG REST and ChEBI REST (remote services; in-house C# search plugins)",
            "source": "https://github.com/Chem4Word/Version3-3/blob/2723a9ea50033152485c7df374b90f481c0d3011/src/PlugIns/Searchers/Chem4Word.Searcher.PubChemPlugIn/SearchPubChem.cs#L175"
          }
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.Model2/Converters/CML/CMLConverter.cs",
          "note": "Explicitly rejects CDXML import."
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chem4Word.V3/Ribbon/Chem4WordRibbon.cs",
          "note": "Reads and writes MOL/SDF V2000; V3000 import is unsupported.",
          "engine": {
            "library": "In-house Chem4Word.Model2 SdFileConverter/CtabProcessor (C#; V2000)",
            "source": "https://github.com/Chem4Word/Version3-3/blob/2723a9ea50033152485c7df374b90f481c0d3011/src/Chemistry/Chem4Word.Model2/Converters/MDL/SdFileConverter.cs#L39"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.WebServices/PropertyCalculator.cs",
          "note": "SMILES output via online service; native import accepts CML/MOL/SDF/SketchEl.",
          "engine": {
            "library": "Chem4Word ChemicalServices Resolve API (remote server; SMILES output; underlying engine undisclosed)",
            "source": "https://github.com/Chem4Word/Version3-3/blob/2723a9ea50033152485c7df374b90f481c0d3011/src/Chemistry/Chem4Word.WebServices/PropertyCalculator.cs#L160"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.WebServices/PropertyCalculator.cs",
          "note": "Online service generates InChI and InChIKey textual properties.",
          "engine": {
            "library": "Chem4Word ChemicalServices Resolve API (remote server; InChI/InChIKey output; underlying engine undisclosed)",
            "source": "https://github.com/Chem4Word/Version3-3/blob/2723a9ea50033152485c7df374b90f481c0d3011/src/Chemistry/Chem4Word.WebServices/PropertyCalculator.cs#L148"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chem4Word.V3/Ribbon/Chem4WordRibbon.cs",
          "note": "Word structures retain CML and reopen in the editor."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/PlugIns/Searchers/Chem4Word.Searcher.ExamplePlugIn/Searcher.cs",
          "note": "C# plugin contracts and a commented example searcher implementation."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/Chem4Word/Version3-3",
          "note": "Word add-in launches modal editor; reusable editor SDK unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chem4Word.V3/Helpers/ChemistryHelper.cs#L85-L93",
          "note": "Word add-in uses CML content controls, not OLE objects."
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/Chem4Word/Version3-3/blob/25211e33f6d5f3c5b9c550379211ccb778cda924/src/Chemistry/Chem4Word.ACME/Adorners/Selectors/MultiAtomBondAdorner.cs#L95-L149",
          "note": "Orange selection halos only; absent from Word output."
        }
      },
      "caveats": [
        "Requires Windows desktop Word; Mac and Word Online are unsupported.",
        "Core editing is local; searches and name/identifier resolution require internet.",
        "CDXML and MOL/SDF V3000 import are unsupported."
      ],
      "github": {
        "url": "https://github.com/Chem4Word/Version3-3",
        "stars": 16,
        "checkedOn": "2026-11-06",
        "firstCommit": "2022-08-19",
        "commits": 177,
        "contributors": 2,
        "pushedAt": "2026-11-05T09:39:56Z",
        "archived": false
      },
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/Chem4Word/Version3-3",
        "https://www.chem4word.co.uk/",
        "https://github.com/Chem4Word"
      ]
    },
    {
      "id": "p114",
      "slug": "atomlens",
      "name": "AtomLens",
      "rank": 101,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "CDK",
          "OPSIN",
          "SMSDProSwift",
          "InChI",
          "ChemDataExtractor2",
          "DECIMER Image Segmentation"
        ],
        "source": "https://atomlens.app/atomlens/help/settings-and-system.html#privacy-and-licenses",
        "note": "Vendor discloses chemistry components; drawing canvas provenance remains unconfirmed."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "AtomLens",
          "level": "paid",
          "price": "€9.99 one-time, German App Store (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "borrowed",
        "name": "CDKSwiftNativePort depiction (ported from CDK)",
        "language": "Swift",
        "source": "https://atomlens.app/atomlens/help/settings-and-system.html#privacy-and-licenses"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Native app; no documented embeddable editor SDK found."
      },
      "otherLanguages": [
        {
          "language": "C",
          "role": "Vendored official InChI library"
        }
      ],
      "thirdParty": {
        "summary": "Includes LGPL-2.1-or-later (CDKSwiftNativePort), MIT/Apache-2.0 code, CC-BY-4.0 DECIMER weights/CARTO palettes, and CC0 data; fine-tuned recognizer weights have separate vendor-confirmed redistribution authorization.",
        "source": "https://atomlens.app/atomlens/help/settings-and-system.html#privacy-and-licenses",
        "notice": null,
        "libraries": [
          {
            "name": "Chemistry Development Kit",
            "license": "LGPL-2.1-or-later",
            "source": "https://github.com/cdk/cdk/blob/main/pom.xml"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          },
          {
            "name": "SMSDProSwift",
            "license": null,
            "source": null
          },
          {
            "name": "InChI",
            "license": "MIT",
            "source": "https://github.com/IUPAC-InChI/InChI/blob/dev/LICENSE"
          },
          {
            "name": "ChemDataExtractor2",
            "license": "MIT",
            "source": "https://github.com/CambridgeMolecularEngineering/chemdataextractor2/blob/master/LICENSE"
          },
          {
            "name": "DECIMER Image Segmentation",
            "license": "MIT",
            "source": "https://github.com/Kohulan/DECIMER-Image-Segmentation/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its standalone molecule and reaction editor with vector exports can produce publication-grade 2D chemical figures.",
      "summary": "A Mac and iPad workbench for drawing, inspecting, organizing, and exporting molecular structures and reactions.",
      "website": "https://atomlens.app/",
      "repo": null,
      "docs": "https://atomlens.app/atomlens/help/",
      "vendor": "Sascha Losko (Obscure Essentials)",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Paid App Store app; bundled open-source components have separate licenses.",
        "source": "https://apps.apple.com/de/app/atomlens/id6759559963"
      },
      "price": {
        "text": "€9.99 one-time purchase, German App Store, 2026-11-05; includes Mac and iPad.",
        "source": "https://apps.apple.com/de/app/atomlens/id6759559963"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": false,
        "web": false,
        "ios": true,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "3.1",
        "date": "2026-10-18",
        "source": "https://apps.apple.com/de/app/atomlens/id6759559963"
      },
      "engine": {
        "rendering": null,
        "chemistry": "CDKSwiftNativePort (CDK-derived), OPSINSwift, SMSDProSwift, and IUPAC InChI",
        "ui": null,
        "source": "https://atomlens.app/atomlens/help/settings-and-system.html"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/chemical-editor.html",
          "note": "Single, double, triple, and aromatic bond orders.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/chemical-editor.html",
          "note": "Dedicated wedge, hash, and wavy tools.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/chemical-editor.html",
          "note": "Cyclopropane through cyclohexane, plus benzene.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/chemical-editor.html",
          "note": "Built-in carbon-chain and common-ring templates.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/chemical-editor.html",
          "note": "Save Template stores a selected fragment.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/chemical-editor.html",
          "note": "Element labels, formal charges, and isotopes in the inspector.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/chemical-editor.html",
          "note": "Atom inspector includes radical settings.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/formats-and-tools.html",
          "note": "Reaction SMILES, RXN, RDF, RInChI, and reaction CML.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/chemical-editor.html",
          "note": "Atom Map assigns numbers; selections can receive reaction roles.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/chemical-editor.html",
          "note": "Clean Up improves the 2D layout without changing connectivity.",
          "engine": {
            "library": "CDKSwiftNativePort (CDKStructureDiagramGenerator native Swift port)",
            "source": "https://github.com/SaschaLosko/CDKSwiftNativePort/blob/7e726fde28766fe568f206104dc18cca15505be5/Sources/CDKSwiftNativePort/Molecule.swift#L850-L860"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/chemical-editor.html",
          "note": "Valence and Validation warn about abnormal bond counts.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/workspace.html",
          "note": "Formula, molecular weight, and monoisotopic mass.",
          "engine": {
            "library": "CDKSwiftNativePort (native Swift CDKMolecularFormulaDescriptor, CDKMolecularWeightDescriptor, CDKExactMassDescriptor)",
            "source": "https://github.com/SaschaLosko/CDKSwiftNativePort/blob/7e726fde28766fe568f206104dc18cca15505be5/Sources/CDKSwiftNativePort/CDK/Common/MoleculePropertyService.swift#L118-L151"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/settings-and-system.html",
          "note": "Calculates XLogP and Rule-of-Five status.",
          "engine": {
            "library": "CDKSwiftNativePort (native Swift CDKXLogPDescriptor and CDKTPSADescriptor)",
            "source": "https://github.com/SaschaLosko/CDKSwiftNativePort/blob/7e726fde28766fe568f206104dc18cca15505be5/Sources/CDKSwiftNativePort/CDK/Common/MoleculePropertyService.swift#L118-L151"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/workspace.html",
          "note": "Supported IUPAC names convert to editable structure input.",
          "engine": {
            "library": "OPSINSwift (native Swift port of OPSIN, on-device)",
            "source": "https://atomlens.app/atomlens/help/settings-and-system.html#privacy-and-licenses"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/scan-document-chemistry.html",
          "note": "Systematic-name generation is limited to PDF-recognized drawings.",
          "engine": {
            "library": "In-house offline-iupac-v1-curve-2132624 Core ML model; OPSINSwift identity validation",
            "source": "https://atomlens.app/atomlens/help/licenses/IUPAC-Name-Model-NOTICE.md"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/formats-and-tools.html",
          "note": "Markush scaffolds, R-group legends, and supported query annotations.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/formats-and-tools.html",
          "note": "Depicts imported repeat-unit and link-node notation.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/scan-document-chemistry.html",
          "note": "Printed PDF structures become SMILES/CML for import and editing.",
          "engine": {
            "library": "DECIMER (bundled on-device models); CDKSwiftNativePort structure parsing",
            "source": "https://atomlens.app/atomlens/help/licenses/IUPAC-Name-Model-NOTICE.md"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/privacy.html",
          "note": "PubChem searches retrieve compounds and import SDF structures.",
          "engine": {
            "library": "PubChem (remote search, compound information and SDF retrieval)",
            "source": "https://atomlens.app/privacy.html#atomlens"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/workspace.html",
          "note": "Rotatable ball-and-stick, stick, and space-filling molecule views.",
          "engine": {
            "library": "CDKSwiftNativePort (CDKMetal3DSceneBuilder and CDKModelBuilder3D; native Swift)",
            "source": "https://github.com/SaschaLosko/CDKSwiftNativePort/blob/7e726fde28766fe568f206104dc18cca15505be5/Sources/CDKSwiftNativePort/CDK/Rendering/Metal3DSceneBuilder.swift#L210-L247"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/formats-and-tools.html",
          "note": "Reads and writes supported chemistry; arbitrary source metadata is lost.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/formats-and-tools.html",
          "note": "Reads and writes supported chemistry; arbitrary source metadata is lost.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/formats-and-tools.html",
          "note": "MOL V2000/V3000 and single/multiple-structure SDF import and export.",
          "engine": {
            "library": "CDKSwiftNativePort (native Swift MDL V2000/V3000 and SDF readers/writers)",
            "source": "https://github.com/SaschaLosko/CDKSwiftNativePort/blob/7e726fde28766fe568f206104dc18cca15505be5/Documentation/INTEGRATION.md#12-export-common-formats"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/formats-and-tools.html",
          "note": "Standard and isomeric SMILES; export excludes CXSMILES extensions.",
          "engine": {
            "library": "CDKSwiftNativePort (native Swift CDK SMILES/CXSMILES parser and SMILES writer)",
            "source": "https://github.com/SaschaLosko/CDKSwiftNativePort/blob/7e726fde28766fe568f206104dc18cca15505be5/README.md#smiles-and-cxsmiles"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/formats-and-tools.html",
          "note": "Local InChI input and generation.",
          "engine": {
            "library": "IUPAC InChI 1.07.5 (vendored native C library through CDKSwiftNativePort)",
            "source": "https://github.com/SaschaLosko/CDKSwiftNativePort/blob/7e726fde28766fe568f206104dc18cca15505be5/Sources/CDKSwiftNativePort/CDK/InChI/InChIOfficialLibraryGenerator.swift#L1-L42"
          },
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/formats-and-tools.html",
          "note": "MDL RXN input and whole-reaction export.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/glossary.html",
          "note": "Resolution-independent structure artwork.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/glossary.html",
          "note": "Vector-preserving PDF sharing.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://atomlens.app/atomlens/help/settings-and-system.html",
          "note": "macOS bundled MCP helper supports repository search, modification, and export.",
          "plan": "AtomLens",
          "planLevel": "paid"
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://atomlens.app/atomlens/help/settings-and-system.html",
          "note": "Native app; no documented embeddable editor SDK found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Requires macOS/iPadOS 26 or later; Mac requires Apple M1 or later.",
        "CDX/CDXML exchange supports a chemistry subset and does not preserve arbitrary source metadata.",
        "PDF recognition targets printed structures, excludes handwriting, and can produce incorrect results."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": 584507392,
      "references": [
        "https://atomlens.app/",
        "https://apps.apple.com/de/app/atomlens/id6759559963?l=en-GB"
      ]
    },
    {
      "id": "p94",
      "slug": "chemtool",
      "name": "Chemtool",
      "rank": 102,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "Babel",
          "Open Babel"
        ],
        "source": "https://sources.debian.org/src/chemtool/1.6.14-6/README/#L310",
        "note": "Custom C drawing canvas; optional Babel or Open Babel commands provide chemical format conversion."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Chemtool GDK/Pango renderer",
        "language": "C",
        "source": "https://sources.debian.org/src/chemtool/1.6.14-6/graph.c/#L103"
      },
      "enginesChecked": true,
      "languageNote": "Pascal is legacy; shell, Yacc and Makefiles support dependencies or builds.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-2.0-or-later",
        "how": "GTK executable documented; no supported embeddable editor interface confirmed."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Includes LGPL-2.0-or-later (GTK/gettext support code) and GPL-2.0-or-later (undo code).",
        "source": "https://sources.debian.org/data/main/c/chemtool/1.6.14-6/debian/copyright",
        "notice": null,
        "libraries": [
          {
            "name": "Babel",
            "license": null,
            "source": null
          },
          {
            "name": "Open Babel",
            "license": "GPL-2.0-only",
            "source": "https://github.com/openbabel/openbabel/blob/master/COPYING"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "It is a standalone 2D editor with structures, text, templates and vector export for publication figures.",
      "summary": "A standalone editor for drawing organic molecular structures and exporting chemical figures.",
      "website": "http://ruby.chemie.uni-freiburg.de/~martin/chemtool/chemtool.html",
      "repo": null,
      "docs": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html",
      "vendor": "Thomas Volk and Martin Kroeker",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-2.0-or-later AND LGPL-2.0-or-later",
        "text": "GPL version 2 or later; bundled support files include LGPL code.",
        "source": "https://sources.debian.org/src/chemtool/1.6.14-6/debian/copyright"
      },
      "price": {
        "text": "Free",
        "source": "https://packages.debian.org/en/trixie/chemtool"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.6.14",
        "date": null,
        "source": "https://packages.debian.org/en/source/trixie/chemtool"
      },
      "engine": {
        "rendering": "Custom C drawing with GDK primitives and Pango text; custom SVG/XFig export; fig2dev for PNG/EPS.",
        "chemistry": "In-house routines and bundled cht analyzer; optional external Babel/OpenBabel CLI for format conversion.",
        "ui": "GTK+ 2 / X11",
        "source": "https://sources.debian.org/src/chemtool/1.6.14-6/graph.c"
      },
      "languages": [
        "C"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Drawing_of_bonds:",
          "note": "Draw and change single, double and triple bonds."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Drawing_of_bonds:",
          "note": "Solid wedge, dashed wedge and wavy lines."
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/ChangeLog#L549",
          "note": "Molecular arrows depict N-oxides; quadruple and dotted bonds also available."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Drawing_of_bonds:",
          "note": "Both offset orientations and centered double bonds."
        },
        "rings": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/templates.h#L8201",
          "note": "Ring tools cover 3–12 members; templates include aromatic benzene."
        },
        "conformers": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/templates.h#L8205",
          "note": "Includes a cyclohexane chair template."
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/templates.h#L1",
          "note": "Includes sugars, amino acids, steroids and other complex structures."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Adding_previously_saved_figures:",
          "note": "Save structures with attachment points and reuse through Add."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/cht.1.en.html#DESCRIPTION",
          "note": "Companion cht recognizes Ph, BOC, Me and other abbreviations."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Inserting_text",
          "note": "Arbitrary labels and superscripts depict isotopes and charges."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Drawing_electron_pairs",
          "note": "Keypad creates lone pairs; individual dots can represent radicals."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Labeling_shortcuts",
          "note": "Element shortcuts place labels at the last clicked drawing position."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Selecting_all_or_parts_of_a_drawing_for_transformations:",
          "note": "Selection uses rectangles; rotate, flip and resize are supported."
        },
        "perspective": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Importing_foreign_file_formats:",
          "note": "Rotation applies only to imported 3D previews before flattening."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/ChangeLog#L13",
          "note": "Equilibrium arrows are assembled from two half arrows."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Drawing_of_curved_lines:",
          "note": "Editable spline arrows support full and half arrowheads."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Drawing_of_bonds:",
          "note": "Filled and unfilled pi orbital lobes."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Inserting_text",
          "note": "Canvas text supports fonts, bold, italic, subscripts and superscripts."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Selecting_all_or_parts_of_a_drawing_for_transformations:",
          "note": "Boxes and brackets, plus editable spline curves."
        },
        "align": {
          "status": "no",
          "evidence": "docs",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/TODO#L4",
          "note": "Automatic alignment remains on the shipped TODO list."
        },
        "groups": {
          "status": "no",
          "evidence": "docs",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/TODO#L4",
          "note": "Persistent grouping remains on the shipped TODO list."
        },
        "cleanup": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Selecting_all_or_parts_of_a_drawing_for_transformations:",
          "note": "Removes duplicates and straightens near-horizontal/vertical bonds; no general length normalization.",
          "engine": {
            "library": "In-house (C tidy_mol; endpoint snapping and duplicate removal)",
            "source": "https://sources.debian.org/src/chemtool/1.6.14-6/chemproc.c/#L1749"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/inout.c#L43",
          "note": "Settings persist within drawings, without a reusable style preset."
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Inserting_text",
          "note": "Individual labels and bonds can use the supplied colors."
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/inout.c#L43",
          "note": "Print paper size is configurable; native files contain one canvas."
        },
        "pictures": {
          "status": "no",
          "evidence": "docs",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/INSTALL#L52",
          "note": "INSTALL explicitly identifies image import as missing."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/cht.1.en.html#DESCRIPTION",
          "note": "Companion cht flags duplicate bonds during formula calculation.",
          "engine": {
            "library": "cht (bundled local C executable; overlapping-bond warnings only)",
            "source": "https://sources.debian.org/src/chemtool/1.6.14-6/src-cht/cht.c/#L1490"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Determining_sum_formula_and_molecular_weight:",
          "note": "Bundled cht calculates formula, molecular mass and exact mass.",
          "engine": {
            "library": "cht (bundled local C executable, translated from Pascal)",
            "source": "https://sources.debian.org/src/chemtool/1.6.14-6/inout.c/#L5804"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Importing_foreign_file_formats:",
          "note": "Imported PDB/MOL structures rotate in a temporary 3D preview.",
          "engine": {
            "library": "In-house (C imported-coordinate rotation preview)",
            "source": "https://sources.debian.org/src/chemtool/1.6.14-6/inout.c/#L800"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/NEWS#L112",
          "note": "MOL read/write; SDF browsing and import.",
          "engine": {
            "library": "In-house (C MOL reader/writer and SDF reader)",
            "source": "https://sources.debian.org/src/chemtool/1.6.14-6/inout.c/#L971"
          }
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://manpages.debian.org/trixie/chemtool/chemtool.1.en.html#Exporting_to_foreign_formats:",
          "note": "Native vector SVG export."
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/NEWS#L21",
          "note": "Batch conversion with chemtool -bg; still requires GTK/X11."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/README/",
          "note": "GTK executable documented; no supported embeddable editor interface confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "no",
          "evidence": "docs",
          "source": "https://sources.debian.org/src/chemtool/1.6.14-6/graph.c/#L580",
          "note": "Only foreground coloring; selection replaces strokes without adding backgrounds or halos."
        }
      },
      "caveats": [
        "PNG/EPS require fig2dev; additional chemical formats require a compatible Babel/OpenBabel command.",
        "Formula calculations can be wrong for overlapping bonds or aromatic-circle notation.",
        "macOS and Windows support is documented through legacy X11 source builds."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://deb.debian.org/debian/pool/main/c/chemtool/chemtool_1.6.14.orig.tar.gz",
        "ran": false,
        "failure": "Unmodified Chemtool 1.6.14 source failed to compile: main.c:18:10: fatal error: gdk/gdkx.h: No such file or directory. Installed Homebrew GTK2 2.24.33 uses Quartz and lacks the required X11 backend. No Chemtool binary or final installation was produced; see configure.log and build.log.",
        "downloadBytes": 817735,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "Build failed before any app window opened.",
          "No molecules or drawing features were tested."
        ]
      },
      "perf": null,
      "downloadBytes": 817735,
      "references": [
        "https://packages.debian.org/en/trixie/chemtool"
      ]
    },
    {
      "id": "p65",
      "slug": "lhendraw",
      "name": "Lhendraw",
      "rank": 103,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/lhendraw.cxx#L285-L334",
        "note": "Custom atom/bond model and chemical analysis; build links only UI and system libraries."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Lhendraw custom software and vector renderer",
        "language": "C++",
        "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/draw.hxx"
      },
      "enginesChecked": true,
      "languageNote": "C supports source generation; scripts and Roff support builds and documentation.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "AGPL-3.0",
        "how": "Desktop executables documented; no offered embedding component confirmed."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Includes GPL-2.0-or-later xclip code and GPLv2 Liberation Mono fonts with embedding exceptions.",
        "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/clipboard.hxx",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "It creates editable chemical drawing documents with structures, reaction arrows, text, shapes and vector export.",
      "summary": "Desktop editor for drawing chemical structures, reaction schemes, and figures with ChemDraw CDX/CDXML file exchange.",
      "website": "https://lennardwasserthal.de/lhendraw.html",
      "repo": "https://github.com/Wasserthal/lhendraw",
      "docs": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/help.hxx",
      "vendor": "Lennard K. Wasserthal",
      "license": {
        "kind": "open-source",
        "spdx": "AGPL-3.0",
        "text": "GNU Affero General Public License version 3.",
        "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/README"
      },
      "price": {
        "text": "Free",
        "source": "https://lennardwasserthal.de/lhendraw.html"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.4.5",
        "date": null,
        "source": "https://github.com/Wasserthal/lhendraw/tree/v0.4.5"
      },
      "engine": {
        "rendering": "Custom software rasterizer using SDL surfaces or Win32/GDI; custom SVG, PostScript and PNG writers.",
        "chemistry": "In-house C++ atom/bond model and molecular-analysis routines.",
        "ui": "Custom desktop UI using SDL 1.2/2.0, with a native Win32 backend.",
        "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/lhendraw.cxx#L35"
      },
      "languages": [
        "C++"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolspecific_BOND.pullout.hxx#L1",
          "note": "Single, double and triple bond tools."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolspecific_BOND.pullout.hxx#L51",
          "note": "Solid wedges, hashed wedges and wavy bonds."
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolspecific_BOND.pullout.hxx#L41",
          "note": "Quadruple and dashed bonds; drawable dative support unverified."
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/edit.hxx#L3452",
          "note": "Repeated clicks cycle centered, left and right positions."
        },
        "rings": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolspecific_RING.pullout.hxx#L1",
          "note": "Three- through nine-membered rings, with aromatic option."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/sdlctrl.hxx#L2366",
          "note": "Extends chains one bond per gesture; no variable-length drag."
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/elements.hxx#L140",
          "note": "Formula analysis recognizes limited abbreviations, including Et, Ac and TMS."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/elements.hxx#L26",
          "note": "Charges and arbitrary labels; only D/T isotope entries verified."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolspecific_ATTRIBUTES.pullout.hxx#L21",
          "note": "Radical and lone-pair placement tools."
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/help.hxx#L7",
          "note": "Hover over atoms and type element letters."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/pivot.hxx#L262",
          "note": "Lasso selection, rotation, scaling and negative-scale mirroring."
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/help.hxx#L83",
          "note": "Canvas drawings rotate around the X and Y axes."
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolspecific_ARROW.pullout.hxx#L31",
          "note": "Forward, retrosynthetic and equilibrium arrows."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolspecific_CURVE.pullout.hxx#L1",
          "note": "Editable Bezier curves with full or half arrowheads."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolspecific_ATTRIBUTES.pullout.hxx#L1",
          "note": "Chemical-symbol palette includes charges, electrons, lone pairs and radical ions."
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolspecific_TEXT.pullout.hxx#L1",
          "note": "Subscripts and superscripts; font rendering uses a fixed size."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolbox.pullout.hxx#L127",
          "note": "Editable curves, geometric shapes and brackets."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolbox.pullout.hxx#L463",
          "note": "Command tidies selected structures.",
          "engine": {
            "library": "In-house (C++ ring, bond-length and angle cleanup)",
            "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/edit.hxx#L3132-L3314"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/edit.hxx#L5915",
          "note": "Color chooser updates selected atoms, bonds and objects."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/toolspecific_TLCPLATE.pullout.hxx#L1",
          "note": "Dedicated TLC plate, lane and spot tools."
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/edit.hxx#L6042",
          "note": "Command locates carbons with bond-order sums of five or more.",
          "engine": {
            "library": "In-house (C++ carbon bond-order-sum check)",
            "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/edit.hxx#L6042-L6064"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/menugfx.hxx#L968",
          "note": "Selected structures display formula, molecular weight and exact mass.",
          "engine": {
            "library": "In-house (C++ elemental analysis and isotope masses)",
            "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/analysis.hxx#L11-L120"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/help.hxx#L33",
          "note": "Periodic-table palette includes chemical wildcards."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/fileformat.hxx#L10",
          "note": "CDXML reading and writing.",
          "engine": {
            "library": "In-house (C++ XML parser/writer and internal-object conversion)",
            "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/xmlparse.hxx#L139-L560"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/fileformat.hxx#L9",
          "note": "Binary CDX reading and writing.",
          "engine": {
            "library": "In-house (C++ CDX binary parser/writer and internal-object conversion)",
            "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/xmlparse.hxx#L416-L644"
          }
        },
        "mol-sdf": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/fileformat.hxx#L13",
          "note": "Vector SVG export."
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/edit.hxx#L3877",
          "note": "PNG export uses optional 2x enlargement; 300 dpi unverified."
        },
        "clipboard-chemdraw": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/edit.hxx#L4075",
          "note": "Windows implements editable ChemDraw Interchange Format copy and paste."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/cmdline.hxx#L145",
          "note": "Headless conversion and rendering documented with command-line examples."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/INSTALL",
          "note": "Desktop executables documented; no offered embedding component confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/draw.hxx#L577-L692",
          "note": "Renderer supports object recoloring and selection handles, without background highlighting."
        }
      },
      "caveats": [
        "Website packages and source identify v0.6.1; the supplied latest GitHub tag is v0.4.5.",
        "The macOS download is explicitly experimental.",
        "README reports graphical glitches after repeated scaling and rotation of circular arrows."
      ],
      "github": {
        "url": "https://github.com/Wasserthal/lhendraw",
        "stars": 2,
        "checkedOn": "2026-11-06",
        "firstCommit": "2013-05-02",
        "commits": 581,
        "contributors": 5,
        "pushedAt": "2025-03-30T12:46:07Z",
        "archived": false
      },
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://codeload.github.com/Wasserthal/lhendraw/tar.gz/refs/tags/6.1.2",
        "ran": false,
        "failure": "Source build failed on macOS arm64. Shipped generator aborts because macOS rejects %n in writable format strings. Making its format table const let generation finish, but both Apple Clang and GCC reject text.h:107 (ordered comparison of a pointer with integer zero). The supplied Xcode project also fails because SDK macosx10.6 is unavailable. No executable or final app installation was produced; see build-report.md and build logs.",
        "downloadBytes": 471012,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "Application never launched; defaults and molecule rendering were not observed.",
          "No molecule imports, exports, screenshots, or feature checks were possible.",
          "Repository tag 6.1.2 declares 0.6.1 in source; runtime version remains unverified."
        ]
      },
      "perf": null,
      "downloadBytes": 471012,
      "references": [
        "https://github.com/Wasserthal/lhendraw",
        "https://github.com/Wasserthal/lhendraw/blob/d92f42f697d9eb34e633bff28947a96288106ded/README"
      ]
    },
    {
      "id": "p31",
      "slug": "jsdraw",
      "name": "JSDraw",
      "rank": 104,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://scilligence.com/chemical-vendors/",
        "note": "Scilligence identifies JSDraw as proprietary; third-party chemistry dependencies could not be established."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "Education",
          "level": "free",
          "price": "Free for education (2026-11-06)"
        },
        {
          "name": "Commercial",
          "level": "paid",
          "price": "Contact vendor (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "JSDraw Atom/Bond/Drawer renderer",
        "language": "JavaScript",
        "source": "http://elncloud.com/jsdrawapp/jsdraw/Scilligence.JSDraw2.Pro.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [
          "script tag"
        ],
        "package": null,
        "limit": "Commercial license required; free for education.",
        "how": "Load SDK scripts; JSDraw2.Editor converts an HTML DIV into an editor."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "embeddable",
      "tierReason": "JSDraw is primarily a JavaScript framework for embedding chemical and biological structure editing in other applications.",
      "summary": "A commercial JavaScript SDK for embedding chemical and biological structure editors in web applications.",
      "website": "http://elncloud.com/jsdrawapp/jsdraw/",
      "repo": null,
      "docs": "https://www.scilligence.com/sdk/jsdraw/index.html",
      "vendor": "Scilligence Corporation",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary commercial license; educational use is advertised as free.",
        "source": "http://elncloud.com/jsdrawapp/jsdraw/"
      },
      "price": {
        "text": "Commercial pricing by quotation; free for education (checked 2026-11-05).",
        "source": "http://elncloud.com/jsdrawapp/jsdraw/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": true,
        "android": true,
        "offline": true
      },
      "version": {
        "name": "7.4.0.52930",
        "date": null,
        "source": "http://elncloud.com/jsdrawapp/jsdraw/Scilligence.JSDraw2.Pro.js"
      },
      "engine": {
        "rendering": "SVG; legacy VML fallback documented",
        "chemistry": null,
        "ui": null,
        "source": "http://elncloud.com/jsdrawapp/jsdraw/"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/BONDTYPES.html",
          "note": "Single, double and triple bond types; keyboard bond-order editing.",
          "plan": "Education",
          "planLevel": "free"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/BONDTYPES.html",
          "note": "Wedge, hash and wiggly bond types.",
          "plan": "Education",
          "planLevel": "free"
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/Form.htm",
          "note": "Coordination, ionic and dotted bonds appear in the editor toolbar.",
          "plan": "Education",
          "planLevel": "free"
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/Form.htm",
          "note": "Benzene and three- through eight-membered ring tools.",
          "plan": "Education",
          "planLevel": "free"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/Abbreviation.htm",
          "note": "Ph and COOH are represented as chemical superatom groups.",
          "plan": "Education",
          "planLevel": "free"
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Atom.html",
          "note": "Atom charge, isotope and element labels are documented.",
          "plan": "Education",
          "planLevel": "free"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Atom.html",
          "note": "Atoms have a documented radical property.",
          "plan": "Education",
          "planLevel": "free"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/Abbreviation.htm",
          "note": "Hover over atoms and type element keys or Enter.",
          "plan": "Education",
          "planLevel": "free"
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Drawer.html#___drawArrow",
          "note": "Forward and reversible arrow styles.",
          "plan": "Education",
          "planLevel": "free"
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Mol.html#___getRxnfile",
          "note": "RXN import/export stores reactants and products as molecular structures.",
          "plan": "Education",
          "planLevel": "free"
        },
        "atom-mapping": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/ReactionMap.htm",
          "note": "Manual reactant-to-product atom mapping and mapping removal.",
          "plan": "Education",
          "planLevel": "free"
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/Shapes.htm",
          "note": "Editable rectangle and curve objects in the example drawing.",
          "plan": "Education",
          "planLevel": "free"
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Mol.html#___setColor",
          "note": "Color changes can apply only to selected objects.",
          "plan": "Education",
          "planLevel": "free"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Picture.html",
          "note": "Picture objects accept base64 image contents or an image URL.",
          "plan": "Education",
          "planLevel": "free"
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/TLC.html",
          "note": "Dedicated TLC object.",
          "plan": "Education",
          "planLevel": "free"
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Editor.html#___Editor",
          "note": "Structure errors can be highlighted in red boxes.",
          "engine": {
            "library": "In-house (JSDraw2.Mol.setHCount, JavaScript)",
            "source": "http://elncloud.com/jsdrawapp/jsdraw/Scilligence.JSDraw2.Pro.js"
          },
          "plan": "Education",
          "planLevel": "free"
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Mol.html#___getFormula",
          "note": "Molecular formula, molecular weight and exact mass.",
          "engine": {
            "library": "In-house (JSDraw2.FormulaParser, JavaScript)",
            "source": "http://elncloud.com/jsdrawapp/jsdraw/Scilligence.JSDraw2.Pro.js"
          },
          "plan": "Education",
          "planLevel": "free"
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/N2s.htm",
          "note": "Requires JSDraw Web Services; accepts chemical and trade names.",
          "engine": {
            "library": "JSDraw Web Services (remote server; backend library undisclosed)",
            "source": "http://elncloud.com/jsdrawapp/jsdraw/Scilligence.JSDraw2.Pro.js"
          }
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/RGroup.htm",
          "note": "Editable R-group definitions and alternative substructures.",
          "plan": "Education",
          "planLevel": "free"
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://scilligence.com/regmol-7-4-release-notes/",
          "note": "JSDraw polymer repeats are rendered and exported in Molfile.",
          "plan": "Education",
          "planLevel": "free"
        },
        "biomolecules": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/SequenceEditor.html",
          "note": "Protein, gene, RNA and DNA sequences; FASTA input/output.",
          "plan": "Education",
          "planLevel": "free"
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/",
          "note": "MOL import/export; SDF read/write through JSDraw.Table.",
          "engine": {
            "library": "In-house (JSDraw2.Mol and JSDraw2.Table, JavaScript)",
            "source": "http://elncloud.com/jsdrawapp/jsdraw/Scilligence.JSDraw2.Pro.js"
          },
          "plan": "Education",
          "planLevel": "free"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/N2s.htm",
          "note": "Import requires Web Services; SMILES export is documented in SDK.",
          "engine": {
            "library": "In-house (JavaScript export); JSDraw Web Services (remote server import)",
            "source": "http://elncloud.com/jsdrawapp/jsdraw/Scilligence.JSDraw2.Pro.js"
          },
          "plan": "Education",
          "planLevel": "free"
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Editor.html#___getRxnfile",
          "note": "RXN import/export, including V3000 output.",
          "plan": "Education",
          "planLevel": "free"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Editor.html#___getSvg",
          "note": "getSvg returns vector SVG data.",
          "plan": "Education",
          "planLevel": "free"
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Editor.html",
          "note": "Documented JavaScript API.",
          "plan": "Education",
          "planLevel": "free"
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.scilligence.com/sdk/jsdraw/logical/scilligence/JSDraw2/Editor.html#___Editor",
          "note": "Toolbar plugins provide an icon, tooltip and click callback.",
          "plan": "Education",
          "planLevel": "free"
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "http://elncloud.com/jsdrawapp/jsdraw/",
          "note": "Load SDK scripts; JSDraw2.Editor converts an HTML DIV into an editor.",
          "plan": "Education",
          "planLevel": "free"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Commercial deployment requires a Scilligence license; educational use is advertised as free.",
        "Name and SMILES import require JSDraw Web Services.",
        "Public SDK docs show 7.0.0; the official demo serves 7.4.0.52930."
      ],
      "github": null,
      "hands": {
        "testedVersion": "7.4.0.52930",
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "http://elncloud.com/jsdrawapp/jsdraw/Demo.htm",
        "ran": false,
        "failure": "Chrome blocked the public demo with a secure connection warning; HTTPS certificate hostname does not match.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "The requested route is the public demo.",
          "The served Pro JavaScript file identifies version 7.4.0.52930.",
          "Browser security warning saved as browser-warning.png."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.scilligence.com/sdk/jsdraw/index.html",
        "https://scilligence.com/chemical-vendors/"
      ]
    },
    {
      "id": "p80",
      "slug": "chemcad",
      "name": "ChemCAD",
      "rank": 105,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit",
          "CoordGen",
          "OPSIN"
        ],
        "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/canvas_render.cpp#L443-L465",
        "note": "Custom ImGui canvas; RDKit chemistry, CoordGen layout, OPSIN name parsing."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "ChemCAD bond and label renderer",
        "language": "C++",
        "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/canvas_render.cpp#L222-L366"
      },
      "enginesChecked": true,
      "languageNote": "CMake, PowerShell, Shell and Batchfile only build or install dependencies.",
      "video": null,
      "embedding": {
        "methods": [
          "desktop library"
        ],
        "package": null,
        "limit": "README says an ImGui app can host it, with no steps. C++20 source build.",
        "how": "Link chemcad_ui; call drawCanvas(AppState&) within the host's ImGui frame."
      },
      "otherLanguages": [
        {
          "language": "GLSL",
          "role": "Fluid rendering and compute shaders"
        }
      ],
      "thirdParty": {
        "summary": "Includes Cairo (LGPL-2.1 or MPL-1.1, Windows), OFL-1.1 fonts, and MIT/BSD/zlib libraries; CHEM21 ratings' source article is CC-BY-NC-3.0.",
        "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#license",
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "CoordGen",
            "license": "BSD-3-Clause",
            "source": "https://github.com/schrodinger/coordgenlibs/blob/master/LICENSE"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its standalone 2D editor saves editable molecular projects and exports vector SVG drawings, although figure composition is limited.",
      "summary": "A desktop application for sketching chemical structures, translating names, planning reactions and exploring solvent workflows.",
      "website": "https://github.com/CharlesEdmonds/chem-cad",
      "repo": "https://github.com/CharlesEdmonds/chem-cad",
      "docs": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md",
      "vendor": "Charles Edmonds",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT-licensed; bundled dependencies retain their own licenses.",
        "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/LICENSE"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/CharlesEdmonds/chem-cad/releases"
      },
      "engine": {
        "rendering": "Custom Dear ImGui ImDrawList drawing via OpenGL; RDKit MolDraw2DSVG for SVG; framebuffer capture for PNG",
        "chemistry": "RDKit; OPSIN for name-to-structure parsing",
        "ui": "Dear ImGui docking with GLFW",
        "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/app/main.cpp"
      },
      "languages": [
        "C++",
        "GLSL"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#sketching",
          "note": "Draw, cycle or keyboard-set single, double and triple bonds."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/tool_palette.cpp#L67-L72",
          "note": "Solid wedge, hashed wedge and wavy bonds."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/tool_palette.cpp#L79-L89",
          "note": "Three-to-eight-member rings, benzene, cyclopentadiene and naphthalene."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/canvas_input.cpp#L575-L593",
          "note": "Dragging sets the zig-zag chain length."
        },
        "templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/tool_palette.cpp#L79-L89",
          "note": "Includes a fused naphthalene template."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/canvas_input.cpp#L443-L479",
          "note": "Elements and charges editable; canvas controls do not set isotopes."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#sketching",
          "note": "Keys change hovered elements, bond orders and wedge/hash stereo."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/canvas_input.cpp#L386-L441",
          "note": "Rectangular selection and movement; no lasso, rotation, flip or resize."
        },
        "perspective": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/viewer3d_view.cpp#L224-L246",
          "note": "Flat sketch tilts in preview; editable canvas remains two-dimensional."
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/app/project_io.cpp#L120-L123",
          "note": "Project stores planner starting materials and target as SMILES."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/viewer3d_view.cpp#L704-L747",
          "note": "Interactive orbital preview, rather than placeable drawing objects."
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#sketching",
          "note": "Clean Up Structure recomputes coordinates using CoordGen.",
          "engine": {
            "library": "RDKit (native C++ RDDepict::compute2DCoords with CoordGen preferred)",
            "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/chem/bridge.cpp#L279-L294"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/properties_panel.cpp#L108-L131",
          "note": "RDKit sanitization errors appear in the properties panel.",
          "engine": {
            "library": "RDKit (native C++ MolOps::sanitizeMol and AtomValenceException)",
            "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/chem/bridge.cpp#L181-L201"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#what-it-is",
          "note": "Formula and exact molecular mass computed through RDKit.",
          "engine": {
            "library": "RDKit (native C++ Descriptors::calcMolFormula and calcExactMW)",
            "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/chem/bridge.cpp#L330-L345"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#what-it-is",
          "note": "Computes Crippen cLogP through RDKit.",
          "engine": {
            "library": "RDKit (native C++ Descriptors::calcCrippenDescriptors, cLogP)",
            "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/chem/bridge.cpp#L330-L345"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#naming",
          "note": "Local OPSIN with PubChem fallback; results cached.",
          "engine": {
            "library": "OPSIN (optional local Java CLI JAR); PubChem PUG REST (remote server fallback); RDKit (native C++ SMILES parsing/layout)",
            "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/naming/naming.cpp#L309-L331"
          }
        },
        "structure-to-name": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/naming/naming.cpp#L334-L350",
          "note": "PubChem IUPAC lookup only; unmatched structures return not found.",
          "engine": {
            "library": "PubChem PUG REST (remote server, SMILES-to-IUPACName lookup)",
            "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/naming/naming.cpp#L293-L305"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#naming",
          "note": "Fetches structures from PubChem when resolving chemical names.",
          "engine": {
            "library": "PubChem PUG REST (remote server, name-to-SMILES lookup through C++ libcurl)",
            "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/naming/naming.cpp#L269-L290"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/viewer3d_view.cpp#L638-L701",
          "note": "Rotatable structure preview; omitted from README interface table.",
          "engine": {
            "library": "In-house (C++ ImDrawList rotatable molecule viewer); RDKit (native C++ ETKDGv3 embedding and MMFF94 optimization)",
            "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/viewer3d_view.cpp#L330-L438"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/app/main.cpp#L229-L248",
          "note": "MOL read/write; SDF import uses a single MolBlock parser.",
          "engine": {
            "library": "RDKit (native C++ MolBlockToMol/MolToMolBlock, MOL import/export; no SDF writer)",
            "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/chem/bridge.cpp#L256-L276"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#sketching",
          "note": "Canonical SMILES copy and editable structure paste.",
          "engine": {
            "library": "RDKit (native C++ SmilesToMol parser and MolToSmiles writer)",
            "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/chem/bridge.cpp#L219-L253"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/app/main.cpp#L221-L227",
          "note": "RDKit vector export; omitted from README I/O summary."
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/app/main.cpp#L745-L756",
          "note": "Captures display pixels; no independent print-resolution rendering."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#adding-reactions",
          "note": "Data-only extension mechanism: add reaction templates as JSON."
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/README.md#L29-L50",
          "note": "README says an ImGui app can host it, with no steps. C++20 source build."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/reaction_planner.cpp",
          "note": "Optional API-key route planner; proposed products can enter editable canvas."
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/CharlesEdmonds/chem-cad/blob/ead4420a62fdc34a9b17f0b47d51f66e8a65c90d/src/ui/canvas_render.cpp#L329-L380",
          "note": "Selection rings only; PNG captures them, SVG omits them."
        }
      },
      "caveats": [
        "No tagged releases or prebuilt installers; documented builds target Linux and Windows.",
        "Documents store molecules, without a general figure or page composition model.",
        "PNG captures the screen canvas; SVG uses a separate RDKit depiction."
      ],
      "github": {
        "url": "https://github.com/CharlesEdmonds/chem-cad",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-08-05",
        "commits": 56,
        "contributors": 1,
        "pushedAt": "2026-08-25T17:45:51Z",
        "archived": false
      },
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://codeload.github.com/CharlesEdmonds/chem-cad/tar.gz/refs/heads/main",
        "ran": false,
        "failure": "Unmodified source build failed: src/app/screenshot.cpp:18:10: fatal error: 'GL/gl.h' file not found. macOS SDK provides OpenGL/gl.h. See build.log.",
        "downloadBytes": 1942432,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "No application executable was produced; molecule and feature checks were not performed.",
          "Source commit: ead4420a62fdc34a9b17f0b47d51f66e8a65c90d.",
          "The project declares 0.1.0; no running application version could be checked.",
          "All 196 source files match the downloaded archive."
        ]
      },
      "perf": null,
      "downloadBytes": 1942432,
      "references": [
        "https://github.com/CharlesEdmonds/chem-cad"
      ]
    },
    {
      "id": "p130",
      "slug": "moleculesketch",
      "name": "MoleculeSketch",
      "rank": 106,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://www.chimia.ch/chimia/article/download/2023_655/6313#page=3",
        "note": "Developer describes creating native drawing software and file format; dependencies remain undisclosed."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "MoleculeSketch iP",
          "level": "free",
          "price": "Free basic version (2026-11-06)"
        },
        {
          "name": "Full version",
          "level": "paid",
          "price": "US$1.99 once, iPad unlock (2026-11-06)"
        },
        {
          "name": "MoleculeSketch M",
          "level": "paid",
          "price": "US$2.99 once, macOS (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "original",
        "name": "MoleculeSketch drawing routines",
        "language": null,
        "source": "https://moleculesketch.stefandolder.ch/comments/comments-2/#comment-327"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "PDF copying exports graphics; no working editor embedding confirmed."
      },
      "otherLanguages": [
        {
          "language": "Objective-C",
          "role": "Native application code"
        },
        {
          "language": "Swift",
          "role": "Application code and SwiftUI interface"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Standalone chemical drawing documents support structures, reactions, annotations and vector PDF/SVG export for publication figures.",
      "summary": "A macOS and iPad app for drawing chemical structures, reaction schemes, and figures.",
      "website": "https://moleculesketch.stefandolder.ch/",
      "repo": null,
      "docs": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/MoleculeSketchHelp.html",
      "vendor": "Stefan Dolder",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Paid Mac app; free basic iPad edition with a paid Full version unlock.",
        "source": "https://apps.apple.com/us/app/moleculesketch-ip/id1281284737"
      },
      "price": {
        "text": "US$2.99 for macOS (2026-11-05).",
        "source": "https://apps.apple.com/us/app/moleculesketch-m/id942173210?mt=12"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": false,
        "web": false,
        "ios": true,
        "android": false,
        "offline": false
      },
      "version": {
        "name": "2.9.6",
        "date": "2026-11-03",
        "source": "https://itunes.apple.com/lookup?id=942173210&country=us"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [
        "Objective-C",
        "Swift"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/bond_editing.html",
          "note": "Click bonds to cycle single, double and triple orders.",
          "plan": "MoleculeSketch iP",
          "planLevel": "free"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/toolbar.html",
          "note": "Solid wedges, hashed wedges and wavy bonds.",
          "plan": "MoleculeSketch iP",
          "planLevel": "free"
        },
        "special-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/drawing_atoms_bonds.html",
          "note": "Dative and higher-hapticity bonds; dashed lines represent hydrogen bonds.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/bond_editing.html",
          "note": "Centered, above and below double-bond styles.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/toolbar.html",
          "note": "Three- through nine-membered rings and aromatic systems.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/toolbar.html",
          "note": "Cyclohexane and glucose chair templates.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/drawing_chains.html",
          "note": "Drag to lengthen carbon chains.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/toolbar.html",
          "note": "Amino acids, glucose, porphyrin and other ring systems.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/atom_editing.html",
          "note": "Ph, Boc, OMe and other abbreviations expand into structures.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/moleculesketch-m/id942173210?mt=12",
          "note": "Editable labels and charges; D/T isotope labels are supported.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/atom_editing.html",
          "note": "Lone pairs can be positioned automatically or manually.",
          "plan": "MoleculeSketch iP",
          "planLevel": "free"
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/moleculesketch-m/id942173210?mt=12",
          "note": "Hover over atoms and type to change their symbols.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/toolbar.html",
          "note": "Freehand selection plus rotation, mirroring and scaling.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/toolbar.html",
          "note": "Forward, equilibrium, retrosynthesis and double-headed arrows.",
          "plan": "MoleculeSketch iP",
          "planLevel": "free"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/reactionarrows.html",
          "note": "Control points edit curvature, length and full/half arrowheads.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/toolbar.html",
          "note": "Chemical symbols include charges, radical dots and electron pairs.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/text.html",
          "note": "System fonts, superscripts and subscripts in free text.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/toolbar.html",
          "note": "Editable circles, arcs, lines, Bezier curves and brackets.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/arrange.html",
          "note": "Edge and center alignment; iPad arrangement requires paid Full version.",
          "plan": "Full version",
          "planLevel": "paid"
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/grouping.html",
          "note": "Nested groups; iPad grouping requires paid Full version.",
          "plan": "Full version",
          "planLevel": "paid"
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/preferences.html",
          "note": "Custom default attributes for atoms, bonds, text and drawings.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/bond_editing.html",
          "note": "Individual bonds have editable color attributes.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/drawing_atoms_bonds.html",
          "note": "Warns when bond counts exceed atom valence.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/mass_formula_calculation.html",
          "note": "Formula and average mass; iPad requires paid Full version.",
          "plan": "Full version",
          "planLevel": "paid"
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/comments/comments-2/#comment-447",
          "note": "MOL/SDF import supported; developer reported no export in September 2023.",
          "plan": "Full version",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/moleculesketch-m/id942173210?mt=12",
          "note": "SVG export added in version 2.8.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://moleculesketch.stefandolder.ch/comments/comments-2/#comment-391",
          "note": "Mac PDF export preserves vector quality.",
          "plan": "MoleculeSketch M",
          "planLevel": "paid"
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://moleculesketch.stefandolder.ch/manual/version_2_4/en/pgs/copypaste.html",
          "note": "PDF copying exports graphics; no working editor embedding confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Requires macOS 12.0+ or iPadOS 17.0+.",
        "Developer reported no MOL, SDF or CDX export in September 2023.",
        "iPad formula/mass, grouping, arrangement and MOL/SDF import require the paid Full version."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": 24486651,
      "references": [
        "https://moleculesketch.stefandolder.ch/",
        "https://apps.apple.com/us/app/moleculesketch-m/id942173210?mt=12"
      ]
    },
    {
      "id": "p126",
      "slug": "fx-chemstruct",
      "name": "FX ChemStruct / FX Draw Chemical Structures",
      "rank": 107,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Vendor documentation does not establish canvas provenance or chemistry libraries."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "FX Science Tools",
          "level": "paid",
          "price": "Regional subscription quote (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=xVOaL5n3I1k",
        "embed": "https://www.youtube-nocookie.com/embed/xVOaL5n3I1k",
        "title": "FX ChemStruct   Overview",
        "author": "Efofex Training",
        "linkedFrom": "https://www.efofex.com/fxchemstruct.php",
        "poster": "https://i.ytimg.com/vi/xVOaL5n3I1k/hqdefault.jpg"
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "OLE objects launch separate editor; in-place embedding unconfirmed."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "FX Draw combines editable chemical structures, text and layout tools with vector SVG output for publication-quality 2D figures.",
      "summary": "Desktop software for creating 2D chemical structure diagrams from typed formulas, now integrated into FX Draw.",
      "website": "https://www.efofex.com/fxchemstruct.php",
      "repo": null,
      "docs": "https://www.efofex.com/documentation/chemical_structures.htm",
      "vendor": "Efofex Pty Ltd",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary subscription software; evaluation drawings are watermarked.",
        "source": "https://www.efofex.com/documentation/generalconditions_2.htm"
      },
      "price": {
        "text": "Paid subscription; quote via regional calculator (2026-11-05).",
        "source": "https://www.efofex.com/ns2.php"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "V26.10.25",
        "date": "2026-10-25",
        "source": "https://www.efofex.com/FXTVerInfo.php"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": "Qt",
        "source": "https://www.efofex.com/FXTVerInfo.php"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/basicstructures.htm",
          "note": "Bond orders generated from typed formulas; direct bond editing unverified.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/toolsoptions.htm",
          "note": "Coordinate bonds supported; another specialist bond type unverified.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/ringstructures.htm",
          "note": "Typed ring notation; automatic recognition and supported rings are limited.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/basicstructures.htm",
          "note": "Chains generated from typed formulas; dragging chains is unverified.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/howdoisavemyowngraphics.htm",
          "note": "FX Draw saves selected drawings to reusable galleries.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/benzenerings.htm",
          "note": "Recognizes bz and optional ph as benzene-ring codes.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/overridingcharges.htm",
          "note": "Charges supported; isotope and arbitrary atom labels unverified.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/allowingforunbondedelectron.htm",
          "note": "Displays lone pairs on atoms.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/selecting_figures.htm",
          "note": "Rectangle/Ctrl selection and transforms; lasso selection unverified.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/arrowsequations.htm",
          "note": "Forward and double arrows, with labels above and below.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/smooth_lines.htm",
          "note": "FX Draw provides editable Bezier curves with arrowheads.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/text_equation_boxes.htm",
          "note": "FX Draw text boxes combine formatted text, superscripts and subscripts.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/smooth_lines.htm",
          "note": "FX Draw provides editable shapes and Bezier/freehand curves.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/groupingandungrouping.htm",
          "note": "FX Draw groups can be moved and resized together.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/toolsoptions.htm",
          "note": "Saves bond defaults; separate default font settings are available.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/the_toolbars.htm",
          "note": "FX Draw supports individual object line and fill colors.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/bitmaptool.htm",
          "note": "FX Draw places imported bitmaps on the canvas.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "tlc-tables": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/tables.htm",
          "note": "FX Draw offers editable tables.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/rr.htm",
          "note": "Supports R and R-prime groups in structures.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/use_svg_output.htm",
          "note": "Exports vector SVG graphics.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/create_higher_resolution_graph.htm",
          "note": "PNG output at 360 dpi; optional 600 dpi.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/classic_mode.htm",
          "note": "Word for Windows OLE; Classic Edition is deprecated.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://www.efofex.com/documentation/classic_mode.htm",
          "note": "OLE objects launch separate editor; in-place embedding unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.efofex.com/documentation/classic_mode.htm",
          "note": "OLE double-click editing documented for Windows Word in Classic Edition.",
          "plan": "FX Science Tools",
          "planLevel": "paid"
        }
      },
      "caveats": [
        "Standalone FX ChemStruct is deprecated; chemical drawing is now integrated into FX Draw.",
        "Designed for secondary-school diagrams; ring handling is limited.",
        "Current PowerPoint integration documentation and FX Draw release notes disagree."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.efofex.com/fxchemstruct.php",
        "https://www.efofex.com/documentation/chemical_structures.htm"
      ]
    },
    {
      "id": "p92",
      "slug": "chemistry-4-d-draw",
      "name": "Chemistry 4-D Draw",
      "rank": 108,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Vendor documentation does not establish canvas provenance or third-party chemistry libraries."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "Chemistry 4-D Draw Lite",
          "level": "paid",
          "price": "US$149; education/government $89; student $49 (2026-11-06)"
        },
        {
          "name": "Chemistry 4-D Draw Std",
          "level": "paid",
          "price": "US$299; education/government $189; student $89 (2026-11-06)"
        },
        {
          "name": "Chemistry 4-D Draw Pro",
          "level": "paid",
          "price": "US$499; education/government $299; student $149 (2026-11-06)"
        },
        {
          "name": "Chemistry 4-D Draw Office",
          "level": "paid",
          "price": "US$699; education/government $399; student $199 (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "OLE reopens desktop app; supported in-host editor embedding unconfirmed."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "It is a standalone 2D structure and graphics editor with publication figures, multipage documents and chemical nomenclature tools.",
      "summary": "Desktop software for drawing chemical structures, preparing publication figures, and converting between structures and IUPAC names.",
      "website": "https://www.cheminnovation.com/products/chem4d.asp",
      "repo": null,
      "docs": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
      "vendor": "ChemInnovation Software, Inc.",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Paid desktop licenses in Lite, Std, Pro and Office editions.",
        "source": "https://www.cheminnovation.com/order/pricing.asp"
      },
      "price": {
        "text": "Vendor lists Lite US$149, Std US$299, Pro US$499, Office US$699; discounts available (checked 2026-11-05).",
        "source": "https://www.cheminnovation.com/order/pricing.asp"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "9.0",
        "date": null,
        "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html"
      },
      "engine": {
        "rendering": null,
        "chemistry": "NamExpert (name interpretation) and Nomenclator (IUPAC naming)",
        "ui": null,
        "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/images/screenshot_chem4dd.gif",
          "note": "Official screenshot shows single, double and triple bond tools."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/images/screenshot_chem4dd.gif",
          "note": "Official screenshot shows solid wedge, hashed wedge and wavy tools."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/images/screenshot_chem4dd.gif",
          "note": "Official screenshot shows common ring and aromatic ring tools."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
          "note": "Vendor claim: save structures with reusable user-defined names."
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
          "note": "Vendor claim: expand or condense COOH and NO2 groups."
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
          "note": "Charges and element labels documented; isotope controls unverified."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/products/chem4d.asp",
          "note": "Vendor claim: hot-key labeling; pointer-based operation undocumented."
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/products/chem4d.asp",
          "note": "Linked screenshot shows lasso; rotation, scaling and flipping documented."
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/products/chem4d.asp",
          "note": "Vendor claim: interactive 3D rotation of drawings."
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/products/chem4d.asp",
          "note": "Vendor claim: font control; subscript/superscript formatting undocumented."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/images/screenshot_chem4dd.gif",
          "note": "Official screenshot shows ellipse, rectangle and bracket tools."
        },
        "align": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/products/chem4d.asp",
          "note": "Vendor claim: object alignment."
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
          "note": "Vendor claim: Clean Up automatically tidies distorted structures."
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/images/screenshot_chem4dd.gif",
          "note": "Official screenshot shows differently colored text objects."
        },
        "pages": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/images/screenshot_chem4dd.gif",
          "note": "Multipage document shown; page-size controls unverified."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
          "note": "Vendor claim: R/S all editions; E/Z naming Pro/Office.",
          "engine": {
            "library": "In-house (Nomenclator desktop module)",
            "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
          "note": "Pro/Office: molecular formula, exact mass and formula mass.",
          "plan": "Chemistry 4-D Draw Pro",
          "planLevel": "paid"
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/products/nameexpert.asp",
          "note": "Std/Pro/Office; NamExpert converts IUPAC names into structures.",
          "engine": {
            "library": "In-house (NamExpert desktop module)",
            "source": "https://www.cheminnovation.com/products/nameexpert.asp"
          },
          "plan": "Chemistry 4-D Draw Std",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.cheminnovation.com/products/nomenclature.asp",
          "note": "Pro/Office; Nomenclator assigns systematic IUPAC names.",
          "engine": {
            "library": "In-house (Nomenclator desktop module)",
            "source": "https://www.cheminnovation.com/products/nomenclature.asp"
          },
          "plan": "Chemistry 4-D Draw Pro",
          "planLevel": "paid"
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
          "note": "Professional: MOL read/write; general Draw SDF support unverified."
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
          "note": "Vendor claim: Windows Word OLE objects reopen for editing."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
          "note": "OLE reopens desktop app; supported in-host editor embedding unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ddmcorp.com/goods/struct/4ddraw.html",
          "note": "Windows OLE-2 embeds structures in Word with double-click editing."
        }
      },
      "caveats": [
        "Both advertised Windows demo links returned HTTP 404 on 2026-11-05; current download availability is unverified.",
        "The authorized distributor lists Windows 9.0; the vendor homepage still advertises 8.0.",
        "Mac support is documented for OS X; compatibility with current macOS and Apple Silicon is unverified."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.cheminnovation.com/products/chem4d.asp"
      ]
    },
    {
      "id": "p17",
      "slug": "chemstitch",
      "name": "ChemStitch",
      "rank": 109,
      "builtOn": {
        "relation": "wrapper",
        "editor": "Ketcher",
        "libraries": [
          "RDKit",
          "OPSIN"
        ],
        "source": "https://www.chemstitch.ai/compare",
        "note": "Ketcher canvas; vendor documents RDKit computations and an OPSIN backend."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "Free Tools",
          "level": "free",
          "price": "$0; standalone utilities, no sign-up (2026-11-06)"
        },
        {
          "name": "Free",
          "level": "account",
          "price": "$0; drawing and computations (2026-11-06)"
        },
        {
          "name": "Student",
          "level": "account",
          "price": "$0; verified students (2026-11-06)"
        },
        {
          "name": "Standard",
          "level": "paid",
          "price": "US$19/month or $190/year; academic $9/month (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher SVG/Raphaël renderer",
        "language": "TypeScript",
        "source": "https://www.chemstitch.ai/compare"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "X-Frame-Options DENY",
        "how": "Hosted app blocks framing; no supported editor embedding package documented."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "Remote FastAPI chemistry backend"
        },
        {
          "language": "C++",
          "role": "RDKit chemistry backend"
        },
        {
          "language": "JavaScript",
          "role": "Raphaël SVG graphics"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": [
          {
            "name": "Ketcher",
            "license": "Apache-2.0",
            "source": "https://github.com/epam/ketcher/blob/master/LICENSE"
          },
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "OPSIN",
            "license": "MIT",
            "source": "https://github.com/dan2097/opsin/blob/master/LICENSE.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its standalone editor produces publication figures with ACS presets, vector SVG, high-resolution PNG, and structured reaction documents.",
      "summary": "A browser-based chemical drawing editor for publication figures, property calculations, and AI-assisted structure and reaction analysis.",
      "website": "https://www.chemstitch.ai/",
      "repo": null,
      "docs": "https://www.chemstitch.ai/docs",
      "vendor": "ChemStitch",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary hosted service with free drawing and computations; AI uses subscription or student plans.",
        "source": "https://www.chemstitch.ai/terms"
      },
      "price": {
        "text": "Free drawing; AI US$19/month or US$190/year; verified students free (2026-11-05).",
        "source": "https://www.chemstitch.ai/terms"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://www.chemstitch.ai/"
      },
      "engine": {
        "rendering": null,
        "chemistry": "RDKit",
        "ui": "Ketcher structure editor",
        "source": "https://www.chemstitch.ai/"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/structure-drawing",
          "note": null,
          "plan": "Free",
          "planLevel": "account"
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/structure-drawing",
          "note": "Ring templates include benzene; rings can be fused.",
          "plan": "Free",
          "planLevel": "account"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/structure-drawing",
          "note": "Functional groups and common molecules, including aspirin and caffeine.",
          "plan": "Free",
          "planLevel": "account"
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/reaction-mode",
          "note": "RXN stores explicit reactant and product assignments.",
          "plan": "Free",
          "planLevel": "account"
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/structure-drawing",
          "note": "Clean command adjusts angles, spacing, and ring geometry.",
          "plan": "Free Tools",
          "planLevel": "free"
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/publication-export",
          "note": "ACS Document 1996 preset.",
          "plan": "Free",
          "planLevel": "account"
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/structure-drawing",
          "note": "Invalid atom labels and valence errors are flagged.",
          "plan": "Free",
          "planLevel": "account"
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/ai-chat",
          "note": "RDKit computes logP and TPSA; calculations remain free.",
          "engine": {
            "library": "RDKit (remote FastAPI chemistry server)",
            "source": "https://www.chemstitch.ai/security"
          },
          "plan": "Free Tools",
          "planLevel": "free"
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/ai-chat",
          "note": "Requires Standard or verified Student after trial.",
          "engine": {
            "library": "PubChem web service (name lookup followed by Load to Canvas)",
            "source": "https://www.chemstitch.ai/docs/pubchem-integration"
          },
          "plan": "Student",
          "planLevel": "account"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/ai-chat",
          "note": "Requires Standard or verified Student after trial.",
          "plan": "Student",
          "planLevel": "account"
        },
        "nmr-prediction": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/compare",
          "note": "No NMR spectrum simulation."
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/structure-ocr",
          "note": "AI extraction; requires Standard or verified Student after trial.",
          "engine": {
            "library": "OpenAI vision API (remote server); RDKit backend validation of extracted SMILES",
            "source": "https://www.chemstitch.ai/subprocessors"
          },
          "plan": "Student",
          "planLevel": "account"
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/pubchem-integration",
          "note": "PubChem via AI; Standard or verified Student after trial.",
          "engine": {
            "library": "PubChem web service (compound lookup and similarity search)",
            "source": "https://www.chemstitch.ai/docs/pubchem-integration"
          },
          "plan": "Student",
          "planLevel": "account"
        },
        "model-3d": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/",
          "note": "Explicitly limited to 2D drawing and analysis."
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/file-formats",
          "note": "Import only; CDXML export is explicitly unsupported.",
          "plan": "Free",
          "planLevel": "account"
        },
        "cdx": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/guides/import-from-chemdraw",
          "note": "Binary CDX import unsupported; export remains on roadmap."
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/file-formats",
          "note": "MOL V2000/V3000 and SDF import/export documented; pricing lists fewer formats.",
          "plan": "Free Tools",
          "planLevel": "free"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/file-formats",
          "note": "SMILES import and clipboard export.",
          "plan": "Free Tools",
          "planLevel": "free"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/file-formats",
          "note": "InChI import and clipboard export.",
          "plan": "Free Tools",
          "planLevel": "free"
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/reaction-mode",
          "note": "MDL RXN import and export in reaction mode.",
          "plan": "Free",
          "planLevel": "account"
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/publication-export",
          "note": "Resolution-independent vector SVG.",
          "plan": "Free Tools",
          "planLevel": "free"
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/publication-export",
          "note": "300, 450, or 600 DPI.",
          "plan": "Free",
          "planLevel": "account"
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://app.chemstitch.ai/",
          "note": "Hosted app blocks framing; no supported editor embedding package documented."
        },
        "ai-assistant": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemstitch.ai/docs/ai-chat",
          "note": "Generates structures; Standard or verified Student after trial.",
          "plan": "Student",
          "planLevel": "account"
        }
      },
      "caveats": [
        "Main editor requires an account, internet access, and a desktop browser.",
        "CDXML is import-only; binary CDX import is unsupported.",
        "Pricing lists fewer export formats than the file-format manual."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://app.chemstitch.ai/",
        "ran": false,
        "failure": "The editor redirected to an email sign-in page; an account is required.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "The sign-in page offers an email link and a 14-day trial.",
          "No version was displayed on the sign-in page."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.chemstitch.ai/"
      ]
    },
    {
      "id": "p138",
      "slug": "bonddraw",
      "name": "BondDraw",
      "rank": 110,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#L589-L593",
        "note": "ArkTS canvas reimplementation; JChemPaint serves only as a design reference."
      },
      "appKind": {
        "desktop": false,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "JChemPaint-inspired ArkUI Canvas renderer",
        "language": "ArkTS",
        "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/model/Renderer.ets#L56"
      },
      "enginesChecked": true,
      "languageNote": "TypeScript files configure builds.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "License conflict: manifest LGPL-2.1-or-later, documentation Apache-2.0.",
        "how": "Standalone HarmonyOS application; no supported editor embedding interface found."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "Chemistry algorithms and file formats"
        }
      ],
      "thirdParty": {
        "summary": "No third-party runtime dependencies declared.",
        "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/oh-package.json5",
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "A standalone native editor draws editable 2D molecular structures and reaction figures, with limited export and layout.",
      "summary": "A native HarmonyOS editor for drawing two-dimensional molecular structures and reaction diagrams.",
      "website": "https://gitcode.com/weixin_52908342/ohos_JChemPaint",
      "repo": "https://gitcode.com/weixin_52908342/ohos_JChemPaint",
      "docs": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md",
      "vendor": "weixin_52908342 (Everlasting)",
      "license": {
        "kind": "unclear",
        "spdx": null,
        "text": "Package manifest says LGPL-2.1-or-later; compliance README says Apache-2.0; referenced LICENSE is missing.",
        "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/oh-package.json5"
      },
      "price": {
        "text": "Not published",
        "source": null
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/releases"
      },
      "engine": {
        "rendering": "ArkUI CanvasRenderingContext2D; PNG export captures the canvas",
        "chemistry": "In-house C++ engine (libjcp_engine.so)",
        "ui": "ArkUI (ArkTS)",
        "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84"
      },
      "languages": [
        "ArkTS",
        "C++"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E7%BB%93%E6%9E%84%E7%BB%98%E5%88%B6",
          "note": null
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E7%BB%93%E6%9E%84%E7%BB%98%E5%88%B6",
          "note": null
        },
        "special-bonds": {
          "status": "no",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/pages/EditorController.ets#L46",
          "note": "No dative/hydrogen tools; README's quadruple tool absent from UI."
        },
        "double-bond-side": {
          "status": "no",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/model/Renderer.ets#L403",
          "note": "Offsets follow E/Z flags; no independent double-bond side control."
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E7%BB%93%E6%9E%84%E7%BB%98%E5%88%B6",
          "note": null
        },
        "conformers": {
          "status": "no",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/model/Templates.ets",
          "note": "No chair/Haworth templates; rings use regular polygons or SMILES layouts."
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E7%BB%93%E6%9E%84%E7%BB%98%E5%88%B6",
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E6%A8%A1%E6%9D%BF%E5%BA%93",
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E5%8C%96%E5%AD%A6%E6%A0%87%E6%B3%A8",
          "note": null
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E5%8C%96%E5%AD%A6%E6%A0%87%E6%B3%A8",
          "note": "Radical dots can be added to atoms."
        },
        "keyboard-drawing": {
          "status": "no",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/pages/Index.ets#L328",
          "note": "Keys switch tools; they do not edit the hovered atom/bond."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/pages/EditorController.ets#L381",
          "note": "Lasso, rotation and flips; zoom changes viewport, without object resizing."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E5%8F%8D%E5%BA%94%E5%BC%8F%E7%BB%98%E5%88%B6",
          "note": "Forward, equilibrium and reverse arrows."
        },
        "mechanism-arrows": {
          "status": "no",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/model/Renderer.ets#L510",
          "note": "Arrow renderer supports straight reaction arrows, without editable curves."
        },
        "reaction-data": {
          "status": "no",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/model/ChemModel.ets#L51",
          "note": "Arrows store geometry only; no reactant/product roles."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E8%A7%86%E5%9B%BE%E4%B8%8E%E6%8E%92%E7%89%88",
          "note": "Dense spiro/bridged systems may overlap.",
          "engine": {
            "library": "In-house (C++ libjcp_engine.so via N-API)",
            "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/cpp/cleanup_layout.cpp#L10"
          }
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "no",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E6%B8%B2%E6%9F%93%E5%8F%82%E6%95%B0",
          "note": "Bond geometry and font size are fixed constants."
        },
        "color": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/pages/Index.ets#L381",
          "note": "Global CPK, monochrome and pastel schemes; no individual object colors."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "no",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/pages/EditorController.ets#L539",
          "note": "E/Z labels are manually assigned; no computed stereodescriptors."
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/cpp/engine_stats.cpp#L83",
          "note": "Counts explicit atoms only; implicit hydrogens and isotope masses omitted.",
          "engine": {
            "library": "In-house (C++ libjcp_engine.so; explicit atoms only)",
            "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/cpp/engine_stats.cpp#L74"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E5%8C%96%E5%AD%A6%E6%A0%87%E6%B3%A8",
          "note": "Numbered R-group attachment labels."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "no",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E9%9A%90%E7%A7%81%E4%B8%8E%E5%AE%89%E5%85%A8",
          "note": "Application has no network permission and cannot query online databases."
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/pages/EditorController.ets#L838",
          "note": "MOL read/write; SDF import only, despite About-page save claim.",
          "engine": {
            "library": "In-house (C++ libjcp_engine.so; V2000 MOL and SDF import)",
            "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/cpp/mdl_io.cpp#L27"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E5%BD%93%E5%89%8D%E9%99%90%E5%88%B6",
          "note": "Subset reads/writes; @/@@ unsupported and exported stereochemistry omitted.",
          "engine": {
            "library": "In-house (C++ libjcp_engine.so via N-API; SMILES subset)",
            "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/model/SmilesIO.ets#L37"
          }
        },
        "inchi": {
          "status": "no",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.OpenHarmony_CN.md#%E5%B7%B2%E7%9F%A5%E9%99%90%E5%88%B6",
          "note": "Simplified formula/connectivity hash is not standard InChI."
        },
        "rxn": {
          "status": "no",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E5%BD%93%E5%89%8D%E9%99%90%E5%88%B6",
          "note": "RXN reaction files explicitly unsupported."
        },
        "svg-export": {
          "status": "no",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E5%90%8E%E7%BB%AD%E6%96%B9%E5%90%91",
          "note": "Listed as future work; current image export is PNG."
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "partial",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/pages/Index.ets#L429",
          "note": "Canvas snapshot only; no print-resolution or DPI control."
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "source",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/pages/EditorController.ets#L657",
          "note": "Copy/paste uses an instance string, contrary to README's cross-tool claim."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "no",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/README.md#%E9%9A%90%E7%A7%81%E4%B8%8E%E5%AE%89%E5%85%A8",
          "note": "Documentation explicitly states no plugin mechanism."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint",
          "note": "Standalone HarmonyOS application; no supported editor embedding interface found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://gitcode.com/weixin_52908342/ohos_JChemPaint/blob/9f881281a7cf5d3b02a0b3aec22757b3a8b097ff/entry/src/main/ets/model/Renderer.ets#L85",
          "note": "Selection and hover halos only; no dedicated highlight annotations."
        }
      },
      "caveats": [
        "HarmonyOS 6.0.1 PC/tablet only; source builds require DevEco Studio and signing.",
        "Formula/mass omit implicit hydrogens; SMILES import/export omits stereochemistry.",
        "PNG uses canvas resolution; clipboard exchange stays inside one editor instance."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://gitcode.com/weixin_52908342/ohos_JChemPaint",
        "https://gitcode.com/weixin_52908342/ohos_JChemPaint",
        "https://raw.gitcode.com/weixin_52908342/ohos_JChemPaint/raw/main/README.md"
      ]
    },
    {
      "id": "p91",
      "slug": "chemgraphic-2",
      "name": "ChemGraphic 2",
      "rank": 111,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "xtb"
        ],
        "source": "https://simpleappli.com/product_chemgraphic2",
        "note": "xtb performs IR prediction; drawing canvas provenance remains undisclosed."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "ChemGraphic 2",
          "level": "paid",
          "price": "2026-11-06: Japan ¥500/month or ¥5,500/year; first month free."
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=cM8LjsoiOqo",
        "embed": "https://www.youtube-nocookie.com/embed/cM8LjsoiOqo",
        "title": "ChemGraphic 2 描いた構造式からNMRを予測。端末をまたいで続きから描ける #研究室",
        "author": "appli simple",
        "linkedFrom": "https://simpleappli.com/product_chemgraphic2",
        "poster": "https://i.ytimg.com/vi/cM8LjsoiOqo/hqdefault.jpg"
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Proprietary subscription; embedding terms undisclosed",
        "how": "No editor SDK or embedding method documented."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": [
          {
            "name": "xtb",
            "license": "LGPL-3.0-or-later",
            "source": "https://github.com/grimme-lab/xtb/blob/main/README.md"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its standalone document canvas, chemical drawing tools, journal styles, and image export support preparing scientific figures.",
      "summary": "A chemical structure editor for preparing scientific figures and predicting IR and NMR spectra.",
      "website": "https://simpleappli.com/product_chemgraphic2",
      "repo": null,
      "docs": "https://simpleappli.com/product_chemgraphic2_howto",
      "vendor": "SimpleAppli Inc.",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary subscription application with an initial free trial.",
        "source": "https://simpleappli.com/en/terms_chemgraphic2_en"
      },
      "price": {
        "text": "2026-11-05: Japan ¥500/month or ¥5,500/year; initial one-month trial.",
        "source": "https://simpleappli.com/product_chemgraphic2"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": true,
        "android": true,
        "offline": false
      },
      "version": {
        "name": "1.0.3",
        "date": "2026-10-28",
        "source": "https://apps.apple.com/au/app/chemgraphic-2-chemistry-app/id6761987765"
      },
      "engine": {
        "rendering": null,
        "chemistry": "xtb for cloud IR prediction; core structure toolkit undisclosed",
        "ui": null,
        "source": "https://simpleappli.com/product_chemgraphic2_howto#spectrum"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#drawing",
          "note": null,
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#drawing",
          "note": null,
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#drawing",
          "note": "Tap a double bond to cycle through three placements.",
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#drawing",
          "note": null,
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#drawing",
          "note": "Includes chair conformations.",
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#spectrum",
          "note": "Pr, Ts and Ac are interpreted as groups during analysis.",
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#drawing",
          "note": null,
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/en/product_chemgraphic2_howto_en",
          "note": "Bracket and freehand drawing tools."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#style",
          "note": "Includes ACS and RSC presets.",
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "custom-styles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#style",
          "note": null,
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#editor",
          "note": null,
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#export",
          "note": "PNG and JPEG images can be imported.",
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#spectrum",
          "note": null,
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#spectrum",
          "note": "Rule-based 1H and 13C predictions run in the cloud.",
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#export",
          "note": "MOL and SDF import and export.",
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://simpleappli.com/en/product_chemgraphic2_en",
          "note": "SMILES import; export formats list omits SMILES."
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://simpleappli.com/product_chemgraphic2_howto#export",
          "note": "InChI import.",
          "plan": "ChemGraphic 2",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://simpleappli.com/product_chemgraphic2",
          "note": "No editor SDK or embedding method documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "An account and network connection are required to open and save files.",
        "Mac support is limited to Apple Silicon; Intel Macs require the separate legacy product.",
        "Files cannot be opened after subscription expiry; accounts and cloud data are deleted after one year."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://simpleappli.com/en/product_chemgraphic2_en"
      ]
    },
    {
      "id": "p125",
      "slug": "easychem",
      "name": "EasyChem",
      "rank": 112,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [],
        "source": "https://sourceforge.net/p/easychem/code/1/tree/drawing.c#l273",
        "note": "Custom bond model and renderer; build files link GTK without third-party chemistry libraries."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "EasyChem bond and label renderer",
        "language": "C",
        "source": "https://sourceforge.net/p/easychem/code/1/tree/drawing.c#l273"
      },
      "enginesChecked": true,
      "languageNote": "PostScript supplies export resources; Makefiles only build the program.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "GPL-2.0-or-later",
        "how": "Standalone GTK editor; no reusable editor API confirmed."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "A standalone 2D chemical drawing editor with text, layout tools and vector export for publication figures.",
      "summary": "A desktop editor for creating 2D chemical structure drawings and publication figures.",
      "website": "https://easychem.sourceforge.net/",
      "repo": "https://sourceforge.net/p/easychem/code/",
      "docs": "https://easychem.sourceforge.net/",
      "vendor": "François-Xavier Coudert",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-2.0-or-later",
        "text": "GNU General Public License version 2 or later.",
        "source": "https://sourceforge.net/p/easychem/code/1/tree/easychem.c#l13"
      },
      "price": {
        "text": "Free",
        "source": "https://sourceforge.net/projects/easychem/files/EasyChem%20gtk%2B/easychem-0.6/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "0.6",
        "date": "2005-05-04",
        "source": "https://sourceforge.net/projects/easychem/files/EasyChem%20gtk%2B/easychem-0.6/"
      },
      "engine": {
        "rendering": "GDK drawing primitives with Pango text; custom EPS/XFig export and Ghostscript PDF conversion",
        "chemistry": null,
        "ui": "GTK+ 2",
        "source": "https://sourceforge.net/p/easychem/code/1/tree/drawing.c#l273"
      },
      "languages": [
        "C"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/dialogs.c#l441",
          "note": "Single, double and triple bonds can be created and edited."
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/drawing.c#l351",
          "note": "Solid and hashed wedges only; no wavy bond type."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "no",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/drawing.c#l314",
          "note": "Double bonds are always drawn centered."
        },
        "rings": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/easychem.c#l1797",
          "note": "Regular rings with 3–10 sides; aromatic bonds require manual editing."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "no",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/TODO#l15",
          "note": "One-step carbon-chain drawing is listed as a future feature."
        },
        "templates": {
          "status": "no",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/TODO#l17",
          "note": "A library of predrawn elements is listed as a future feature."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/dialogs.c#l151",
          "note": "Charges and isotopes drawn as formatted atom-label text."
        },
        "radicals": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/dialogs.c#l803",
          "note": "Radical, lone-electron and lone-pair ornaments attach to atoms or bond ends."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/easychem.c#l1831",
          "note": "Rectangle selection and rotate/flip; lasso remains a planned feature."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/dialogs.c#l506",
          "note": "Straight arrows support full heads at either or both ends."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/dialogs.c#l520",
          "note": "Editable three-point arcs support full or half arrowheads."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://svn.code.sf.net/p/easychem/code/dialogs.c",
          "note": "Chemical symbols menu includes electron pairs, radicals, and vacancies."
        },
        "rich-text": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/dialogs.c#l96",
          "note": "Bold/italic and scripts supported; canvas font family fixed to Serif."
        },
        "shapes": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/bonds.c#l1781",
          "note": "Editable circles and three-point circular arcs."
        },
        "align": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/easychem.c#l779",
          "note": "Selected objects align horizontally and vertically."
        },
        "groups": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/easychem.c#l743",
          "note": "Group and ungroup selected objects."
        },
        "cleanup": {
          "status": "no",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/easychem.c#l2698",
          "note": "Cleanup only removes duplicate objects and empty groups."
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/dialogs.c#l486",
          "note": "Individual bonds and text objects have editable colors."
        },
        "pages": {
          "status": "partial",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/dialogs.c#l938",
          "note": "Drawing width and height configurable; no multipage document model."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/export.c#l2004",
          "note": "Vector EPS converted through Ghostscript; Unix builds only."
        },
        "png-export": {
          "status": "no",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/TODO#l13",
          "note": "PNG export is listed as a future feature."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "no",
          "evidence": "source",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/easychem.c#l3158",
          "note": "Command line opens files in GUI; no headless conversion."
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://sourceforge.net/p/easychem/code/HEAD/tree/",
          "note": "Standalone GTK editor; no reusable editor API confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://sourceforge.net/p/easychem/code/1/tree/bonds.c#l2630",
          "note": "Raw Pango markup enables atom-label backgrounds; EPS export loses highlighting."
        }
      },
      "caveats": [
        "Released 0.6 dates to 2005; the Mac build requires X11.",
        "SourceForge lists Cocoa, but released 0.6 uses GTK+ 2.",
        "Advertised LaTeX support means export fonts; PDF requires Ghostscript on Unix."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "https://sourceforge.net/projects/easychem/files/EasyChem%20gtk%2B/EasyChem%200.6%20for%20MacOS/EasyChem-0.6.dmg/download",
        "ran": false,
        "failure": "The official Mac DMG contains a PowerPC-only Mach-O executable (ppc), incompatible with this arm64 Mac. open -n failed with Launch Services error -10665; direct --version failed with bad CPU type in executable (exit 127). Computer-use could not attach to the app. No drawing window opened.",
        "downloadBytes": 1944953,
        "installedBytes": 4382720,
        "captures": [],
        "observations": [
          "DMG filename identifies 0.6; bundle CFBundleVersion is pre-0.6.",
          "Running-app version could not be verified.",
          "Molecule imports and feature checks were not attempted because launch failed."
        ]
      },
      "perf": null,
      "downloadBytes": 1944953,
      "references": [
        "https://easychem.sourceforge.net/",
        "https://sourceforge.net/projects/easychem/"
      ]
    },
    {
      "id": "p131",
      "slug": "molsketchgo",
      "name": "MolSketchGo",
      "rank": 113,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Vendor documentation identifies external data services but does not establish editor provenance or libraries."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "Free",
          "level": "free",
          "price": "Free with banner ads (2026-11-06)"
        },
        {
          "name": "MolSketchGo Pro",
          "level": "paid",
          "price": "US$1.99/month or US$11.99/year (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Personal, non-commercial use unless separately agreed in writing",
        "how": "Mobile app; no supported embedding route located."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "It is a standalone 2D chemical drawing editor with vector SVG export for structure figures.",
      "summary": "Mobile app for sketching 2D molecular structures, exporting drawings, and viewing molecules in 3D.",
      "website": "https://app.japality.com/molsketch/i/marketing/",
      "repo": null,
      "docs": "https://app.japality.com/molsketch/i/support/",
      "vendor": "Japality Limited",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary, free with ads and optional paid ad removal; iOS licence permits personal, non-commercial use.",
        "source": "https://app.japality.com/molsketch/i/terms_of_service/"
      },
      "price": {
        "text": "Free with ads; iOS Pro US$1.99/month or US$11.99/year (2026-11-05).",
        "source": "https://apps.apple.com/us/app/molsketchgo/id6756492472"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": false,
        "web": false,
        "ios": true,
        "android": true,
        "offline": true
      },
      "version": {
        "name": "0.0.7",
        "date": "2026-07-13",
        "source": "https://apps.apple.com/us/app/molsketchgo/id6756492472"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=com.japality.molsketch&hl=en",
          "note": "Single, double and triple bonds; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/molsketchgo/id6756492472",
          "note": "Wedge and dash documented; wavy unverified; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=com.japality.molsketch&hl=en",
          "note": "Benzene, cyclohexane and cyclopentane; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=com.japality.molsketch&hl=en",
          "note": "Charges/isotopes and palette elements; arbitrary labels unverified; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=com.japality.molsketch&hl=en",
          "note": "Android listing describes force-directed layout; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://app.japality.com/molsketch/i/marketing/",
          "note": "Element colours adjustable; individual atom/bond control unverified; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/molsketchgo/id6756492472",
          "note": "Warns when bonds exceed typical valence; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=com.japality.molsketch&hl=en",
          "note": "Formula, molecular weight and exact mass; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.japality.com/molsketch/i/support/",
          "note": "PubChem name lookup; internet required.",
          "engine": {
            "library": "PubChem web service",
            "source": "https://app.japality.com/molsketch/i/support/"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.japality.com/molsketch/i/support/",
          "note": "IUPAC name export via PubChem; internet required.",
          "engine": {
            "library": "PubChem web service",
            "source": "https://app.japality.com/molsketch/i/privacy_policy/"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.japality.com/molsketch/i/support/",
          "note": "PubChem search by name, CID or SMILES.",
          "engine": {
            "library": "PubChem web service",
            "source": "https://app.japality.com/molsketch/i/privacy_policy/"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.japality.com/molsketch/i/marketing/",
          "note": "Rotatable, zoomable 3D representations; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=com.japality.molsketch&hl=en",
          "note": "MOL and SDF import/export; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=com.japality.molsketch&hl=en",
          "note": "SMILES import/export; vendor claim.",
          "plan": "Free",
          "planLevel": "free"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.japality.com/molsketch/i/support/",
          "note": "InChI export via PubChem; internet required.",
          "engine": {
            "library": "PubChem web service",
            "source": "https://app.japality.com/molsketch/i/privacy_policy/"
          },
          "plan": "Free",
          "planLevel": "free"
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://app.japality.com/molsketch/i/support/",
          "note": null,
          "plan": "Free",
          "planLevel": "free"
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://app.japality.com/molsketch/i/support/",
          "note": "PNG export documented; resolution of 300 dpi unverified.",
          "plan": "Free",
          "planLevel": "free"
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://app.japality.com/molsketch/i/terms_of_service/",
          "note": "Mobile app; no supported embedding route located."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "iOS terms restrict use to personal, non-commercial purposes without separate agreement.",
        "PubChem lookup, IUPAC names and InChI export require internet.",
        "Apple Silicon Mac compatibility is listed but unverified."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://apps.apple.com/us/app/molsketchgo/id6756492472",
        "https://apps.apple.com/us/app/molsketchgo/id6756492472"
      ]
    },
    {
      "id": "p109",
      "slug": "mychemise",
      "name": "MyChemise",
      "rank": 114,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://link.springer.com/article/10.1186/1758-2946-3-53",
        "note": "Author documents a self-developed editor; external chemistry libraries remain unconfirmed."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "MyChemise molecular drawing engine",
        "language": "Java",
        "source": "https://link.springer.com/article/10.1186/1758-2946-3-53"
      },
      "enginesChecked": true,
      "languageNote": "HTML and JavaScript launch the Java applet.",
      "video": null,
      "embedding": {
        "methods": [
          "Java applet"
        ],
        "package": null,
        "limit": "Requires obsolete Java browser plug-in; redistribution license unverified",
        "how": "Embed Chemise.class from ChemJar.jar using the official <applet> example."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Applet launch and resizing"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "The documented editor produces printable 2D chemical drawings with text and shapes, although present-day operation remains unverified.",
      "summary": "A legacy Java applet for drawing 2D chemical structures and creating animated reaction presentations.",
      "website": "https://knalltundstinkt.de/englische%20Version/knalltundstinktE.html",
      "repo": null,
      "docs": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
      "vendor": "Jörg-Hubertus Wilhelm",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free application; specific software licensing terms unverified.",
        "source": "https://pubs.sciepub.com/wjce/4/1/1/"
      },
      "price": {
        "text": "Free",
        "source": "https://pubs.sciepub.com/wjce/4/1/1/"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://pubs.sciepub.com/wjce/4/1/1/"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": "Java applet",
        "source": "https://link.springer.com/article/10.1186/1758-2946-3-53"
      },
      "languages": [
        "Java"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "Bond selectors and manual placement include single, double and triple bonds."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "Wedge, hashed wedge, and wavy choices shown (manual p18)."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "Left, right, and centered double-bond choices shown (manual p18)."
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-3-53",
          "note": "Pull-down tools provide cyclic hydrocarbons and aromatic rings."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "Functional-group presets insert alkyl, phenyl, and carboxyl structures (p17)."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "Saved CSE or MOL structures can be inserted into other drawings."
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "Atom text supports charges, isotope numbers and arbitrary labels."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://knalltundstinkt.de/englischeVersion/kus_Historie.html",
          "note": "Lone electron pairs are drawn automatically."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-3-53/figures/3",
          "note": "Drawing controls offer forward and opposed-arrow line ends."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-3-53/figures/3",
          "note": "Arc shapes and full or half arrowheads are selectable."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-3-53/figures/3",
          "note": "Club and banana shapes represent orbitals."
        },
        "rich-text": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "Multiline text editor; fonts and superscript/subscript text controls."
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "Editable shapes, brackets and freehand drawing."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "Atom text and bond colors can be set separately."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "Clipboard images and background pictures can be placed on the canvas."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-3-53",
          "note": "MOL V2000 import and export; SDF support unverified.",
          "engine": {
            "library": "In-house",
            "source": "https://media.springernature.com/original/springer-static/esm/art%3A10.1186%2F1758-2946-3-53/MediaObjects/13321_2011_234_MOESM2_ESM.ZIP"
          }
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf",
          "note": "System clipboard exports images rather than editable chemical structures."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://media.springernature.com/original/springer-static/esm/art%3A10.1186%2F1758-2946-3-53/MediaObjects/13321_2011_234_MOESM2_ESM.ZIP",
          "note": "Requires obsolete Java browser plug-in; redistribution license unverified"
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Requires a Java browser plug-in; current Chrome and Firefox cannot run Java applets.",
        "Current hosted-editor access and operation were not verified on 2026-11-05.",
        "Latest release details and software licensing terms remain unverified."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.knalltundstinkt.de/MyChemise_englisch/Description.pdf"
      ]
    },
    {
      "id": "p64",
      "slug": "cyby-draw",
      "name": "CyBy-Draw",
      "rank": 115,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "idris2-chem"
        ],
        "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/MoleculeCanvas.idr",
        "note": "Custom SVG canvas; chem is a separate same-author cheminformatics toolkit."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "CyBy Draw SVG renderer",
        "language": "Idris",
        "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/Draw.idr#L220-L313"
      },
      "enginesChecked": true,
      "languageNote": "Idris core; HTML launchers, Python generators and Shell builds excluded.",
      "video": null,
      "embedding": {
        "methods": [
          "script tag"
        ],
        "package": "cyby-draw",
        "limit": "Requires Idris2 compilation; BSD-3-Clause",
        "how": "Use molWidget from cyby-draw; compile to JavaScript and include generated script."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "Word add-in browser API bindings"
        }
      ],
      "thirdParty": {
        "summary": "BSD-2/3-Clause Idris libraries; MIT modern-normalize CSS.",
        "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/cyby-draw.ipkg",
        "notice": null,
        "libraries": [
          {
            "name": "idris2-chem",
            "license": "BSD-3-Clause",
            "source": "https://github.com/stefan-hoeck/idris2-chem/blob/main/LICENSE"
          }
        ]
      },
      "tier": "embeddable",
      "tierReason": "Its Idris widget API and example browser sketcher focus on molecular structure input rather than publication document layout.",
      "summary": "A browser molecular structure editor with an Idris API and SVG export.",
      "website": "https://github.com/stefan-hoeck/idris2-cyby-draw",
      "repo": "https://github.com/stefan-hoeck/idris2-cyby-draw",
      "docs": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/README.md",
      "vendor": "Claudio Etterli, Salome Heilig and Stefan Höck",
      "license": {
        "kind": "open-source",
        "spdx": "BSD-3-Clause",
        "text": "BSD 3-Clause license permits redistribution and modification.",
        "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/LICENSE"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/releases"
      },
      "engine": {
        "rendering": "SVG generated by a custom Idris renderer",
        "chemistry": "chem (Idris chemistry toolkit)",
        "ui": "Idris async-dom and async-dom-extra HTML/DOM widgets",
        "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/cyby-draw.ipkg"
      },
      "languages": [
        "Idris"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/MoleculeCanvas.idr#L520-L543",
          "note": "Keys 1, 2 and 3 change hovered bond order."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/Draw.idr#L274-L278",
          "note": "Solid wedge, hashed wedge and wavy bonds."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw.idr#L339-L352",
          "note": "Benzene and three- through eight-membered rings."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/MoleculeCanvas.idr#L605-L614",
          "note": "Keyboard shortcut inserts an acetyl fragment beyond simple rings."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/Internal/Abbreviations.idr#L11-L47",
          "note": "Ac, Bn, Bz, Cy, OAc and Ph have molecular graphs."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw.idr#L206-L227",
          "note": "Element, charge and isotope selectors."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/MoleculeCanvas.idr#L520-L615",
          "note": "Hover shortcuts change bonds, elements, charges and isotopes."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/Internal/Graph.idr",
          "note": "Rectangle selection and rotation; flip and object scaling unverified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/Draw.idr#L253-L263",
          "note": "Invalid perceived atom types receive an error background.",
          "engine": {
            "library": "idris2-chem (Idris chem package, atom-type validation); In-house (invalid-atom highlighting)",
            "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/Draw.idr#L253-L262"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw.idr#L51-L62",
          "note": "MOL import and clipboard export; SDF files unsupported.",
          "engine": {
            "library": "idris2-chem (Idris chem package, Text.Molfile reader and writer)",
            "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw.idr#L51-L62"
          }
        },
        "smiles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw.idr#L51-L73",
          "note": "SMILES import; export paths provide SVG or MOL text.",
          "engine": {
            "library": "idris2-chem (Idris chem package, SMILES import and Geom.Gen2D coordinates)",
            "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw.idr#L51-L62"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw/MoleculeCanvas.idr#L749-L773",
          "note": "SVG includes molecular data for reopening."
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/word-addin/src/CyBy/Draw/Word.idr#L65-L139",
          "note": "Word add-in reopens and replaces structures using embedded MOL metadata."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "source",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw.idr#L87-L109",
          "note": "Idris Extension hooks customize export, toolbar buttons and event handling."
        },
        "embed": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/app/src/Html.idr#L98-L115",
          "note": "Use molWidget from cyby-draw; compile to JavaScript and include generated script."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/word-addin/src/CyBy/Draw/Word.idr#L15-L31",
          "note": "Word add-in edits SVG/MOL metadata, without native OLE activation."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/src/CyBy/Draw.idr#L493-L507",
          "note": "API renders chosen atoms and connecting bonds with configurable colored backgrounds."
        }
      },
      "caveats": [
        "No tagged release or packaged downloads; a source build is required.",
        "SMILES import is supported; output uses SVG or MOL clipboard text.",
        "Extension comments describe obsolete import-button tuples; current code uses hooks."
      ],
      "github": {
        "url": "https://github.com/stefan-hoeck/idris2-cyby-draw",
        "stars": 10,
        "checkedOn": "2026-11-06",
        "firstCommit": "2024-08-22",
        "commits": 178,
        "contributors": 6,
        "pushedAt": "2026-10-07T05:12:12Z",
        "archived": false
      },
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://github.com/stefan-hoeck/idris2-cyby-draw",
        "ran": false,
        "failure": "No hosted editor URL was available. The Idris2/pack source build did not finish within ten minutes, so the editor could not be launched.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": []
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/stefan-hoeck/idris2-cyby-draw",
        "https://github.com/stefan-hoeck/idris2-cyby-draw/blob/3b838acd30f8a055303588305db90d27d2ae8d93/README.md"
      ]
    },
    {
      "id": "p50",
      "slug": "elk-draw-rdkit",
      "name": "Elk_Draw RDKit",
      "rank": 116,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "RDKit",
          "RingDecomposerLib"
        ],
        "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/THIRD-PARTY-NOTICES.md",
        "note": "Vendor states written from scratch; RDKit and RingDecomposerLib provide chemistry calculations."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "Elk_Draw molecular renderer",
        "language": "C#",
        "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/THIRD-PARTY-NOTICES.md#L3-L5"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Windows; commercial use requires permission",
        "how": "Word OLE roundtrip exists; editor running inside Word remains unverified."
      },
      "otherLanguages": [
        {
          "language": "C++",
          "role": "RDKit native descriptor calculations"
        }
      ],
      "thirdParty": {
        "summary": "MIT/BSD/Apache/Boost components; Eigen MPL-2.0 and Inter font OFL-1.1. Native notices also list MPL-1.1/GPL-2.0-or-later/LGPL-2.1-or-later alternatives, FreeType FTL/GPL-2.0-or-later, and libmicrohttpd LGPL-2.1/eCos terms.",
        "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/THIRD-PARTY-NOTICES.md",
        "notice": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/main/THIRD-PARTY-NOTICES.md",
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          },
          {
            "name": "RingDecomposerLib",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rareylab/RingDecomposerLib/blob/master/LICENSE"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A standalone editor creates chemical drawing documents with structures, reactions, text and shapes, and supports editable Word objects.",
      "summary": "A Windows editor for chemical structures and reactions with RDKit descriptors, QSAR modeling, and editable Word integration.",
      "website": "https://github.com/AllexSpectra/Elk_Draw_RDKit",
      "repo": "https://github.com/AllexSpectra/Elk_Draw_RDKit",
      "docs": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md",
      "vendor": "Oleksandr Karasyov",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Proprietary; free for private use, teaching and noncommercial academic research. Commercial use requires prior permission.",
        "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/LICENSE.txt"
      },
      "price": {
        "text": "Free for private use, teaching and noncommercial academic research; commercial permission required (2026-11-05).",
        "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/LICENSE.txt"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v0.9.7",
        "date": "2026-10-24",
        "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/releases/tag/v0.9.7"
      },
      "engine": {
        "rendering": "SkiaSharp (Skia)",
        "chemistry": "RDKit (molecular descriptors)",
        "ui": "Avalonia",
        "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/THIRD-PARTY-NOTICES.md"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "conformers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/releases/tag/v0.9.5",
          "note": "Haworth ring templates; vendor claim."
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md#what-elk_draw-rdkit-does",
          "note": "Fragment library includes cages, reagents and natural products; vendor claim."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/releases/tag/v0.9.7",
          "note": "Host–guest drawings rotate in 3D with depth layers; vendor claim."
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md#what-elk_draw-rdkit-does",
          "note": "Draws editable shapes and brackets; vendor claim."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/releases/tag/v0.9.4",
          "note": "Clean Up tidies selected structures or the entire drawing; vendor claim."
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/releases/tag/v0.9.2",
          "note": "Valence problems are marked; vendor claim."
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/releases/tag/v0.9.5",
          "note": "R/S labels follow wedge/hash stereochemistry; vendor claim."
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md#what-elk_draw-rdkit-does",
          "note": "Formula, molecular weight and exact mass panel; vendor claim."
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md#what-elk_draw-rdkit-does",
          "note": "Properties panel calculates logP and TPSA; vendor claim.",
          "engine": {
            "library": "RDKit (native C API rdkitcffi.dll with descriptor extension)",
            "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/THIRD-PARTY-NOTICES.md#L28-L31"
          }
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "no",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md#what-elk_draw-rdkit-does",
          "note": "Explicitly excluded from this edition."
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md#licence",
          "note": "Explicitly reads and writes CDXML; vendor claim.",
          "engine": {
            "library": "In-house (C# CDXML reader/writer)",
            "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/THIRD-PARTY-NOTICES.md#L104-L105"
          }
        },
        "cdx": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md#licence",
          "note": "Explicitly reads and writes CDX; vendor claim.",
          "engine": {
            "library": "In-house (C# CDX reader/writer)",
            "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/THIRD-PARTY-NOTICES.md#L104-L105"
          }
        },
        "mol-sdf": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md#what-elk_draw-rdkit-does",
          "note": "SMILES input files and calculated SMILES output; vendor claim."
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/releases/tag/v0.9.4",
          "note": "InChI output omits coordinate bonds; vendor claim."
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md#what-elk_draw-rdkit-does",
          "note": "Double-click inserted Word structures to edit in Elk_Draw; vendor claim."
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md",
          "note": "Word OLE roundtrip exists; editor running inside Word remains unverified."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office-ole": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md#what-elk_draw-rdkit-does",
          "note": "Windows Word supports embedded objects reopened by double-click in Elk_Draw."
        },
        "color-highlight": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/AllexSpectra/Elk_Draw_RDKit/releases/tag/v0.9.5",
          "note": "Shading and Colour supports adjustable halos extending beyond bonds."
        }
      },
      "caveats": [
        "Windows 10/11, 64-bit only.",
        "Commercial use requires the author's prior permission.",
        "NMR prediction and full-edition quantum calculations are excluded."
      ],
      "github": {
        "url": "https://github.com/AllexSpectra/Elk_Draw_RDKit",
        "stars": 1,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-10-20",
        "commits": 7,
        "contributors": 2,
        "pushedAt": "2026-10-24T13:59:44Z",
        "archived": false
      },
      "hands": null,
      "perf": null,
      "downloadBytes": 18616320,
      "references": [
        "https://github.com/AllexSpectra/Elk_Draw_RDKit",
        "https://github.com/AllexSpectra/Elk_Draw_RDKit/blob/c33ea2c9ae60538af7b805be9a78fc6a92ec2009/README.md"
      ]
    },
    {
      "id": "p82",
      "slug": "chem-molecular-structure-editor",
      "name": "Chem+ Molecular Structure Editor",
      "rank": 117,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Public vendor documentation does not identify the editor or chemistry libraries."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [
        {
          "name": "Free",
          "level": "account",
          "price": "2026-11-06: ₺0; calculators only per current pricing"
        },
        {
          "name": "Pro",
          "level": "paid",
          "price": "2026-11-06: ₺149/month promotional; ₺499/month list"
        },
        {
          "name": "Team",
          "level": "paid",
          "price": "2026-11-06: ₺349/month promotional; ₺999/month list; up to 5 users"
        }
      ],
      "renderer": {
        "origin": "borrowed",
        "name": "Ketcher Raphaël renderer; Indigo image exports",
        "language": "TypeScript",
        "source": "https://chemplus.com.tr/_next/static/immutable/chunks/37wbi0-qe8t7r.js"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "External framing blocked by CSP and X-Frame-Options.",
        "how": "CSP frame-ancestors self and X-Frame-Options SAMEORIGIN block external frames."
      },
      "otherLanguages": [
        {
          "language": "JavaScript",
          "role": "React interface and Raphaël runtime"
        },
        {
          "language": "C++",
          "role": "Indigo chemistry and export WebAssembly"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Official tutorials describe composing 2D structures into publication figures and exporting SVG, although live functionality remains unverified.",
      "summary": "A browser-based molecular drawing editor within Chem+ for creating structures and exporting publication figures.",
      "website": "https://chemplus.com.tr/",
      "repo": null,
      "docs": "https://chemplus.com.tr/blog/building-your-first-figure",
      "vendor": "Chem+",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Commercial hosted access through the Chem+ Pro subscription.",
        "source": "https://chemplus.com.tr/blog/choosing-the-right-chemplus-plan"
      },
      "price": {
        "text": "2026-11-05: Pro ₺149/month promotional price; list price ₺499/month.",
        "source": "https://chemplus.com.tr/enterprise"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: single, double and triple bonds.",
          "plan": "Pro",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: wedge/dash; wavy bonds undocumented.",
          "plan": "Pro",
          "planLevel": "paid"
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: common ring templates, including benzene.",
          "plan": "Pro",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: charges; isotopes and arbitrary labels undocumented.",
          "plan": "Pro",
          "planLevel": "paid"
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: lone pairs.",
          "plan": "Pro",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/building-your-first-figure",
          "note": "Pro; vendor claim; grouping uses Chem+ Canvas.",
          "plan": "Pro",
          "planLevel": "paid"
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim; compound search by name loads structures.",
          "engine": {
            "library": "PubChem (remote name-to-structure lookup)",
            "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus"
          },
          "plan": "Pro",
          "planLevel": "paid"
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/",
          "note": "Pro; vendor claim: structure-to-IUPAC-name conversion.",
          "plan": "Pro",
          "planLevel": "paid"
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: PubChem-backed compound search.",
          "engine": {
            "library": "PubChem (remote database lookup)",
            "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus"
          },
          "plan": "Pro",
          "planLevel": "paid"
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/building-your-first-figure",
          "note": "Pro; vendor claim; structures open in separate Miew 3D module.",
          "engine": {
            "library": "Miew (JavaScript/WebGL, separate browser module)",
            "source": "https://chemplus.com.tr/blog/see-molecules-in-3d-with-miew"
          },
          "plan": "Pro",
          "planLevel": "paid"
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: MOL/SDF export; import undocumented.",
          "engine": {
            "library": "Ketcher (TypeScript MOL V2000 serializer); Indigo (browser WebAssembly MOL V3000 conversion); SDF implementation unconfirmed",
            "source": "https://chemplus.com.tr/_next/static/immutable/chunks/37wbi0-qe8t7r.js"
          },
          "plan": "Pro",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: SMILES export; import undocumented.",
          "engine": {
            "library": "Indigo (browser WebAssembly through Ketcher standalone)",
            "source": "https://chemplus.com.tr/_next/static/immutable/chunks/0u8kn_o1l1gtz.js"
          },
          "plan": "Pro",
          "planLevel": "paid"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: InChI export.",
          "engine": {
            "library": "Indigo (browser WebAssembly through Ketcher standalone)",
            "source": "https://chemplus.com.tr/_next/static/immutable/chunks/0u8kn_o1l1gtz.js"
          },
          "plan": "Pro",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: scalable SVG export.",
          "plan": "Pro",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus",
          "note": "Pro; vendor claim: high-resolution PNG; 300 dpi unspecified.",
          "plan": "Pro",
          "planLevel": "paid"
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "no",
          "evidence": "docs",
          "source": "https://chemplus.com.tr/dashboard/chemdraw",
          "note": "CSP frame-ancestors self and X-Frame-Options SAMEORIGIN block external frames."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Login-gated editor; live drawing and exports could not be independently verified.",
        "Advertised as a paid Pro module; public free-tier descriptions conflict.",
        "No public source repository or numbered editor release was identified."
      ],
      "github": null,
      "hands": {
        "testedVersion": "build XzRhYnz8AkurH6Tiy6Rfq",
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "hosted",
        "artifact": "https://chemplus.com.tr/dashboard/chemdraw",
        "ran": false,
        "failure": "The editor redirects to an account login, blocking access to drawing.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "The login page offers Academy and Business workspaces.",
          "The recorded build ID comes from the served login page, not an editor version."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://chemplus.com.tr/dashboard/chemdraw",
        "https://chemplus.com.tr/blog/chemdraw-launches-in-chemplus"
      ]
    },
    {
      "id": "p105",
      "slug": "molprime",
      "name": "MolPrime+",
      "rank": 118,
      "builtOn": {
        "relation": "wrapper",
        "editor": "MMDS sketcher",
        "libraries": null,
        "source": "https://cheminf20.org/2013/03/19/molprime-ios-due-for-an-overhaul/",
        "note": "Reuses the vendor's MMDS sketcher; third-party chemistry dependencies remain unestablished."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "MMDS sketcher (MMDSLib)",
        "language": "Objective-C",
        "source": "https://cheminf20.org/2013/03/19/molprime-ios-due-for-an-overhaul/"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Standalone iOS app; no documented editor embedding route confirmed."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": [
          {
            "name": "MMDS sketcher",
            "license": null,
            "source": null
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A standalone mobile editor produces 2D chemical structure drawings and exports vector graphics in Word documents.",
      "summary": "Mobile editor for drawing chemical structures, calculating molecular properties, and exporting structure graphics.",
      "website": "https://apps.apple.com/gb/app/molprime/id497295446",
      "repo": null,
      "docs": "https://cheminf20.org/category/molprime/",
      "vendor": "Molecular Materials Informatics, Inc.",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free App Store application; copyright Molecular Materials Informatics, Inc.",
        "source": "https://apps.apple.com/gb/app/molprime/id497295446"
      },
      "price": {
        "text": "Free (2026-11-05)",
        "source": "https://apps.apple.com/gb/app/molprime/id497295446"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": false,
        "web": false,
        "ios": true,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.2.7",
        "date": "2019-01-03",
        "source": "https://apps.apple.com/gb/app/molprime/id497295446"
      },
      "engine": {
        "rendering": null,
        "chemistry": "In-house MMDS core library (Objective-C)",
        "ui": null,
        "source": "https://cheminf20.org/2015/02/07/recent-developments-with-bayesian-models-and-app-data-sharing/"
      },
      "languages": [
        "Objective-C"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-2-8",
          "note": "Shared MMDS sketcher supports manually setting bond orders."
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-2-8",
          "note": "Shared sketcher supports solid wedge, hashed wedge, and wavy bonds."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-2-8",
          "note": "Shared sketcher includes benzene and common ring sizes."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminf20.org/2011/12/14/recent-mmds-improvements-drawing-and-rendering/",
          "note": "Shared sketcher includes functional groups and molecular building blocks."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminf20.org/2012/07/27/molprime-can-now-calculate-distributions-for-mass-spectroscopy/",
          "note": "Inline abbreviations expand automatically for chemical calculations."
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-2-8",
          "note": "Shared sketcher supports charges, isotopes, and arbitrary atom labels."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-2-8",
          "note": "Shared sketcher supports setting atom radical counts."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://link.springer.com/article/10.1186/1758-2946-2-8",
          "note": "Shared sketcher supports free selection, rotation, flipping, and scaling."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/gb/app/molprime/id497295446",
          "note": "Highlights atomic valence violations.",
          "engine": {
            "library": "MMDS core library (Objective-C, local)",
            "source": "https://cheminf20.org/2015/02/07/recent-developments-with-bayesian-models-and-app-data-sharing/"
          }
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/gb/app/molprime/id497295446",
          "note": "Computes R/S and E/Z labels locally.",
          "engine": {
            "library": "MMDS core library (Objective-C, local)",
            "source": "https://cheminf20.org/2015/02/07/recent-developments-with-bayesian-models-and-app-data-sharing/"
          }
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminf20.org/2012/07/27/molprime-can-now-calculate-distributions-for-mass-spectroscopy/",
          "note": null,
          "engine": {
            "library": "MMDS core library (Objective-C, local)",
            "source": "https://cheminf20.org/2015/02/07/recent-developments-with-bayesian-models-and-app-data-sharing/"
          }
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/gb/app/molprime/id497295446",
          "note": "Calculates logP locally.",
          "engine": {
            "library": "MMDS core library (Objective-C, local)",
            "source": "https://cheminf20.org/2015/02/07/recent-developments-with-bayesian-models-and-app-data-sharing/"
          }
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminf20.org/2013/01/20/search-integration-added-to-molprime/",
          "note": "Database name lookup imports matching structures.",
          "engine": {
            "library": "MetaSearch (remote server; PubChem, ChEBI and ChemSpider name lookup)",
            "source": "https://cheminf20.org/2013/04/20/chemspider-now-integrated-into-searching-with-mmds/"
          }
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://cheminf20.org/2013/01/20/search-integration-added-to-molprime/",
          "note": "Searches PubChem and ChEBI by name or structure.",
          "engine": {
            "library": "MetaSearch (remote server; PubChem, ChEBI and ChemSpider web services)",
            "source": "https://cheminf20.org/2013/09/14/scaffolding-of-tuberculosis-drugs-part-2-adding-public-data/"
          }
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://apps.apple.com/gb/app/molprime/id497295446",
          "note": "Standalone iOS app; no documented editor embedding route confirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://cheminf20.org/2015/01/03/pains-filters-now-on-mobile-with-molprime/",
          "note": "Atom backdrops available in PAINS and valence analysis views."
        }
      },
      "caveats": [
        "Last listed release: 1.2.7, dated 2019-01-03.",
        "App Store labels Apple silicon Mac compatibility as unverified.",
        "Word vector export uses a web service; current service availability is unverified."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://apps.apple.com/ie/app/molprime/id497295446"
      ]
    },
    {
      "id": "p74",
      "slug": "molgendraw",
      "name": "MolGenDraw",
      "rank": 119,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "RDKit"
        ],
        "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L74-L79",
        "note": "Vendor documents RDKit; canvas provenance is not publicly established."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": "borrowed",
        "name": "RDKit MolDraw2D Cairo",
        "language": "C++",
        "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Proprietary freeware; all rights reserved",
        "how": "Standalone Windows executable; no embedding interface documented."
      },
      "otherLanguages": [
        {
          "language": "Python",
          "role": "Application and custom Pillow 3D renderer"
        },
        {
          "language": "Java",
          "role": "Local OPSIN name parsing"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": [
          {
            "name": "RDKit",
            "license": "BSD-3-Clause",
            "source": "https://github.com/rdkit/rdkit/blob/master/license.txt"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "A standalone 2D molecular drawing application with structure templates and PNG/PDF exports for molecular figures.",
      "summary": "A Windows application for drawing molecular structures and editing multi-record SDF and SMILES databases.",
      "website": "https://github.com/usman-vb/MolGenDraw",
      "repo": "https://github.com/usman-vb/MolGenDraw",
      "docs": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md",
      "vendor": "Muhammad Usman Afzal",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Proprietary freeware; all rights reserved.",
        "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L213-L216"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L213-L216"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v1.176",
        "date": "2026-10-29",
        "source": "https://github.com/usman-vb/MolGenDraw/releases/tag/v1.176"
      },
      "engine": {
        "rendering": null,
        "chemistry": "RDKit",
        "ui": "PySide6",
        "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/Screenshots/MolGenDraw_About.png"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L14-L16",
          "note": "vendor claim; manually cycle single, double and triple bonds."
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L14-L16",
          "note": "vendor claim; benzene, cyclohexane and cyclopentane ring tools."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/Screenshots/MolGenDraw_Template.png",
          "note": "Phenolphthalein template shown in the structure library."
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L65-L68",
          "note": "Save the current molecule as a reusable template."
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Element and charge controls shown; isotope editing undocumented."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Selection, rotation and flips documented; resizing unverified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "no",
          "evidence": "docs",
          "source": "https://raw.githubusercontent.com/usman-vb/MolGenDraw/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md",
          "note": "Advanced reaction drawing and arrow tools are planned."
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Bond-width controls documented; reusable styles unverified."
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Only single-page A4 report export documented."
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L74-L79",
          "note": "vendor claim; real-time RDKit sanitization errors flag invalid structures.",
          "engine": {
            "library": "RDKit (Python Chem.SanitizeMol)",
            "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
          }
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/Screenshots/MolGenDraw_2D_View.png",
          "note": "Formula, molecular weight and exact mass displayed.",
          "engine": {
            "library": "In-house (Python atom counts and ATOMIC_WEIGHTS/EXACT_MASSES tables); RDKit (Python CalcMolFormula, MolWt and ExactMolWt in 3D view)",
            "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
          }
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L38-L63",
          "note": "PubChem name lookup and IUPAC-to-SMILES batch generation.",
          "engine": {
            "library": "OPSIN (local Java CLI JAR); PubChem web service (PubChemPy/Python), with RDKit (Python) SMILES parsing",
            "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
          }
        },
        "structure-to-name": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L74-L78",
          "note": "IUPAC name generation requires an internet connection.",
          "engine": {
            "library": "PubChem PUG REST (remote IUPACName property lookup through Python urllib)",
            "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
          }
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L54-L57",
          "note": "Batch PNG/JPG recognition exports editable MOL files.",
          "engine": {
            "library": "Imago OCR (local Windows imago.exe invoked through Python subprocess)",
            "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
          }
        },
        "database-lookup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L38-L41",
          "note": "PubChem retrieval loads structures onto the canvas.",
          "engine": {
            "library": "PubChem PUG REST (remote API through PubChemPy Python get_compounds)",
            "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
          }
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L43-L47",
          "note": "Mouse rotation; wireframe, sticks and ball-and-stick display modes.",
          "engine": {
            "library": "In-house (Python/Pillow drawing and NumPy projection); RDKit (Python EmbedMolecule and MMFFOptimizeMolecule geometry)",
            "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
          }
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L70-L79",
          "note": "Reads/writes MOL and SDF; includes multi-record database editing.",
          "engine": {
            "library": "RDKit (Python MOL parsing, SDMolSupplier and MolToMolBlock); In-house (Python SDF record/tag framing and molblock-header normalization)",
            "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
          }
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L70-L78",
          "note": "Reads/writes SMILES, including multi-record SMI collections.",
          "engine": {
            "library": "RDKit (Python Chem.MolFromSmiles and MolToSmiles)",
            "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
          }
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md#L74-L78",
          "note": "Generates InChI and InChIKey offline.",
          "engine": {
            "library": "RDKit (Python Chem.MolToInchi and InchiToInchiKey, bundled native InChI backend)",
            "source": "https://github.com/usman-vb/MolGenDraw/releases/download/v1.176/MolGenDraw-1.176.zip"
          }
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "PDF reports documented; vector output unverified."
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Transparent PNG export documented; 300 dpi output unverified."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/usman-vb/MolGenDraw/blob/6d1f191759f5e249fe9a1a1dad5d50744139c9e2/README.md",
          "note": "Standalone Windows executable; no embedding interface documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Windows 10/11 64-bit only; executable is unsigned.",
        "Advanced reaction drawing and arrow tools are planned.",
        "Vector PDF output and PNG print resolution are undocumented."
      ],
      "github": {
        "url": "https://github.com/usman-vb/MolGenDraw",
        "stars": 0,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-07-27",
        "commits": 17,
        "contributors": 1,
        "pushedAt": "2026-10-30T03:59:29Z",
        "archived": false
      },
      "hands": null,
      "perf": null,
      "downloadBytes": 150492360,
      "references": [
        "https://github.com/usman-vb/MolGenDraw",
        "https://github.com/usman-vb/MolGenDraw/blob/main/README.md"
      ]
    },
    {
      "id": "p123",
      "slug": "chirys-draw",
      "name": "Chirys Draw",
      "rank": 120,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Patented gestures do not establish underlying canvas provenance; third-party chemistry libraries remain unverified."
      },
      "appKind": {
        "desktop": false,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "link",
        "url": "https://apps.apple.com/us/app/chirys-draw/id455125162",
        "embed": null,
        "title": "App Store preview",
        "author": null,
        "linkedFrom": "https://apps.apple.com/us/app/chirys-draw/id455125162",
        "poster": null
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Developer link returns 404; embedding mechanism unconfirmed."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Standalone structure and reaction drawing with vector PDF export supports publication figures.",
      "summary": "An iPad app for drawing molecular structures and reaction schemes and exporting publication figures.",
      "website": "https://apps.apple.com/us/app/chirys-draw/id455125162",
      "repo": null,
      "docs": "https://apps.apple.com/us/app/chirys-draw/id455125162",
      "vendor": "John Clark (Integrated Chemistry Design, Inc.)",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free App Store application.",
        "source": "https://apps.apple.com/us/app/chirys-draw/id455125162"
      },
      "price": {
        "text": "Free",
        "source": "https://apps.apple.com/us/app/chirys-draw/id455125162"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": false,
        "ios": true,
        "android": false,
        "offline": false
      },
      "version": {
        "name": "2.5",
        "date": "2021-04-23",
        "source": "https://apps.apple.com/us/app/chirys-draw/id455125162"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-bonds": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Up/down wedges and wavy bonds; manual confirms wedge types."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: saturated, aromatic, fused and spiro ring drawing."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: press-and-drag gesture draws chains."
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Built-in protecting groups plus Groups and Template panel."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: named functional groups expand, including on MOL/SD export."
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: directional, retrosynthetic, resonance and equilibrium arrows."
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: exports reactions as RXN/RD files."
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: annotation text color can be set."
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: formula, molecular weight, elemental composition and exact mass."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: R-groups supported, including MOL import."
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: MOL/SD import and export."
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: RXN/RD export."
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Vendor claim: scalable vector PDF export."
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://apps.apple.com/us/app/chirys-draw/id455125162",
          "note": "Developer link returns 404; embedding mechanism unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "The latest listed release is dated April 23, 2021.",
        "The linked developer website returns 404; no accessible official manual found.",
        "Offline operation could not be verified."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://apps.apple.com/us/app/chirys-draw/id455125162",
        "https://apps.apple.com/us/app/chirys-draw/id455125162"
      ]
    },
    {
      "id": "p83",
      "slug": "chemscribble",
      "name": "ChemScribble",
      "rank": 121,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": [
          "ChemDoodle"
        ],
        "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=57",
        "note": "ChemDoodle powers stereochemistry; canvas provenance is not publicly established."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "iChemLabs Suite",
          "level": "paid",
          "price": "2026-11-06: US$29/month, US$199/year or US$999 lifetime, plus tax."
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=PpU7oux_Z_Q",
        "embed": "https://www.youtube-nocookie.com/embed/PpU7oux_Z_Q",
        "title": "ChemScribble Introduction",
        "author": "ChemDoodle",
        "linkedFrom": "https://www.chemscribble.com/",
        "poster": "https://i.ytimg.com/vi/PpU7oux_Z_Q/hqdefault.jpg"
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Commercial license; web version remains under development.",
        "how": "Desktop application; no editor embedding route documented."
      },
      "otherLanguages": [
        {
          "language": "Java",
          "role": "Desktop application"
        },
        {
          "language": "JavaScript",
          "role": "Bundled ChemDoodle Web Components"
        }
      ],
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": [
          {
            "name": "ChemDoodle Web Components",
            "license": "GPL-3.0-or-later",
            "source": "https://web.chemdoodle.com/libs/cwc/ChemDoodleWeb.js?v=11.0.0"
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "This desktop handwriting recognizer hands interpreted chemistry to ChemDoodle and cannot independently export publication drawing documents.",
      "summary": "Desktop tool for drawing and interpreting chemical structures and reaction schemes with a stylus.",
      "website": "https://www.chemscribble.com/",
      "repo": null,
      "docs": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf",
      "vendor": "iChemLabs, LLC",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Proprietary iChemLabs Suite license; beta software is restricted to evaluation.",
        "source": "https://ichemlabs.com/legal/?tab=eula"
      },
      "price": {
        "text": "2026-11-05: iChemLabs Suite US$29/month, US$199/year or US$999 lifetime, plus tax.",
        "source": "https://www.ichemlabs.com/store"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.1.0",
        "date": "2026-07-18",
        "source": "https://www.ichemlabs.com/support/version-history.php?product=ChemScribble"
      },
      "engine": {
        "rendering": null,
        "chemistry": "ChemDoodle engine",
        "ui": null,
        "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=57"
      },
      "languages": [
        "Java"
      ],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=53",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=55",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=56",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=57",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=75",
          "note": "Interpreted reactions can be exported as chemical text.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=58",
          "note": null,
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=76",
          "note": "Image files cannot be opened; only own strokes can paste."
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=57",
          "note": "Automatically assigns CIP descriptors.",
          "engine": {
            "library": "ChemDoodle engine (embedded in Java desktop application)",
            "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=57"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=76",
          "note": "Image files cannot open; external data cannot paste."
        },
        "database-lookup": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=74",
          "note": "Search results open in browser; structures cannot be imported.",
          "engine": {
            "library": "PubChem (remote website search opened in browser; no structure import)",
            "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=74"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "model-3d": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=69",
          "note": "Requires separate ChemDoodle 3D; only the last molecule transfers.",
          "engine": {
            "library": "ChemDoodle 3D (separate local desktop application)",
            "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=69"
          },
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=76",
          "note": "Only .scrb files can be opened or saved."
        },
        "cdx": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=76",
          "note": "Only .scrb files can be opened or saved."
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=75",
          "note": "MOL clipboard export only; no MOL/SDF file import or export.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=75",
          "note": "Clipboard export only; chemical text cannot be imported.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "inchi": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=75",
          "note": "Clipboard text export.",
          "plan": "iChemLabs Suite",
          "planLevel": "paid"
        },
        "rxn": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=76",
          "note": "Chemical file import and export are unavailable."
        },
        "svg-export": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=76",
          "note": "Image files cannot be saved."
        },
        "pdf-export": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=76",
          "note": "Only .scrb files can be saved."
        },
        "png-export": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=76",
          "note": "Image files cannot be saved."
        },
        "clipboard-chemdraw": {
          "status": "no",
          "evidence": "docs",
          "source": "https://www.ichemlabs.com/downloads/ChemScribbleUserGuide.pdf#page=76",
          "note": "Chemical data cannot be pasted into ChemScribble."
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://www.chemscribble.com/",
          "note": "Desktop application; no editor embedding route documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Public beta; the EULA restricts beta software to evaluation.",
        "Saves only .scrb; publication image export requires separate ChemDoodle software.",
        "Handwriting training and internet activation required; stylus recommended."
      ],
      "github": null,
      "hands": {
        "testedVersion": "1.1.0",
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "dmg",
        "artifact": "https://www.chemscribble.com/downloads/ChemScribble-macos-aarch64-1.1.0.dmg",
        "ran": false,
        "failure": "Startup requires accepting the iChemLabs Software License Agreement before drawing. Acceptance requires explicit user confirmation under the computer-use policy; no approval was received. Rejected the agreement and the app quit. No license-key or account prompt was reached.",
        "downloadBytes": 109442049,
        "installedBytes": 222183424,
        "captures": [],
        "observations": [
          "Welcome title shows ChemScribble v1.1.0.",
          "Startup displays Accept and Reject buttons for the license agreement.",
          "Drawing canvas was not reached; molecule and feature checks remain untested.",
          "Startup screenshot saved as welcome-license.png.",
          "Rejecting the agreement closed the app."
        ]
      },
      "perf": null,
      "downloadBytes": 109442049,
      "references": [
        "https://www.chemscribble.com/",
        "https://www.ichemlabs.com/support/version-history.php?product=ChemScribble"
      ]
    },
    {
      "id": "p115",
      "slug": "chem-sketcher",
      "name": "Chem Sketcher (Non_REM.Persona Laboratory)",
      "rank": 122,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": null,
        "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
        "note": "Author claims self-built editor and custom ring geometry; dependencies remain unconfirmed."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "Redistribution license unspecified.",
        "how": "Standalone HTML download; no documented embedding API or component found."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "An end-user chemical drawing editor with image output for reports.",
      "summary": "A browser-based editor for drawing chemical structures and estimating properties.",
      "website": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
      "repo": null,
      "docs": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
      "vendor": "Non_REM.Persona Laboratory (Non-Rem)",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free use advertised; no explicit software license.",
        "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5"
      },
      "price": {
        "text": "Free via sharing promotion, or ¥100 (2026-11-05).",
        "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": "React",
        "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5"
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "Single, double and triple bonds; vendor claim."
        },
        "stereo-bonds": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "Wedge/dash documented; wavy unverified; vendor claim."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "Benzene and cyclohexane tools; vendor claim."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "Drag chains; vendor claim."
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "PEG, PPG and PDMS units; vendor claim."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "Element labels documented; charges/isotopes unverified."
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "Selection documented; rotation, flip and resizing unverified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "Brackets documented; other shapes unverified; vendor claim."
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "Mass documented; formula unverified; vendor claim."
        },
        "properties": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "clogP, HSP and IOB; vendor claim."
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "Repeat-unit templates and polymer brackets; vendor claim."
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
          "note": "Standalone HTML download; no documented embedding API or component found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Download requires note's sharing promotion or a ¥100 purchase.",
        "Property estimates use a simplified group-contribution method.",
        "Offline support, mobile compatibility and publication-resolution output are unverified."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://note.com/persona_lab/n/ne5a76ba6e9c5",
        "ran": false,
        "failure": "The publisher's HTML file is behind a ¥100 purchase or social-sharing access gate. No public hosted editor or direct download was found; purchase and account sign-in were not authorized.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": []
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://note.com/persona_lab/n/ne5a76ba6e9c5",
        "https://note.com/persona_lab/n/ne5a76ba6e9c5"
      ]
    },
    {
      "id": "p134",
      "slug": "structo",
      "name": "Structo",
      "rank": 123,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Vendor listing and privacy policy do not disclose editor provenance or chemistry libraries."
      },
      "appKind": {
        "desktop": false,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Android app; no editor embedding interface documented."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Standalone editor creates saved 2D chemical drawings, reaction schemes, and annotations for image export.",
      "summary": "An Android editor for drawing chemical structures, reaction schemes, and mechanisms with touch controls.",
      "website": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
      "repo": null,
      "docs": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
      "vendor": "Potassium Iodide",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free Android app; source license undisclosed.",
        "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo"
      },
      "price": {
        "text": "Free",
        "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": false,
        "ios": false,
        "android": true,
        "offline": false
      },
      "version": {
        "name": null,
        "date": "2026-09-22",
        "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Developer screenshots show single, double, and triple bond controls."
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Wavy bonds unverified."
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Aromatic ring tools unverified."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Vendor claim: steroids, sugars, pharmaceuticals and other scaffolds."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Isotopes documented; developer screenshots show charge and element controls."
        },
        "radicals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Vendor claim: lone-pair markers."
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Vendor claim: forward and equilibrium arrows."
        },
        "mechanism-arrows": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Vendor claim: curved electron-movement arrows."
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Font controls unverified."
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Vendor claim: grouping labels and annotations."
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Vendor claim: tidies rings and spacing."
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Vendor claim: flags common drawing errors."
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Vendor claim: formula, molecular weight, monoisotopic mass."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "smiles": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Vendor claim: SMILES import and export."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": "Print resolution unverified."
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
          "note": "Android app; no editor embedding interface documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Only an Android release is documented.",
        "Export resolution and vector output are unverified.",
        "Offline operation is unverified."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo",
        "https://play.google.com/store/apps/details?id=io.github.atomforgeapp.structo"
      ]
    },
    {
      "id": "p121",
      "slug": "chemograph-plus",
      "name": "Chemograph Plus",
      "rank": 124,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Public vendor documentation does not establish canvas provenance or third-party chemistry libraries."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "Standard",
          "level": "account",
          "price": "Free for private use; registration required (2026-11-06)"
        },
        {
          "name": "Premium",
          "level": "paid",
          "price": null
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Word OLE objects documented; embedded editor operation remains unverified."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Its standalone 2D editor produces chemical structure and reaction documents with MOL exchange and Word object insertion.",
      "summary": "Windows software for drawing chemical structures and reaction schemes, with spectra editing and optional 3D structure viewing.",
      "website": "https://www.chemograph.de/",
      "repo": null,
      "docs": "https://www.chemograph.de/chemographversions.html",
      "vendor": "DigiLab Software GmbH",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary; Standard is free for private end users; Premium is paid.",
        "source": "https://www.chemograph.de/chemographversions.html"
      },
      "price": {
        "text": "2026-11-05: Standard free for private use; Premium price undisclosed.",
        "source": "https://www.chemograph.de/chemographversions.html"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://www.chemograph.de/download.html"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [
        "C++"
      ],
      "features": {
        "bonds-core": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemograph.de/chemographversions.html#bibeditor",
          "note": "Premium only; complex structure libraries; vendor claim.",
          "plan": "Premium",
          "planLevel": "paid"
        },
        "custom-templates": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemograph.de/chemographversions.html#bibeditor",
          "note": "Premium only; user libraries accept copied structures; vendor claim.",
          "plan": "Premium",
          "planLevel": "paid"
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.openagrar.de/servlets/MCRFileNodeServlet/openagrar_derivate_00033053/2003_0463.pdf",
          "note": "Vendor-coauthored 2002 publication; current edition unspecified."
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.openagrar.de/servlets/MCRFileNodeServlet/openagrar_derivate_00033053/2003_0463.pdf",
          "note": "Vendor-coauthored 2002 publication; current edition unspecified."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemograph.de/chemographversions.html#3dteil",
          "note": "Premium only; rotatable X-ray-derived models; vendor claim.",
          "plan": "Premium",
          "planLevel": "paid"
        },
        "crystals": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemograph.de/chemographversions.html#3dteil",
          "note": "Premium only; X-ray structure viewing; CIF undocumented; vendor claim.",
          "plan": "Premium",
          "planLevel": "paid"
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.chemograph.de/chemographversions.html#2dteil",
          "note": "MOL read/write; SDF undocumented; vendor claim.",
          "plan": "Standard",
          "planLevel": "account"
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://web.archive.org/web/20040609023057id_/http://www.chemograph.de:80/de/support.htm",
          "note": "Archived vendor-supplied DLL readers for crystallographic and MS formats."
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://www.chemograph.de/chemographplus.html",
          "note": "Word OLE objects documented; embedded editor operation remains unverified."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "The interface is German.",
        "Downloads require registration; public pages omit installer details and current release numbers.",
        "Formula, valence-checking, and C++ evidence comes from a vendor-coauthored 2002 publication."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.chemograph.de/",
        "https://www.chemograph.de/chemographversions.html"
      ]
    },
    {
      "id": "p08",
      "slug": "alvasketcher",
      "name": "alvaSketcher",
      "rank": 125,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Canvas provenance and third-party chemistry dependencies unestablished."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=3w08r-AeSd8",
        "embed": "https://www.youtube-nocookie.com/embed/3w08r-AeSd8",
        "title": "alvaSketcher v1.0 - Introduction",
        "author": "Alvascience",
        "linkedFrom": "https://www.alvascience.com/alvasketcher/",
        "poster": "https://i.ytimg.com/vi/3w08r-AeSd8/hqdefault.jpg"
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "No documented editor embedding API, SDK, or package found."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "Its standalone 2D editor and image clipboard output support chemical figure creation, although publication layout capabilities remain unverified.",
      "summary": "A desktop molecular editor for drawing, editing and preparing 2D chemical structures.",
      "website": "https://www.alvascience.com/alvasketcher/",
      "repo": null,
      "docs": "https://www.alvascience.com/alvasketcher/",
      "vendor": "Alvascience",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free for academic research and commercial applications; no open-source license stated.",
        "source": "https://www.alvascience.com/alvasketcher/"
      },
      "price": {
        "text": "Free",
        "source": "https://www.alvascience.com/alvasketcher/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://www.alvascience.com/alvasketcher/"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.alvascience.com/alvasketcher/",
          "note": "vendor claim; ring tools documented; aromatic ring coverage unspecified."
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.alvascience.com/alvasketcher/",
          "note": "vendor claim; chain drawing documented; drag-length control unspecified."
        },
        "templates": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.alvascience.com/alvasketcher/",
          "note": "vendor claim; reusable templates documented; library contents unspecified."
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.alvascience.com/alvasketcher/",
          "note": "vendor claim; select, rotate and flip; lasso and resize unverified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://www.alvascience.com/alvasketcher/",
          "note": "vendor claim; automatic coordinate cleanup."
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.linkedin.com/posts/alvascience_alvasketcher-cheminformatics-chemicaldrawing-activity-7505184846697156608-_iYq",
          "note": "vendor claim; SDF clipboard output; MOL read/write unverified."
        },
        "smiles": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://www.linkedin.com/posts/alvascience_alvasketcher-cheminformatics-chemicaldrawing-activity-7505184846697156608-_iYq",
          "note": "vendor claim; SMILES clipboard output confirmed; import unverified."
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://www.alvascience.com/alvasketcher/",
          "note": "No documented editor embedding API, SDK, or package found."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "An Alvascience account is required to access downloads.",
        "Latest release details and installer sizes are not publicly exposed.",
        "Publication layout, vector export and offline operation are unverified."
      ],
      "github": null,
      "hands": {
        "testedVersion": null,
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "not installed",
        "artifact": "https://www.alvascience.com/alvasketcher/#download",
        "ran": false,
        "failure": "The official alvaSketcher Download section requires an Alvascience login. Stopped without registering, signing in, or entering an email, as instructed.",
        "downloadBytes": null,
        "installedBytes": null,
        "captures": [],
        "observations": [
          "The public Download section displays a login requirement.",
          "No installer was downloaded or installed.",
          "Version, architecture, package format, and sizes were unavailable before login.",
          "Molecule rendering and features were not tested."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.alvascience.com/alvasketcher/"
      ]
    },
    {
      "id": "p106",
      "slug": "moled",
      "name": "moled",
      "rank": 126,
      "builtOn": {
        "relation": "original",
        "editor": null,
        "libraries": [
          "Smidge"
        ],
        "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/moled.js#L5-L34",
        "note": "Own SVG drawing canvas; bundled Smidge parses SMILES."
      },
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": {
        "origin": "original",
        "name": "moled SVG renderer using D3",
        "language": "JavaScript",
        "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/moled.js#L177-L274"
      },
      "enginesChecked": true,
      "languageNote": "HTML and CSS provide editor markup and styling.",
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "AGPL-3.0",
        "how": "Legacy iframe demo exists; usable editor embedding remains unconfirmed."
      },
      "otherLanguages": [],
      "thirdParty": {
        "summary": "Includes MIT-licensed Smidge and BSD-3-Clause D3 v3.",
        "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/Smidge.js#L1-L26",
        "notice": null,
        "libraries": [
          {
            "name": "Smidge",
            "license": null,
            "source": null
          }
        ]
      },
      "tier": "alternative",
      "tierReason": "Its basic browser editing code is suited to integration, but does not establish a usable publication-grade drawing document workflow.",
      "summary": "A legacy JavaScript browser editor for drawing molecular structures.",
      "website": "https://tomkel.github.io/moled/",
      "repo": "https://github.com/tomkel/moled",
      "docs": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/README.md",
      "vendor": "Tommy Kelly",
      "license": {
        "kind": "open-source",
        "spdx": "AGPL-3.0",
        "text": "GNU Affero General Public License version 3.",
        "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/tomkel/moled"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/tomkel/moled/releases"
      },
      "engine": {
        "rendering": "SVG elements created and updated by D3.js v3.",
        "chemistry": "Smidge SMILES parser with in-house molecular graph, valence, and hydrogen logic.",
        "ui": "Plain HTML/CSS and JavaScript DOM controls with D3.js v3.",
        "source": "https://github.com/tomkel/moled/tree/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {
        "bonds-core": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/moled.js#L483-L555",
          "note": "Draws three orders; existing bonds must be deleted and redrawn."
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/smiles.js#L71-L79",
          "note": "Elements and charges supported; isotope labels discarded during parsing."
        },
        "radicals": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/moled.js#L270-L292",
          "note": "Automatic electron dots; manual radical or lone-pair placement unverified."
        },
        "keyboard-drawing": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/moled.js#L651-L685",
          "note": "Delete/Backspace removes selected atoms or bonds; no element/order shortcuts."
        },
        "selection-tools": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/moled.js#L483-L525",
          "note": "Single atom/bond selection; lasso, rotation, flipping, and resizing unverified."
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "smiles": {
          "status": "partial",
          "evidence": "source",
          "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/moled.js#L136-L156",
          "note": "Source parser only; editor input hardcoded, export unverified.",
          "engine": {
            "library": "Smidge (JavaScript)",
            "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/smiles.js#L1-L25"
          }
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/README.md",
          "note": "Legacy iframe demo exists; usable editor embedding remains unconfirmed."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color-highlight": {
          "status": "partial",
          "evidence": "docs",
          "source": "https://github.com/tomkel/moled/blob/15103f344b8fcf6c02ea93a9bd534c2ca19b7d03/moled.css#L21-L37",
          "note": "Red selection halos surround displayed labels; hidden carbons remain unhighlighted."
        }
      },
      "caveats": [
        "Checked-in HTML loads CommonJS code without a module loader, preventing normal browser startup.",
        "Advertised demo embeds a RawGit URL; hosted editor availability could not be verified.",
        "README claims completeness, but charge/hydrogen initialization has empty or commented branches."
      ],
      "github": {
        "url": "https://github.com/tomkel/moled",
        "stars": 4,
        "checkedOn": "2026-11-06",
        "firstCommit": "2014-11-23",
        "commits": 17,
        "contributors": 2,
        "pushedAt": "2018-05-03T22:31:23Z",
        "archived": false
      },
      "hands": {
        "testedVersion": "3.0.0",
        "canvas": null,
        "canvasLight": null,
        "canvasDark": null,
        "memory": null,
        "themes": null,
        "testedOn": "2026-11-05",
        "platform": "macOS 27.0.1 arm64",
        "route": "source",
        "artifact": "https://github.com/tomkel/moled/tree/15103f3",
        "ran": false,
        "failure": "The checked-in moled.html showed static controls but no drawing canvas in WebKit or Chromium; the editor did not initialize. The checked-in JavaScript uses CommonJS require without a browser module loader.",
        "downloadBytes": null,
        "installedBytes": 413696,
        "captures": [],
        "observations": [
          "Package metadata reports version 3.0.0; source commit is 15103f3.",
          "Clicking the element button and dragging on the page produced no editor response.",
          "Startup screenshots are startup-failure.png and chromium-startup-failure.png.",
          "Molecule and feature tests could not be performed because the editor failed to initialize."
        ]
      },
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/tomkel/moled",
        "https://tomkel.github.io/moled/",
        "https://github.com/tomkel/moled/blob/master/README.md"
      ]
    },
    {
      "id": "p122",
      "slug": "chemworks",
      "name": "ChemWorks",
      "rank": 127,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Public vendor documentation does not establish canvas provenance or third-party chemistry libraries."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [
        {
          "name": "ChemWorks",
          "level": "paid",
          "price": "US$9.99 (2026-11-06)"
        }
      ],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": null,
      "embedding": {
        "methods": [],
        "package": null,
        "limit": "$9.99 standalone macOS application; embedding terms unconfirmed.",
        "how": "No supported editor embedding mechanism documented."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "It is a standalone 2D chemical drawing editor with SVG export for chemical structure figures.",
      "summary": "ChemWorks is a macOS editor for drawing 2D chemical structures and exporting structure images.",
      "website": "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12",
      "repo": null,
      "docs": "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12",
      "vendor": "志辉 付 (fuzhihui)",
      "license": {
        "kind": "commercial",
        "spdx": null,
        "text": "Paid Mac App Store application.",
        "source": "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12"
      },
      "price": {
        "text": "US$9.99 on the US Mac App Store (2026-11-05).",
        "source": "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.9",
        "date": "2024-06-01",
        "source": "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12",
          "note": "Vendor claim: manually draw single, double and triple bonds.",
          "plan": "ChemWorks",
          "planLevel": "paid"
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource124/v4/61/d4/ce/61d4ce00-6453-0006-5880-f287454abe90/d0550459-a246-46fa-a979-d08d5d11a738_fff.png/1600x1000bb.jpg",
          "note": "Official screenshot shows common ring tools, including benzene.",
          "plan": "ChemWorks",
          "planLevel": "paid"
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12",
          "note": "Vendor claim: MOL V2000 import/export; SDF support undocumented.",
          "plan": "ChemWorks",
          "planLevel": "paid"
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12",
          "note": "Vendor claim: SVG export added in version 1.6.",
          "plan": "ChemWorks",
          "planLevel": "paid"
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12",
          "note": "No supported editor embedding mechanism documented."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Available only for macOS 10.13 or later.",
        "Latest listed release: 1.9 (2024-06-01).",
        "No target-specific manual found beyond the App Store documentation."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": 16947824,
      "references": [
        "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12",
        "https://apps.apple.com/us/app/chemworks/id1495565603?mt=12"
      ]
    },
    {
      "id": "p128",
      "slug": "molecule",
      "name": "Molecule",
      "rank": 128,
      "builtOn": {
        "relation": null,
        "editor": null,
        "libraries": null,
        "source": null,
        "note": "Available vendor listing does not disclose canvas provenance or chemistry libraries."
      },
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": {
        "origin": null,
        "name": null,
        "language": null,
        "source": null
      },
      "enginesChecked": true,
      "languageNote": null,
      "video": {
        "provider": "link",
        "url": "https://apps.apple.com/us/app/molecule/id797331776",
        "embed": null,
        "title": "App Store preview",
        "author": null,
        "linkedFrom": "https://apps.apple.com/us/app/molecule/id797331776",
        "poster": null
      },
      "embedding": {
        "methods": [],
        "package": null,
        "limit": null,
        "how": "Embedding route unconfirmed; vendor website unavailable."
      },
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "alternative",
      "tierReason": "A standalone structure editor with multiple structures per page and PDF/vector sharing can produce 2D chemical drawing documents.",
      "summary": "Mobile chemical structure editor for drawing molecules, calculating formulae and masses, and sharing drawings.",
      "website": "https://www.moleculeapps.com/StructureEditor.html",
      "repo": null,
      "docs": "https://apps.apple.com/us/app/molecule/id797331776",
      "vendor": "Kirill Blinov (Molecule Apps)",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free App Store app; copyright Molecule Apps.",
        "source": "https://apps.apple.com/us/app/molecule/id797331776"
      },
      "price": {
        "text": "Free",
        "source": "https://apps.apple.com/us/app/molecule/id797331776"
      },
      "platforms": {
        "macos": true,
        "windows": false,
        "linux": false,
        "web": false,
        "ios": true,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.4",
        "date": "2017-11-05",
        "source": "https://apps.apple.com/us/app/molecule/id797331776"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {
        "bonds-core": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "special-bonds": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "double-bond-side": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rings": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "conformers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "chains": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-templates": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "abbreviations": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-labels": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "radicals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "keyboard-drawing": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "selection-tools": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "perspective": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mechanism-arrows": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "reaction-data": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "atom-mapping": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "orbitals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rich-text": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "shapes": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "align": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "groups": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cleanup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "journal-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "custom-styles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "color": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pages": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pictures": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "tlc-tables": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "valence-check": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "stereo-perception": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "formula-mass": {
          "status": "yes",
          "evidence": "docs",
          "source": "https://apps.apple.com/us/app/molecule/id797331776",
          "note": "Formula, molecular weight, monoisotopic mass and composition; vendor claim."
        },
        "properties": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "name-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "structure-to-name": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "nmr-prediction": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "markush": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "polymers": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "biomolecules": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "image-to-structure": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "database-lookup": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "model-3d": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "crystals": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdxml": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cdx": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mol-sdf": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "smiles": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "inchi": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "rxn": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "svg-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "pdf-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "png-export": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "clipboard-chemdraw": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "office": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "python-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "ts-api": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "cli": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "mcp-agents": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "plugins": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        },
        "embed": {
          "status": "unknown",
          "evidence": "none",
          "source": "https://apps.apple.com/us/app/molecule/id797331776",
          "note": "Embedding route unconfirmed; vendor website unavailable."
        },
        "ai-assistant": {
          "status": "unknown",
          "evidence": "none",
          "source": null,
          "note": null
        }
      },
      "caveats": [
        "Latest listed version is 1.4, dated 2017-11-05.",
        "Designed for iPad; Apple Silicon Mac compatibility is listed but unverified.",
        "PDF attachments and vector clipboard copying are documented; chemical-format interchange remains unverified."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://apps.apple.com/us/app/molecule/id797331776",
        "https://apps.apple.com/us/app/molecule/id797331776"
      ]
    },
    {
      "id": "p38",
      "slug": "avogadro",
      "name": "Avogadro",
      "rank": 129,
      "builtOn": null,
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=DRWzQanz8Cc",
        "embed": "https://www.youtube-nocookie.com/embed/DRWzQanz8Cc",
        "title": "Building Small Molecules",
        "author": "Avogadro Project",
        "linkedFrom": "https://avogadro.cc/docs/getting-started/drawing-molecules.html",
        "poster": "https://i.ytimg.com/vi/DRWzQanz8Cc/maxresdefault.jpg"
      },
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "Avogadro builds and visualizes 3D molecular models rather than authoring publication-grade 2D chemical drawing documents.",
      "summary": "A desktop editor for building, optimizing, and visualizing three-dimensional molecules and materials.",
      "website": "https://avogadro.cc/",
      "repo": "https://github.com/OpenChemistry/avogadroapp",
      "docs": "https://avogadro.cc/docs/",
      "vendor": "OpenChemistry / Avogadro Teams",
      "license": {
        "kind": "open-source",
        "spdx": "BSD-3-Clause",
        "text": "Permissive BSD 3-Clause license.",
        "source": "https://avogadro.cc/"
      },
      "price": {
        "text": "Free",
        "source": "https://avogadro.cc/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "2.1.0",
        "date": "2026-10-23",
        "source": "https://github.com/OpenChemistry/avogadroapp/releases/tag/2.1.0"
      },
      "engine": {
        "rendering": "Custom OpenGL/GLSL renderer; OpenGL framebuffer capture for PNG; Qt QPainter/QSvgGenerator for SVG.",
        "chemistry": "Avogadro Core and Open Babel",
        "ui": "Qt Widgets",
        "source": "https://github.com/OpenChemistry/avogadrolibs/tree/0060fab355983e9375bda5575401ec7548b17b1b/avogadro"
      },
      "languages": [
        "C++"
      ],
      "features": {},
      "caveats": [
        "SVG export projects the 3D model rather than laying out a 2D chemical document.",
        "Input generators require a configured Python environment."
      ],
      "github": {
        "url": "https://github.com/OpenChemistry/avogadroapp",
        "stars": 273,
        "checkedOn": "2026-11-06",
        "firstCommit": "2012-02-08",
        "commits": 2289,
        "contributors": 171,
        "pushedAt": "2026-11-05T19:10:11Z",
        "archived": false
      },
      "hands": null,
      "perf": null,
      "downloadBytes": 96021909,
      "references": [
        "https://github.com/OpenChemistry/avogadroapp",
        "https://avogadro.cc/"
      ]
    },
    {
      "id": "p63",
      "slug": "chemfig-editor",
      "name": "ChemFig Editor",
      "rank": 130,
      "builtOn": null,
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": null,
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "It compiles and previews user-written ChemFig/LaTeX source without providing a ChemDraw-style graphical drawing-document workflow.",
      "summary": "Browser interface for writing ChemFig/LaTeX code and compiling chemical structure images.",
      "website": "https://github.com/davidil98/chemfig_editor",
      "repo": "https://github.com/davidil98/chemfig_editor",
      "docs": "https://github.com/davidil98/chemfig_editor/blob/320b563bd3bf6acc99255d20cc176f777d7c8533/README.md",
      "vendor": "DaviT Ibarra",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT license; permits commercial use, modification and redistribution.",
        "source": "https://github.com/davidil98/chemfig_editor/blob/320b563bd3bf6acc99255d20cc176f777d7c8533/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/davidil98/chemfig_editor/blob/320b563bd3bf6acc99255d20cc176f777d7c8533/LICENSE"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/davidil98/chemfig_editor/releases"
      },
      "engine": {
        "rendering": "ChemFig/TikZ via pdfLaTeX; Poppler pdftoppm converts PDF to 300 dpi PNG for preview and export",
        "chemistry": null,
        "ui": "NiceGUI",
        "source": "https://github.com/davidil98/chemfig_editor/blob/320b563bd3bf6acc99255d20cc176f777d7c8533/src/chemfig_editor.py"
      },
      "languages": [
        "Python"
      ],
      "features": {},
      "caveats": [
        "UI exports PNG and .tex; the intermediate PDF is deleted.",
        "Conda instructions name environment.yml; the repository file is eviroment.yml.",
        "README misstates debounce and session isolation: preview polls every two seconds, and headers are shared across sessions."
      ],
      "github": {
        "url": "https://github.com/davidil98/chemfig_editor",
        "stars": 1,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-05-22",
        "commits": 3,
        "contributors": 1,
        "pushedAt": "2026-05-22T00:22:27Z",
        "archived": false
      },
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/davidil98/chemfig_editor",
        "https://github.com/davidil98/chemfig_editor/blob/320b563bd3bf6acc99255d20cc176f777d7c8533/README.md"
      ]
    },
    {
      "id": "p35",
      "slug": "chemicalize",
      "name": "Chemicalize",
      "rank": 131,
      "builtOn": null,
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=5KymEcdMwZU",
        "embed": "https://www.youtube-nocookie.com/embed/5KymEcdMwZU",
        "title": "One-click access to cutting-edge phys-chem properties",
        "author": "Certara - Chemaxon",
        "linkedFrom": "https://chemicalize.com/",
        "poster": "https://img.youtube.com/vi/5KymEcdMwZU/maxresdefault.jpg"
      },
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "Its advertised publication-ready Marvin JS drawing, journal presets, and image export support producing publication-grade 2D chemical figures.",
      "summary": "Browser service for chemical property prediction, structure search, and publication-oriented molecule drawing with Marvin JS.",
      "website": "https://chemicalize.com/",
      "repo": null,
      "docs": "https://docs.chemaxon.com/latest/chemicalize_index.html",
      "vendor": "Chemaxon (Certara)",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary hosted service with a free Basic tier and paid subscription plans.",
        "source": "https://docs.chemaxon.com/latest/chemicalize_single-user-subscribing.html"
      },
      "price": {
        "text": "2026-11-05: Free Basic plan advertised; paid subscription renewals restricted.",
        "source": "https://www.certara.com/announcement/modernizing-the-academic-program-and-retiring-chemicalize/"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://chemicalize.com/welcome"
      },
      "engine": {
        "rendering": "HTML5 canvas in Marvin JS; file-export rendering backend undisclosed",
        "chemistry": null,
        "ui": null,
        "source": "https://docs.chemaxon.com/latest/marvin-js_troubleshooting.html#sketch-does-not-appear-in-the-iframe-on-my-page"
      },
      "languages": [],
      "features": {},
      "caveats": [
        "Retirement is scheduled for June 30, 2027.",
        "Monthly renewals ended July 31, 2026; annual renewals are unavailable, despite subscription documentation still advertising both.",
        "Service-dependent Marvin JS capabilities remain unconfirmed for Chemicalize; no offline desktop application."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.certara.com/announcement/modernizing-the-academic-program-and-retiring-chemicalize/",
        "https://marvincloud.marvin.cxn.io/"
      ]
    },
    {
      "id": "p59",
      "slug": "live-chemdraw-mcp",
      "name": "live-chemdraw-mcp",
      "rank": 132,
      "builtOn": null,
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": null,
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "It automates an existing licensed ChemDraw installation rather than providing an independent chemical drawing application.",
      "summary": "An MCP server lets AI assistants draw and edit structures in a licensed ChemDraw window on Windows.",
      "website": "https://github.com/MALeitch/live-chemdraw-mcp#readme",
      "repo": "https://github.com/MALeitch/live-chemdraw-mcp",
      "docs": "https://github.com/MALeitch/live-chemdraw-mcp/blob/a9cebc6cf61e4d9b019463019626684fdf30beb6/README.md",
      "vendor": "Michael Leitch",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT-licensed automation server; ChemDraw is separately licensed.",
        "source": "https://github.com/MALeitch/live-chemdraw-mcp/blob/a9cebc6cf61e4d9b019463019626684fdf30beb6/LICENSE"
      },
      "price": {
        "text": "Free connector; separate ChemDraw license required (2026-11-05).",
        "source": "https://github.com/MALeitch/live-chemdraw-mcp/blob/a9cebc6cf61e4d9b019463019626684fdf30beb6/README.md"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "v1.0.0",
        "date": "2026-07-31",
        "source": "https://github.com/MALeitch/live-chemdraw-mcp/releases/tag/v1.0.0"
      },
      "engine": {
        "rendering": "ChemDraw via Windows COM automation",
        "chemistry": "RDKit",
        "ui": null,
        "source": "https://github.com/MALeitch/live-chemdraw-mcp/blob/a9cebc6cf61e4d9b019463019626684fdf30beb6/README.md"
      },
      "languages": [
        "Python"
      ],
      "features": {},
      "caveats": [
        "Requires licensed ChemDraw on Windows; validated with ChemDraw 26.",
        "Requires Python dependencies and configuration in an MCP client.",
        "Offline systematic name resolution downloads OPSIN and a Java runtime on first use."
      ],
      "github": {
        "url": "https://github.com/MALeitch/live-chemdraw-mcp",
        "stars": 2,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-07-13",
        "commits": 71,
        "contributors": 1,
        "pushedAt": "2026-08-04T16:49:20Z",
        "archived": false
      },
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/MALeitch/live-chemdraw-mcp",
        "https://github.com/MALeitch/live-chemdraw-mcp/blob/a9cebc6cf61e4d9b019463019626684fdf30beb6/README.md"
      ]
    },
    {
      "id": "p58",
      "slug": "live-ketcher-mcp",
      "name": "live-ketcher-mcp",
      "rank": 133,
      "builtOn": null,
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": null,
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "It automates an external Ketcher editor through MCP rather than providing its own publication drawing application, so it is not a standalone drawing tool.",
      "summary": "MCP server for AI-assisted editing and automation in a live Ketcher chemical structure editor.",
      "website": "https://github.com/MALeitch/live-ketcher-mcp",
      "repo": "https://github.com/MALeitch/live-ketcher-mcp",
      "docs": "https://github.com/MALeitch/live-ketcher-mcp/blob/1c9484b87da61577d4da3c95e0d297e2be4f9863/README.md",
      "vendor": "Michael Leitch",
      "license": {
        "kind": "open-source",
        "spdx": "MIT",
        "text": "MIT license; external Ketcher is separately licensed under Apache-2.0.",
        "source": "https://github.com/MALeitch/live-ketcher-mcp/blob/1c9484b87da61577d4da3c95e0d297e2be4f9863/LICENSE"
      },
      "price": {
        "text": "Free",
        "source": "https://github.com/MALeitch/live-ketcher-mcp/blob/1c9484b87da61577d4da3c95e0d297e2be4f9863/LICENSE"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://github.com/MALeitch/live-ketcher-mcp/releases"
      },
      "engine": {
        "rendering": "SVG through external Ketcher; no renderer bundled.",
        "chemistry": "RDKit Python dependency; Indigo WebAssembly through external Ketcher standalone.",
        "ui": "External Ketcher React UI controlled through Playwright.",
        "source": "https://github.com/epam/ketcher/blob/v3.12.0/README.md"
      },
      "languages": [
        "Python"
      ],
      "features": {},
      "caveats": [
        "Requires local Python 3.11+, Playwright Chromium, and an MCP client.",
        "Ketcher is not bundled; the default configuration loads EPAM's hosted demo.",
        "Early development; several planned tool families remain unimplemented."
      ],
      "github": {
        "url": "https://github.com/MALeitch/live-ketcher-mcp",
        "stars": 3,
        "checkedOn": "2026-11-06",
        "firstCommit": "2026-08-04",
        "commits": 8,
        "contributors": 1,
        "pushedAt": "2026-08-06T13:08:46Z",
        "archived": false
      },
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/MALeitch/live-ketcher-mcp",
        "https://github.com/MALeitch/live-ketcher-mcp/blob/1c9484b87da61577d4da3c95e0d297e2be4f9863/README.md"
      ]
    },
    {
      "id": "p09",
      "slug": "medchem-designer",
      "name": "MedChem Designer",
      "rank": 134,
      "builtOn": null,
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=JctqFyqv9EI",
        "embed": "https://www.youtube-nocookie.com/embed/JctqFyqv9EI",
        "title": "ADMET Predictor® Tutorial 2 MedChem Designer",
        "author": "Simulations Plus, Inc. ",
        "linkedFrom": "https://www.simulations-plus.com/resource/admet-predictor-tutorial-series-medchem-designer/",
        "poster": "https://i.ytimg.com/vi/JctqFyqv9EI/maxresdefault.jpg"
      },
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "It focuses on molecular sketching and ADMET prediction, while public documentation does not establish ChemDraw-style publication document production.",
      "summary": "A molecular sketcher for designing compounds and predicting selected ADMET properties.",
      "website": "https://www.simulations-plus.com/software/medchem-designer/",
      "repo": null,
      "docs": "https://admetpredictor.slp-software.com/admet-predictor-user-manual/ap14-release/1-8-4-medchem-designertm",
      "vendor": "Simulations Plus, Inc.",
      "license": {
        "kind": "freemium",
        "spdx": null,
        "text": "Proprietary; basic sketching and selected predictions are free, with additional functions requiring paid companion licenses.",
        "source": "https://www.simulations-plus.com/software/medchem-designer/"
      },
      "price": {
        "text": "Free; additional functions require paid companion licenses (2026-11-05).",
        "source": "https://www.simulations-plus.com/software/medchem-designer/"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": false,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": null,
        "date": null,
        "source": "https://www.simulations-plus.com/software/medchem-designer/"
      },
      "engine": {
        "rendering": null,
        "chemistry": "ADMET Predictor (property predictions)",
        "ui": null,
        "source": "https://www.simulations-plus.com/software/medchem-designer/"
      },
      "languages": [],
      "features": {},
      "caveats": [
        "Optical structure recognition requires a paid ADMET Predictor or MedChem Studio license.",
        "Download is gated by a vendor registration form.",
        "The full MedChem Designer manual is bundled with the ADMET Predictor installation."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://www.simulations-plus.com/software/medchem-designer/"
      ]
    },
    {
      "id": "p45",
      "slug": "molocular",
      "name": "MolOcular",
      "rank": 135,
      "builtOn": null,
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": null,
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "Publication-grade drawing document output is unverified for this experimental 2D structure editor, so it remains a related tool.",
      "summary": "A desktop 2D molecule editor for drawing structures and calculating molecular formulas and masses.",
      "website": "https://dr-rath.de/wolfgang-rath/tools/molocular.html",
      "repo": null,
      "docs": "https://dr-rath.de/wolfgang-rath/tools/molocular.html",
      "vendor": "Dr. Wolfgang Rath",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free download; reuse terms are not stated on the project page.",
        "source": "https://dr-rath.de/wolfgang-rath/tools/molocular.html"
      },
      "price": {
        "text": "Free",
        "source": "https://dr-rath.de/wolfgang-rath/tools/molocular.html"
      },
      "platforms": {
        "macos": false,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "1.1.0",
        "date": null,
        "source": "https://dr-rath.de/wolfgang-rath/tools/molocular.html"
      },
      "engine": {
        "rendering": null,
        "chemistry": null,
        "ui": null,
        "source": null
      },
      "languages": [],
      "features": {},
      "caveats": [
        "The author presents this release for testing the interface and drawing functionality.",
        "Binary ChemDraw .cdx files are unsupported; use CDXML.",
        "MOL/SDF export uses V3000, which V2000-only software cannot read."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": 22077032,
      "references": [
        "https://dr-rath.de/wolfgang-rath/tools/molocular.html"
      ]
    },
    {
      "id": "p18",
      "slug": "molview-org",
      "name": "MolView.org",
      "rank": 136,
      "builtOn": null,
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": {
        "provider": "youtube",
        "url": "https://www.youtube.com/watch?v=xDr9hn7cpLA",
        "embed": "https://www.youtube-nocookie.com/embed/xDr9hn7cpLA",
        "title": "MolView 2.2 preview",
        "author": "MolView",
        "linkedFrom": "https://blog.molview.org/posts/2015/06/01/looking-back/",
        "poster": "https://i.ytimg.com/vi/xDr9hn7cpLA/maxresdefault.jpg"
      },
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "MolView.org focuses on 3D visualization, and its basic sketcher lacks reaction mechanisms, custom styles and SVG export for publication document work.",
      "summary": "A browser-based tool for sketching molecules, exploring chemical databases and visualizing structures in 3D.",
      "website": "https://molview.org/",
      "repo": "https://github.com/molview/molview",
      "docs": "https://molview.org/",
      "vendor": "Herman Bergwerf",
      "license": {
        "kind": "source-available",
        "spdx": null,
        "text": "Public source code; redistribution requires written permission. Generated content may be used commercially.",
        "source": "https://molview.org/legal"
      },
      "price": {
        "text": "Free",
        "source": "https://molview.com/article/new-app/"
      },
      "platforms": {
        "macos": false,
        "windows": false,
        "linux": false,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": "v2.4.6",
        "date": "2015-07-13",
        "source": "https://github.com/molview/molview/releases/tag/v2.4.6"
      },
      "engine": {
        "rendering": "HTML canvas 2D through MolPad; GLmol and ChemDoodle WebGL viewers, with JSmol as another 3D renderer.",
        "chemistry": "Ketcher chemical utilities; JSmol calculations; NCI/CADD Chemical Identifier Resolver web service.",
        "ui": "jQuery with HTML and CSS",
        "source": "https://github.com/molview/molview/blob/c92563ab813d50b5462f305329ee9c0a7a67ce63/src/js/Sketcher.js"
      },
      "languages": [
        "JavaScript",
        "PHP",
        "HTML",
        "Less"
      ],
      "features": {},
      "caveats": [
        "Legacy app is deprecated and receives only critical bug fixes.",
        "Structure images export as PNG; SVG export, reaction mechanisms and custom styles are unavailable.",
        "The newer MolView at molview.com has separate features and pricing."
      ],
      "github": {
        "url": "https://github.com/molview/molview",
        "stars": 242,
        "checkedOn": "2026-11-06",
        "firstCommit": "2014-07-05",
        "commits": 230,
        "contributors": 5,
        "pushedAt": "2026-07-06T00:19:27Z",
        "archived": false
      },
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/molview/molview",
        "https://molview.org/",
        "https://molview.org/legal"
      ]
    },
    {
      "id": "p37",
      "slug": "open-babel",
      "name": "Open Babel",
      "rank": 137,
      "builtOn": null,
      "appKind": {
        "desktop": true,
        "web": false
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": null,
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "Open Babel converts chemical data and generates depictions, but its conversion GUI does not provide ChemDraw-style drawing document authoring.",
      "summary": "A chemical data conversion toolkit for translating file formats, analyzing molecules, and generating molecular depictions.",
      "website": "https://openbabel.org/",
      "repo": "https://github.com/openbabel/openbabel",
      "docs": "https://openbabel.org/docs/",
      "vendor": "The Open Babel Team",
      "license": {
        "kind": "open-source",
        "spdx": "GPL-2.0-only",
        "text": "GNU General Public License version 2.",
        "source": "https://github.com/openbabel/openbabel/blob/0e94434fa75c9f61095023e3c12e0d5f2ac035ff/README.md"
      },
      "price": {
        "text": "Free",
        "source": "https://openbabel.org/docs/Introduction/faq.html#general"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": false,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "openbabel-3-2-1",
        "date": "2026-07-11",
        "source": "https://github.com/openbabel/openbabel/releases/tag/openbabel-3-2-1"
      },
      "engine": {
        "rendering": "Open Babel OBDepict with SVGPainter for SVG and CairoPainter/Cairo for PNG; SVG displayed in an external browser.",
        "chemistry": "Open Babel (in-house C++ chemistry toolkit)",
        "ui": "wxWidgets (optional desktop GUI)",
        "source": "https://github.com/openbabel/openbabel/tree/9be528bcdb31a219637ae3d1699170a8aaa5be6d"
      },
      "languages": [
        "C++"
      ],
      "features": {},
      "caveats": [
        "The GUI converts chemical data and displays structures in an external browser.",
        "PNG depiction requires a build with Cairo.",
        "The manual still calls 3.2.0 current; the latest release is 3.2.1."
      ],
      "github": {
        "url": "https://github.com/openbabel/openbabel",
        "stars": 1406,
        "checkedOn": "2026-11-06",
        "firstCommit": "2001-11-27",
        "commits": 6625,
        "contributors": 186,
        "pushedAt": "2026-09-14T13:06:15Z",
        "archived": false
      },
      "hands": null,
      "perf": null,
      "downloadBytes": 38665910,
      "references": [
        "https://github.com/openbabel/openbabel",
        "https://openbabel.org/docs/FileFormats/Overview.html"
      ]
    },
    {
      "id": "p40",
      "slug": "pubchem-sketcher",
      "name": "PubChem Sketcher",
      "rank": 138,
      "builtOn": null,
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": {
        "provider": "file",
        "url": "https://www.nlm.nih.gov/oet/ed/pubchem/searching-structures.mp4",
        "embed": null,
        "title": "Searching Structures in PubChem",
        "author": null,
        "linkedFrom": "https://www.nlm.nih.gov/oet/ed/pubchem/videos.html",
        "poster": "https://www.nlm.nih.gov/oet/ed/pubchem/searching-structures.jpg"
      },
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "Its documented workflow creates PubChem query structures and exports them for further publication cleanup in ChemDraw, rather than authoring complete drawing documents.",
      "summary": "A browser editor for drawing chemical structures as PubChem search queries and exporting structure files or images.",
      "website": "https://pubchem.ncbi.nlm.nih.gov/edit/",
      "repo": null,
      "docs": "https://pubchem.ncbi.nlm.nih.gov/sketch/sketchhelp.html",
      "vendor": "National Center for Biotechnology Information, U.S. National Library of Medicine (NIH)",
      "license": {
        "kind": "free",
        "spdx": null,
        "text": "Free hosted service; public-domain interface and server scripts depend on the proprietary CACTVS interpreter.",
        "source": "https://pmc.ncbi.nlm.nih.gov/articles/PMC2820498/"
      },
      "price": {
        "text": "Free",
        "source": "https://pmc.ncbi.nlm.nih.gov/articles/PMC2820498/"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": false
      },
      "version": {
        "name": "V2.4",
        "date": null,
        "source": "https://pubchem.ncbi.nlm.nih.gov/edit3/index.html"
      },
      "engine": {
        "rendering": "Server-side CACTVS depiction and export; GD renders PNG/GIF images displayed in the browser.",
        "chemistry": "CACTVS",
        "ui": "Custom HTML and JavaScript",
        "source": "https://pmc.ncbi.nlm.nih.gov/articles/PMC2820498/"
      },
      "languages": [
        "JavaScript"
      ],
      "features": {},
      "caveats": [
        "Editing and rendering require a connection to PubChem servers.",
        "The manual documents only one undoable operation.",
        "Self-hosting requires a proprietary CACTVS interpreter in addition to the public-domain scripts."
      ],
      "github": null,
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://pubchem.ncbi.nlm.nih.gov/docs/imaging-services",
        "https://pubchem.ncbi.nlm.nih.gov/docs/structures"
      ]
    },
    {
      "id": "p36",
      "slug": "rdkit",
      "name": "RDKit / MolDraw2D",
      "rank": 139,
      "builtOn": null,
      "appKind": {
        "desktop": false,
        "web": true
      },
      "plans": [],
      "renderer": null,
      "enginesChecked": false,
      "languageNote": null,
      "video": null,
      "embedding": null,
      "otherLanguages": null,
      "thirdParty": {
        "summary": null,
        "source": null,
        "notice": null,
        "libraries": []
      },
      "tier": "related",
      "tierReason": "RDKit/MolDraw2D is a cheminformatics and depiction library without an interactive chemical drawing document editor.",
      "summary": "A cheminformatics library for generating 2D molecular depictions from code.",
      "website": "https://www.rdkit.org/",
      "repo": "https://github.com/rdkit/rdkit",
      "docs": "https://rdkit.org/docs/source/rdkit.Chem.Draw.rdMolDraw2D.html",
      "vendor": "RDKit contributors",
      "license": {
        "kind": "open-source",
        "spdx": "BSD-3-Clause",
        "text": "Permissive BSD 3-Clause license, including commercial use.",
        "source": "https://github.com/rdkit/rdkit/blob/fece8caa860bdf6c9c82bdb9253f22a0cf87150c/license.txt"
      },
      "price": {
        "text": "Free",
        "source": "https://rdkit.org/docs/Overview.html#open-source-toolkit-for-cheminformatics"
      },
      "platforms": {
        "macos": true,
        "windows": true,
        "linux": true,
        "web": true,
        "ios": false,
        "android": false,
        "offline": true
      },
      "version": {
        "name": "Release_2026_09_2",
        "date": "2026-11-05",
        "source": "https://github.com/rdkit/rdkit/releases/tag/Release_2026_09_2"
      },
      "engine": {
        "rendering": "C++ MolDraw2D renderer with SVG and Cairo PNG backends",
        "chemistry": "RDKit",
        "ui": null,
        "source": "https://rdkit.org/docs/source/rdkit.Chem.Draw.rdMolDraw2D.html"
      },
      "languages": [
        "C++",
        "Python"
      ],
      "features": {},
      "caveats": [
        "Requires programming; no standalone chemical drawing document editor.",
        "Current PyPI macOS wheels support Apple Silicon only.",
        "PNG output requires Cairo support when building from source."
      ],
      "github": {
        "url": "https://github.com/rdkit/rdkit",
        "stars": 3670,
        "checkedOn": "2026-11-06",
        "firstCommit": "2006-05-06",
        "commits": 8738,
        "contributors": 297,
        "pushedAt": "2026-11-05T14:04:05Z",
        "archived": false
      },
      "hands": null,
      "perf": null,
      "downloadBytes": null,
      "references": [
        "https://github.com/rdkit/rdkit",
        "https://rdkit.org/docs/GettingStartedInPython.html"
      ]
    }
  ]
}