Generative Chemistry Studio Valid molecule candidates RDKit scoring Research guardrails

Generate, score, learn
and prioritize drug-like ideas

A transparent generative chemistry workflow for early discovery: enumerate genuinely new, valid candidate ideas with BRICS fragment recombination, render real 2D structures, score them by properties, liability alerts, novelty, diversity, heuristic docking, multi-objective optimization, scaffold strategy, and complete report generation.

API status
Checking...
Engine mode
BRICS fragment recombination + RDKit scoring + 2D depiction
Top MPO
Best affinity
How to create a generative chemistry report
1. Set target & scaffoldChoose target, scaffold class, molecule count, and objective.
2. Generate candidatesCreate valid candidate ideas with transparent generation metadata.
3. Score & filterRank by MPO, properties, alerts, synthesizability, novelty and diversity.
4. Run loop & reportRun generate-score-learn loop and download/share full report.
This product is intentionally transparent: candidate generation uses BRICS fragment recombination (Degen et al. 2008), a published combinatorial-chemistry method that recombines real molecular fragments into new, valid, RDKit-verified structures — with a template/seed fallback when a scaffold class runs out of fragment combinations. It does not claim validated RL, REINVENT, MOSES, real docking, or clinical decision support.
Scientific guardrails
Use this for research hypothesis generation only. Confirm chemical validity, synthesis feasibility, novelty/IP, ADMET, tox, real docking, target-specific QSAR, and experimental assay data before decisions.
Valid SMILES Property constraints Liability alerts Novelty/diversity Experimental follow-up
User outputs
View full report Download JSON Download HTML Download Word Download CSV Share summary
Generate Candidate Ideas
Generated Candidate JSON

Generated candidates are automatically copied here. You can edit or paste your own candidate list for scoring.

Candidate Scoring

Score candidates by RDKit properties, heuristic docking, MPO, liability alerts and synthesizability.

Candidate Summary
Generate or paste candidates, then score them to view ranking and top candidate summary.
Generate → Score → Learn Loop
Learning Curve
Multi-Objective Optimization
Novelty & Diversity
Scaffold Strategy
Property Constraints
Complete Report Center
Create a complete report, then view it here or download/share it.
Raw JSON
{}
`; } function downloadReport(type){ const data = state.lastReport || state.lastRaw; if(!data || !Object.keys(data).length){ toast('Create a report first','err'); return; } const name = slug(); if(type === 'json') download(`${name}.json`, pretty(data), 'application/json'); if(type === 'html') download(`${name}.html`, reportHTML(), 'text/html'); if(type === 'doc') download(`${name}.doc`, reportHTML(), 'application/msword'); } function collectCandidateRowsForCSV(){ return state.lastReport?.candidate_scoring?.ranked_candidates || state.lastReport?.complete_loop?.generation?.candidates || state.lastScore?.ranked_candidates || state.lastGenerate?.candidates || []; } function downloadCSV(){ const rows = collectCandidateRowsForCSV(); if(!rows.length){ toast('No candidate rows available','err'); return; } const headers = ['id','smiles','mpo_score','docking_affinity_heuristic','synthesizability_score','MW','LogP','TPSA','QED','similarity_to_nearest_seed','priority','design_move']; const csvRows = rows.map(c => { const p = c.properties || {}; const meta = c.generation_metadata || {}; return [ c.id || '', c.canonical_smiles || c.smiles || '', c.mpo_score ?? '', c.docking_affinity_heuristic ?? '', c.synthesizability_score ?? '', p.molecular_weight ?? '', p.logP ?? '', p.TPSA ?? '', p.QED ?? '', c.similarity_to_nearest_seed ?? '', c.priority ?? '', meta.design_move || c.design_move || '' ]; }); const csv = [headers, ...csvRows].map(r=>r.map(x=>`"${String(x).replace(/"/g,'""')}"`).join(',')).join('\n'); download(`${slug()}-candidates.csv`, csv, 'text/csv'); } async function shareReport(){ const data = state.lastReport || state.lastRaw; if(!data || !Object.keys(data).length){ toast('Create a report first','err'); return; } const top = data.candidate_scoring?.top_candidate || data.complete_loop?.generation?.top_candidate || state.lastScore?.top_candidate || state.lastGenerate?.top_candidate; const text = `Generative Chemistry Report\nTarget: ${$('target').value || '—'}\nTop MPO: ${top?.mpo_score ?? '—'}\nBest affinity heuristic: ${top?.docking_affinity_heuristic ?? '—'}\nResearch-use only.`; if(navigator.share){ try{ await navigator.share({title:'Generative Chemistry Report', text}); toast('Share sheet opened'); }catch(e){} }else{ navigator.clipboard.writeText(text + '\n\n' + pretty(data).slice(0,3000)); toast('Share text copied'); } } function init(){ initTabs(); loadExample(); healthCheck(); setRaw({ready:true, app:'Generative Chemistry Studio', endpoints:[ '/generative/gold/health', '/generative/gold/constraints', '/generative/gold/generate', '/generative/gold/score-candidates', '/generative/gold/novelty-diversity', '/generative/gold/optimize', '/generative/gold/scaffold-strategy', '/generative/gold/complete-loop', '/generative/gold/learning-curve', '/generative/gold/report' ]}); } init();