Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Rowan is a cloud-native molecular modeling and medicinal-chemistry workflow platform with a Python API. Use for pKa and macropKa prediction, conformer and tautomer ensembles, docking and analogue docking, protein-ligand cofolding, MSA generation, molecular dynamics, permeability, descriptor workflows, and related small-molecule or protein modeling tasks. Ideal for programmatic batch screening, multi-step chemistry pipelines, and workflows that would otherwise require maintaining local HPC/GPU in
.claude/skills/k-dense-ai-rowan/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 90% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 56% | 0% |
Rowan is a cloud-native workflow platform for molecular simulation, medicinal chemistry, and structure-based design. Its Python API exposes a unified interface for small-molecule modeling, property prediction, docking, molecular dynamics, and AI structure workflows.
Use Rowan when you want to run medicinal-chemistry or molecular-design workflows programmatically without maintaining local HPC infrastructure, GPU provisioning, or a collection of separate modeling tools. Rowan handles all infrastructure, result management, and computation scaling.
Rowan is a good fit for:
Rowan is not the right fit for:
bashuv pip install rowan-python
pythonimport rowan rowan.api_key = "your_api_key_here" # or set ROWAN_API_KEY env var # Descriptors require a 3D Molecule, not a bare SMILES string. mol = rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O") wf = rowan.submit_descriptors_workflow(mol, name="aspirin") result = wf.result() print(result.descriptors["MW"]) # 180.042 — exact mass print(result.descriptors["SLogP"]) # 1.31 print(result.descriptors["TopoPSA"]) # 63.6 — topological PSA
If that prints without error, you're set up correctly. These values and examples were verified against rowan-python 3.1.13.
bashuv pip install rowan-python # or: uv pip install rowan-python
Set an API key via environment variable (recommended):
bashexport ROWAN_API_KEY="your_api_key_here"
Or set directly in Python:
pythonimport rowan rowan.api_key = "your_api_key_here"
Verify authentication:
pythonimport rowan user = rowan.whoami() # Returns user info if authenticated print(f"User: {user.email}") print(f"Credits available: {user.credits_available_string()}")
Rowan accepts molecules in the following formats:
"CCO", "c1ccccc1O""InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3"The API validates molecule inputs and raises ValueError for an unparseable SMILES or a workflow-incompatible input type. Always use canonicalized SMILES for reproducibility.
Accepted input types vary by workflow in rowan-python 3.1.13. Only these common workflows accept a bare string: pKa, conformer search, membrane permeability, ADMET, LogP, macropKa, solubility, and pose-analysis MD. Most others — including descriptors, tautomer search, docking, analogue docking, BDE, NMR, and Fukui — require rowan.Molecule.from_smiles(smiles) or an RDKit Mol/RWMol. A wrong type raises ValueError before submission.
Tip: Use RDKit to validate SMILES before submission:
pythonfrom rdkit import Chem smiles = "CCO" mol = Chem.MolFromSmiles(smiles) if mol is None: raise ValueError(f"Invalid SMILES: {smiles}")
Most Rowan tasks follow the same three-step pattern:
pythonimport rowan # 1. Submit — use the specific workflow function (not the generic submit_workflow) workflow = rowan.submit_descriptors_workflow( rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O"), name="aspirin descriptors", ) # 2. & 3. Wait and retrieve result = workflow.result() # Blocks until done (default: wait=True, poll_interval=5) print(result.data) # Raw dict print(result.descriptors["MW"]) # 180.042 exact mass; no result.molecular_weight property
For long-running workflows, use streaming:
pythonfor partial in workflow.stream_result(poll_interval=5): print(f"Complete: {partial.complete}") # bool, not a percentage print(partial.data)
| Pattern | Use When | Duration | |---------|----------|----------| | result() | You can wait for the full result | <5 min typical | | stream_result() | You want progress feedback or need early partial results | >5 min, or interactive use |
Guideline: Use result() for descriptors, pKa. Use stream_result() for conformer search, docking, cofolding.
Rowan's API includes typed workflow result objects with convenience properties.
Results have two access patterns:
result.descriptors, result.best_pose, result.scores. Result classes differ: conformer search uses get_energies() and get_conformers() methods.result.data — raw dictionary from the APIExample:
pythonresult = rowan.submit_descriptors_workflow( rowan.Molecule.from_smiles("CCO"), name="ethanol", ).result() # Convenience property (returns all descriptors): print(result.descriptors["MW"]) # exact/monoisotopic mass print(result.descriptors["SLogP"]) print(result.descriptors["TopoPSA"]) # usual topological PSA # Raw data fallback: print(result.data["descriptors"])
Note: DescriptorsResult does not have a molecular_weight property. MW is exact/monoisotopic mass, not average molecular weight. TPSA is a 3D charged-surface descriptor; use TopoPSA for the usual topological polar surface area used in drug-likeness rules.
Some result properties are lazily loaded (e.g., conformer geometries, protein structures). To refresh:
pythonresult.clear_cache() new_structures = result.get_conformers() # Refetched for ConformerSearchResult
For nontrivial campaigns, use projects and folders to keep work organized.
pythonimport rowan # Create a project project = rowan.create_project(name="CDK2 lead optimization") rowan.set_project("CDK2 lead optimization") # All subsequent workflows go into this project wf = rowan.submit_descriptors_workflow( rowan.Molecule.from_smiles("CCO"), name="test compound" ) # retrieve_project takes a UUID; list_workflows scopes with parent_uuid. project = rowan.retrieve_project(project.uuid) workflows = rowan.list_workflows(parent_uuid=project.uuid, size=50)
python# Create a hierarchical folder structure folder = rowan.create_folder(name="docking/batch_1/screening") wf = rowan.submit_docking_workflow( # ... docking params ... folder=folder, name="compound_001", ) # List workflows in a folder results = rowan.list_workflows(parent_uuid=folder.uuid)
Use microscopic pKa when:
Use macropKa when:
Example decision:
textPhenol (pKa ~10): Use microscopic pKa Amine (pKa ~9–10): Use microscopic pKa Multi-ionizable drug (N, O, acidic group): Use macropKa ADME assessment across GI pH: Use macropKa
Use conformer search when:
Use tautomer search when:
Combined workflow:
python# Step 1: Find best tautomer taut_wf = rowan.submit_tautomer_search_workflow( initial_molecule=rowan.Molecule.from_smiles("O=c1[nH]ccnc1"), name="imidazole tautomers", ) best_taut = taut_wf.result().best_tautomer # Step 2: Generate conformers from best tautomer conf_wf = rowan.submit_conformer_search_workflow( initial_molecule=best_taut, name="imidazole conformers", )
| Workflow | Use When | Input | Output | |----------|----------|-------|--------| | Docking | Single ligand, known pocket | Protein + SMILES + pocket coords | Pose, score, dG | | Analogue docking | 5–100+ related compounds | Protein + SMILES list + reference ligand | All poses, reference-aligned | | Protein-ligand cofolding | Sequence + ligand, no crystal structure | Protein sequence + SMILES | ML-predicted bound complex |
python# From local PDB file protein = rowan.upload_protein( name="egfr_kinase_domain", file_path="egfr_kinase.pdb", ) # From PDB database protein_from_pdb = rowan.create_protein_from_pdb_id( name="CDK2 (1M17)", code="1M17", ) # Retrieve previously uploaded protein protein = rowan.retrieve_protein("protein-uuid") # List all proteins my_proteins = rowan.list_proteins()
Nine common workflow categories — descriptors, microscopic pKa, MacropKa, conformer search, tautomer search, docking, analogue docking, MSA generation, and protein-ligand cofolding — each with submission code and result shapes, plus the complete list of every supported workflow type (core modeling, structure-based design, advanced computational chemistry, reaction chemistry, advanced properties, binding free energy, and sequence and structural biology) are in references/workflow_catalog.md.
Batch submit/poll/retrieve, the non-blocking fire-and-check pattern, webhook setup, secret creation and rotation, payload and signature verification (with a FastAPI handler), and webhook best practices are in references/batch_and_webhooks.md.
Free-tier limits, credit consumption per workflow, and typical cost estimates are in references/access_and_pricing.md.
A full lead-optimization campaign — project setup, tautomers, pKa across an analogue series, result collection, and a docking follow-up — is in references/end_to_end_example.md.
Common errors with their fixes, and debugging tips, are in references/troubleshooting.md.
result() to block until complete (default: wait=True, poll_interval=5).data for unmapped fieldspKa → macropKa → permeability (ADME assessment)tautomer search → docking → pose-analysis MD (pose refinement)MSA generation → protein-ligand cofolding (AI structure prediction)Use Rowan when your workflow requires cloud execution for molecular-design tasks, especially when you want one unified API and consistent result handling across small-molecule modeling, proteins, docking, ADME prediction, and ML structure generation.
Rowan is a molecular-design workflow platform, not just a remote chemistry engine. It handles infrastructure scaling, result persistence, and multi-step pipeline orchestration so you can focus on science.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 23,813 | 10,288 | -57% | 1 | 1 | 0% | 3,745 | 4,618 | +23% | 0 | 0 | — |
case-02 | fail→pass | 19,025 | 13,540 | -29% | 1 | 1 | 0% | 2,731 | 5,197 | +90% | 0 | 0 | — |
case-03 | fail→pass | 26,022 | 16,076 | -38% | 1 | 1 | 0% | 4,239 | 5,867 | +38% | 0 | 0 | — |
case-04 | pass→pass | 17,202 | 17,745 | +3% | 1 | 1 | 0% | 2,384 | 5,905 | +148% | 0 | 0 | — |
case-05 | fail→pass | 40,207 | 12,196 | -70% | 1 | 1 | 0% | 3,121 | 4,621 | +48% | 0 | 0 | — |
case-06 | fail→pass | 23,785 | 14,926 | -37% | 1 | 1 | 0% | 3,258 | 5,089 | +56% | 0 | 0 | — |
case-07 | pass→pass | 4,564 | 6,721 | +47% | 1 | 1 | 0% | 850 | 3,738 | +340% | 0 | 0 | — |
case-08 | fail→pass | 9,070 | 9,624 | +6% | 1 | 1 | 0% | 1,595 | 4,290 | +169% | 0 | 0 | — |
case-09 | fail→pass | 13,254 | 8,041 | -39% | 1 | 1 | 0% | 1,171 | 3,984 | +240% | 0 | 0 | — |
case-10 | fail→pass | 13,940 | 15,221 | +9% | 1 | 1 | 0% | 2,546 | 5,288 | +108% | 0 | 0 | — |
case-11 | fail→pass | 8,752 | 3,970 | -55% | 1 | 1 | 0% | 1,650 | 4,108 | +149% | 0 | 0 | — |
case-12 | fail→fail | 8,424 | 10,756 | +28% | 1 | 1 | 0% | 1,422 | 5,551 | +290% | 0 | 0 | — |
case-13 | fail→pass | 12,580 | 4,466 | -64% | 1 | 1 | 0% | 1,166 | 4,303 | +269% | 0 | 0 | — |
case-14 | fail→pass | 11,222 | 11,965 | +7% | 1 | 1 | 0% | 1,687 | 4,779 | +183% | 0 | 0 | — |
case-15 | pass→pass | 11,748 | 10,137 | -14% | 1 | 1 | 0% | 1,913 | 4,895 | +156% | 0 | 0 | — |
case-16 | pass→pass | 18,175 | 7,245 | -60% | 1 | 1 | 0% | 2,069 | 4,691 | +127% | 0 | 0 | — |
case-17 | fail→pass | 15,822 | 21,687 | +37% | 1 | 1 | 0% | 2,082 | 4,410 | +112% | 0 | 0 | — |
case-18 | pass→pass | 6,577 | 18,717 | +185% | 1 | 1 | 0% | 1,174 | 4,766 | +306% | 0 | 0 | — |
case-19 | pass→pass | 8,114 | 5,007 | -38% | 1 | 1 | 0% | 1,464 | 4,443 | +203% | 0 | 0 | — |
case-20 | fail→pass | 15,585 | 6,312 | -59% | 1 | 1 | 0% | 2,089 | 4,670 | +124% | 0 | 0 | — |
case-21 | fail→pass | 11,748 | 4,568 | -61% | 1 | 1 | 0% | 1,881 | 4,272 | +127% | 0 | 0 | — |
case-22 | pass→pass | 16,120 | 10,324 | -36% | 1 | 1 | 0% | 2,044 | 5,427 | +166% | 0 | 0 | — |
case-23 | fail→pass | 10,355 | 6,476 | -37% | 1 | 1 | 0% | 1,844 | 4,795 | +160% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +65 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/9/2026 | +50% |
Other measured skills in the registry, with their headline benchmark lift.