Docs and methods
Drybench Molecule.
How the molecule app computes its descriptors, scores, shapes and neighbours, what it lets you take away, how its chemistry is checked against Python RDKit and what it sends where.
Updated 5 October 2026 · v0.1.0
Methods
What the app shows, how it works and how it was built, in the words of its own write-up, followed by the parameter defaults and the data sources with their licences.
What it shows
Give it a molecule by drawing it, pasting a SMILES string or typing a name, and it reports the standard medicinal-chemistry descriptors (molecular weight, Crippen logP, polar surface area, hydrogen-bond donors and acceptors, rotatable bonds, rings, fraction sp3), Lipinski's rule of 5 and Veber's rules with the reason for each pass or fail, the QED drug-likeness score with the eight inputs that set it, and any PAINS substructure alerts.
It then builds a 3D shape, finds the ten most structurally similar approved drugs, and places the molecule on a map of 2,197 approved small-molecule drugs from ChEMBL 37, so you can see whether its property profile looks like that of approved drugs (ChEMBL max_phase 4: approved in at least one country, including some later withdrawn). The map colours each drug by the routes ChEMBL records for it: oral, parenteral (injected or infused) but not oral, topical only, or other or unknown; a drug given both by mouth and by injection counts as oral. Lipinski's rule of 5 is about absorption and permeation and Veber's rules about oral bioavailability, so the colours show where orally given drugs sit among the rest. They are records for approved drugs, not a forecast for your molecule. Links of the form ?smiles= or ?name= open a molecule directly, and the address updates as you work, so any view can be shared. If a link has both, the SMILES decides the structure and the name is only a label.
How it works
All chemistry runs in your browser, apart from the opening example (imatinib), whose results the pipeline works out in advance with the same code, so opening the page does not download the chemistry engine; it loads when you choose, type or draw a molecule, or open a link to one. RDKit.js (the RDKit C++ toolkit compiled to WebAssembly) runs in a Web Worker and computes the descriptors, the 2D drawing and Morgan fingerprints (radius 2, 2,048 bits). RDKit.js has no QED, no PAINS catalogue and no similarity function, so those are ported: QED follows RDKit's QED.py with the same patterns, parameters and weights, PAINS uses the 480 filters from RDKit's FilterCatalog, and Tanimoto similarity is computed on the fingerprint bits. A salt or other multi-part input is described by its largest organic fragment (imatinib mesylate as imatinib), unless another part holds a metal other than a simple counter-ion such as sodium or calcium: PubChem writes carboplatin as its ligands plus a separate platinum ion, so such an input is kept whole and treated as a metal complex. A structure that matches a library drug only after redrawing, such as another tautomer, is recognised by its standard InChIKey.
The ports are checked against Python RDKit of the same release (2026.03.6). On all 2,197 library drugs, the browser gives the same QED to within 3 × 10⁻¹⁶, the same descriptors, formulae and canonical SMILES, the same Morgan bits and the same PAINS matches; 124 of those drugs match at least one PAINS filter, so the positive case is covered too.
The 3D shape comes from OpenChemLib in a second worker: its conformer generator starts from the most likely torsion angles in its built-in torsion tables and avoids clashes, then the MMFF94s+ force field minimises the result. 3Dmol.js draws it. The map is a principal component analysis of nine standardised descriptors. Your molecule is projected with the stored means, standard deviations and loadings, so it lands in the same fixed space as the library, and a drug already in the library lands exactly on its own point.
How it was built
A Node pipeline downloads every approved molecule that ChEMBL types as a small molecule (max_phase 4) from the ChEMBL web services with timeouts and retries, checks that the release is ChEMBL 37, keeps the 2,197 parent molecules that have a structure, describes each with the same RDKit.js code the page uses, fits the PCA and writes one 250 KB JSON file (about 80 KB compressed) with ChEMBL ids, names, SMILES, ChEMBL approval year (its first_approval field), route flags and map coordinates. For the route flags it also downloads every ChEMBL record flagged oral, parenteral or topical, so a flag that ChEMBL sets only on a salt or other form of a drug still counts for the drug. The pipeline also runs the page's own analysis and similarity code on the opening example and saves the result (about 27 KB compressed); a test checks that it matches what the page computes. A Python script with RDKit produces the reference values the tests compare against and converts RDKit's PAINS definitions.
Fingerprints are not shipped. Storing them would add about 110 KB compressed, while computing them from the SMILES takes a second or two in the background worker once RDKit has loaded (the page shows the time it took on your device), and guarantees they match the query fingerprint bit for bit. Names are resolved against the library first and then with PubChem's PUG REST service, using its current SMILES property (requests for the older IsomericSMILES and CanonicalSMILES names now return SMILES and ConnectivitySMILES).
Parameter defaults
- Engine
- RDKit.js 2026.03.6 (WebAssembly) in a Web Worker; OpenChemLib in a second worker for the 3D conformer.
- Fingerprints
- Morgan, radius 2, 2,048 bits; similarity is the Tanimoto coefficient on those bits.
- Similar drugs
- The ten most similar approved drugs in the shipped library.
- Rules of thumb
- Lipinski's rule of 5 allows one violation; Veber's rules allow none.
- QED and PAINS
- QED as RDKit's QED.py (same patterns, parameters and weights); PAINS from the 480 filters of RDKit's FilterCatalog.
- Map
- A principal component analysis of nine standardised descriptors over the 2,197 approved small-molecule drugs of ChEMBL 37.
- Input limits
- SMILES up to 2,000 characters and structures up to 500 heavy atoms; the editor draws up to 150 atoms.
Data sources, licences and versions
Sources and licences
- ChEMBL 37CC BY-SA 3.0
Approved small-molecule drugs: structures, names, ChEMBL approval years (first_approval), withdrawal flags and route-of-administration flags (oral, parenteral, topical), which colour the map. The derived library file is shared under the same licence.
ChEMBL, release 37 (1 May 2026), EMBL-EBI. Mendez D et al. ChEMBL: towards direct deposition of bioassay data. Nucleic Acids Res 2019;47:D930-D940. Zdrazil B et al. Nucleic Acids Res 2024;52:D1180-D1192. doi:10.6019/CHEMBL.database.37
- PubChem PUG REST (NCBI)No NCBI restrictions; depositor terms may apply
Looks up a structure by name when the name is not in the library. Fetched live at your request; nothing from PubChem is stored or shipped. NCBI places no restrictions on the data, but some depositors may claim rights (see NCBI's disclaimer and copyright notice, linked beside every PubChem result).
PubChem, National Center for Biotechnology Information (NLM/NIH). Kim S et al. PubChem 2025 update. Nucleic Acids Res 2025;53:D1516-D1525.
- RDKit and RDKit.js 2026.03.6BSD-3-Clause
Descriptors, depictions, fingerprints and substructure search in the browser; QED.py and the PAINS filter definitions ported from it.
Copyright (c) 2006-2015, Rational Discovery LLC, Greg Landrum, and Julie Penzotti and others; QED.py copyright (c) 2009-2017, Novartis Institutes for BioMedical Research Inc.
- InChI (bundled in RDKit.js)MIT
Standard InChIKeys, to recognise a library drug drawn as a different tautomer or salt form.
Copyright (c) 2024 InChI Project.
- OpenChemLib JS 9.25.0BSD-3-Clause
Structure editor, 3D conformer generation and MMFF94s+ minimisation, including its torsion and force-field tables.
Copyright (c) 2015-2017, cheminfo.
- 3Dmol.js 2.5.5BSD-3-Clause
3D display of the conformer.
Copyright (c) 2014, University of Pittsburgh and contributors. Rego N, Koes D. 3Dmol.js: molecular visualization with WebGL. Bioinformatics 2015;31:1322-1324.
- QED: Bickerton et al. 2012Method (cited)
Quantitative estimate of drug-likeness. Nat Chem 2012;4:90-98.
- PAINS: Baell and Holloway 2010Method (cited)
Pan-assay interference substructure filters. J Med Chem 2010;53:2719-2740.
- Rule of 5 and Veber's rulesMethods (cited)
Lipinski et al. Adv Drug Deliv Rev 1997;23:3-25, reprinted 2001;46:3-26. Veber et al. J Med Chem 2002;45:2615-2623.
- Crippen logP, TPSA and Morgan fingerprintsMethods (cited)
Wildman SA, Crippen GM. J Chem Inf Comput Sci 1999;39:868-873 (logP). Ertl P, Rohde B, Selzer P. J Med Chem 2000;43:3714-3717 (topological polar surface area). Rogers D, Hahn M. J Chem Inf Model 2010;50:742-754 (extended-connectivity fingerprints, which Morgan fingerprints implement).
Times on screen are local time with the UTC offset; times in exports are UTC. Dates with no time are shown at the precision the source gave them.
Exports
Today the app has no file export. What you can take away is the address, whose ?smiles= or ?name= link reopens the same molecule, and the canonical SMILES, which the Copy SMILES button puts on your clipboard. The library's licence (ChEMBL, CC BY-SA 3.0) and release are shown beside the results.
Release gate: before the app leaves the preview, its exports and printed reports will carry the data versions, parameters, limits and a timestamp needed to reproduce a result, as the regulatory position says. This section will describe each format as it ships.
Verification
Each module below is a set of automated tests in the app's source code, with the expected results written into the tests. They check the app's logic against recorded inputs and stored reference records; none of them calls a live service.
- src/components/tools/molecule-workbench/fixtures/rdkit-reference.json
- Expected outputs from Python RDKit 2026.03.6 (descriptors, QED, PAINS matches and Morgan bits) for reference molecules, written by pipeline/molecule-workbench/rdkit_reference.py. The browser's results are compared with it.
- src/components/tools/molecule-workbench/chem.test.ts
- The fixture and RDKit.js are the same RDKit release; descriptors, QED, PAINS and Morgan bits match Python RDKit; invalid and oversized input is refused; salts, metal complexes and unspecified stereocentres are handled; a tautomer of a library drug has the same standard InChIKey.
- src/components/tools/molecule-workbench/logic.test.ts
- Tanimoto on packed bits equals set Tanimoto in Python RDKit, nearest-neighbour ranking, the PCA and the stored map projection, Lipinski and Veber, deep links, PubChem property names, the library file's licence and release, route flags and formula ordering.
- src/components/tools/molecule-workbench/default-example.test.ts
- The precomputed opening example (imatinib) equals what the worker computes from the current library.
Release gate: before the app leaves the preview, each release will publish a verification dataset with expected outputs on this page, so you can run your own checks. None has been published yet.
Security overview
The app is a set of static files that runs in your browser, with no account and no server of ours in the data path. The privacy statement, the hosts it contacts and the headers its workspace is served with are generated from its registry entry, the same record that sets the browser's policy.
What leaves your browser
What leaves your device. Requests for Drybench Molecule's own files (pages, scripts, data files and images) go to the host that serves it. That host keeps standard web-server logs (IP address, user agent, requested address, time). Anything in the address bar before the # (a search, a SMILES, an accession or a step) is sent to this site's host when a page loads or a link is opened; anything after the # is not sent. The names you type that are not in the app's library go directly from your browser to the public services in the table below, exactly as if you used their websites; they see those identifiers and your IP address, under their own terms. Nothing else leaves your device: the app carries no analytics and no error reporting, loads no font or script from any other origin, and there is no server of ours in the data path.
What never leaves your device. Anything you save in the app, your preferences, and anything you have not chosen to export or share. They live in this browser's storage on this device.
Where you choose to send data. A link you copy carries what you were looking at (the SMILES or name); anyone who receives it can read it, and mail and chat tools may fetch the link to show a preview. A file you export or share goes wherever you send it.
Hosts the app contacts
pubchem.ncbi.nlm.nih.gov
- Operator
- NCBI, U.S. National Library of Medicine
- What for
- Looks up a structure by name when the name is not in the app's library of approved drugs.
- What it receives
- the name you typed
- When
- on lookup
Headers the workspace is served with
These are the exact header values, generated from the app's registry entry.
- Content-Security-Policy
- default-src 'self'; script-src 'self' 'unsafe-inline' 'wasm-unsafe-eval'; worker-src 'self' blob:; connect-src 'self' https://pubchem.ncbi.nlm.nih.gov blob:; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; font-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'
- Referrer-Policy
- no-referrer
- Permissions-Policy
- camera=(), microphone=(), geolocation=(), payment=(), usb=()
- X-Content-Type-Options
- nosniff
- Cross-Origin-Opener-Policy
- same-origin
Limits
- 1. For research and education only. It is not a prediction of whether any molecule will work, be absorbed or be safe, and it is not medical advice.
- 2. Rules of thumb and QED describe typical oral drugs. Many approved drugs break them (natural products, antibiotics, drugs taken up by transporters, injectables), so a fail is a prompt to look closer, not a verdict. They are not given for metal complexes or inorganic salts, which they were never fitted to.
- 3. Crippen logP and TPSA are fast calculated estimates (the Wildman-Crippen and Ertl methods), not measurements; Crippen logP is not the BioByte CLOGP that Lipinski used. The rotatable-bond count uses RDKit's strict definition, which can differ from the software used in the original papers.
- 4. A salt or mixture is described by its largest organic fragment, with its charge as drawn: the tool does not neutralise it. If a smaller fragment holds a metal other than a simple counter-ion such as sodium, potassium, magnesium or calcium, the whole input is kept instead.
- 5. The 3D shape is one conformer from a single seeded run, minimised in vacuum. Real molecules move between many shapes, and a bound drug may look different. Stereocentres not defined in the input (racemic drugs such as ibuprofen and thalidomide, for example) are given an arbitrary configuration in 3D. Molecules with over 100 heavy atoms (in the largest fragment) are not built, large or ring-rich ones (cyclosporin, for example) can take a minute or more, and metal complexes are not modelled.
- 6. The library holds approved parent molecules that ChEMBL types as small molecules and that have a structure. Drugs without a structure (many metal complexes, such as cisplatin, and mixtures) are missing. So are drugs ChEMBL types as proteins, oligosaccharides or unknown, which include peptides and some small molecules such as theophylline, ciclosporin, carfilzomib and acarbose.
- 7. Route groups come from ChEMBL's oral, parenteral and topical flags, which mark routes a drug is known to be given by. They are records, not predictions, and the tool does not say whether any molecule would be orally active. A missing flag means ChEMBL has none, not that the route is never used. ChEMBL counts inhaled and eye products as topical (salmeterol, latanoprost). A flag set only on a salt or other form counts for the drug; this adds one, bortezomib. Of the 2,197 drugs, 1,268 are oral, 371 parenteral but not oral, 221 topical only and 337 other or unknown.
- 8. 75 library drugs are stored by ChEMBL as salts (sodium benzoate, for example) and are compared as stored, so a salt can score below 1.00 against its own parent.
- 9. Approval years are ChEMBL's first_approval field. For many older drugs this is the US approval year, which can be decades after the drug was first used elsewhere: metformin shows 1995, but it was first reported as a diabetes treatment in France in 1957 (Bailey CJ, Diabetologia 2017;60:1566-1576). Some drugs have no year, including many approved only outside the US (gliclazide and domperidone) and a few approved in the US (bortezomib, approved in 2003); some drugs approved only outside the US do have one (agomelatine, 2009). 268 of the 2,197 drugs are flagged by ChEMBL as withdrawn for toxicity in at least one country; they stay in the library and on the map.
- 10. The map keeps 68% of the variance in the nine descriptors (43% on the first axis, 25% on the second), so points close on the map can still differ in ways the map does not show. It compares properties, not structures or targets.
Next step
Want this tuned to your pipeline?
Email m.beale@me.com with what you need, or use the contact page.
Available from September 2026 for full-time roles and selected freelance projects.