Rowan: Cloud-Native Molecular-Modeling and Drug-Design Workflows

Rowan is a cloud-native molecular modeling and medicinal-chemistry workflow platform with a Python API.

How to use it

  1. Hit Copy the whole skill.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit K-Dense-AI/scientific-agent-skills/skills/rowan#main ~/.claude/skills/rowan

For one project only, change the path to .claude/skills/rowan.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text399 lines
rowan/SKILL.md399 lines14.0 KBpushed 23d agoRawView on GitHub

Rowan: Cloud-Native Molecular-Modeling and Drug-Design Workflows

Overview

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.

When to use Rowan

Rowan is a good fit for:

  • Quantum chemistry, semiempirical methods, or neural network potentials
  • Batch property prediction (pKa, descriptors, permeability, solubility)
  • Conformer and tautomer ensemble generation
  • Docking workflows (single-ligand, analogue series, pose refinement)
  • Protein-ligand cofolding and MSA generation
  • Multi-step chemistry pipelines (e.g., tautomer search → docking → pose analysis)
  • Batch medicinal-chemistry campaigns where you need consistent, scalable infrastructure

Rowan is not the right fit for:

  • Simple molecular I/O (use RDKit directly)
  • Post-HF ab initio quantum chemistry or relativistic calculations

Quick start

uv pip install rowan-python
import 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.

Installation

uv pip install rowan-python
# or: uv pip install rowan-python

User and webhook management

Authentication

Set an API key via environment variable (recommended):

export ROWAN_API_KEY="your_api_key_here"

Or set directly in Python:

import rowan
rowan.api_key = "your_api_key_here"

Verify authentication:

import rowan
user = rowan.whoami()  # Returns user info if authenticated
print(f"User: {user.email}")
print(f"Credits available: {user.credits_available_string()}")

Molecule input formats

Rowan accepts molecules in the following formats:

  • SMILES (preferred): "CCO", "c1ccccc1O"
  • SMARTS patterns (for some workflows): subset of SMARTS for substructure matching
  • InChI (if supported in your API version): "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.

SMILES strings versus molecule objects

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:

from rdkit import Chem
smiles = "CCO"
mol = Chem.MolFromSmiles(smiles)
if mol is None:
    raise ValueError(f"Invalid SMILES: {smiles}")

Core usage pattern

Most Rowan tasks follow the same three-step pattern:

  1. Submit a workflow
  2. Wait for completion (with optional streaming)
  3. Retrieve typed results with convenience properties
import 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:

for partial in workflow.stream_result(poll_interval=5):
    print(f"Complete: {partial.complete}")  # bool, not a percentage
    print(partial.data)

result() vs. stream_result()

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.

Working with results

Rowan's API includes typed workflow result objects with convenience properties.

Using typed properties and .data

Results have two access patterns:

  1. Convenience properties (recommended first): result.descriptors, result.best_pose, result.scores. Result classes differ: conformer search uses get_energies() and get_conformers() methods.
  2. Raw fallback: result.data — raw dictionary from the API

Example:

result = 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.

Cache invalidation

Some result properties are lazily loaded (e.g., conformer geometries, protein structures). To refresh:

result.clear_cache()
new_structures = result.get_conformers()  # Refetched for ConformerSearchResult

Projects, folders, and organization

For nontrivial campaigns, use projects and folders to keep work organized.

Projects

import 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)

Folders

# 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)

Workflow decision trees

pKa vs. MacropKa

Use microscopic pKa when:

  • You need the pKa of a single ionizable group
  • You're interested in acid–base transitions and protonation thermodynamics
  • The molecule has one or two ionizable sites
  • Speed is critical (faster, fewer credits)

Use macropKa when:

  • You need pH-dependent behavior across a physiologically relevant range (e.g., 0–14)
  • You want aggregated charge and protonation-state populations across pH
  • The molecule has multiple ionizable groups with coupled protonation
  • You need downstream properties like aqueous solubility at different pH

Example decision:

Phenol (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

Conformer search vs. tautomer search

Use conformer search when:

  • A single tautomeric form is known
  • You need a diverse 3D ensemble for docking, MD, or SAR analysis
  • Rotatable bonds dominate the chemical space

Use tautomer search when:

  • Tautomeric equilibrium is uncertain (e.g., heterocycles, keto–enol systems)
  • You need to model all relevant protonation isomers
  • Downstream calculations (docking, pKa) depend on tautomeric form

Combined workflow:

# 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",
)

Docking vs. analogue docking vs. cofolding

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

Protein utilities

Upload proteins

# 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()

Protein preparation guidance

  • File format: PDB, mmCIF (Rowan auto-detects)
  • Water molecules: Rowan usually keeps relevant water; remove bulk water beforehand if desired
  • Heteroatoms: Cofactors, ions, and bound ligands are usually preserved; remove unwanted heteroatoms before upload
  • Multi-chain proteins: Fully supported
  • Resolution: Works with NMR structures, homology models, and cryo-EM; quality matters for downstream predictions
  • Validation: Rowan validates PDB syntax; severely malformed files may be rejected

Workflow catalog

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 submission, webhooks, and asynchronous work

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.

Access, pricing, and credits

Free-tier limits, credit consumption per workflow, and typical cost estimates are in references/access_and_pricing.md.

Worked example and troubleshooting

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.

Recommended usage patterns

  • Prefer Rowan-native workflows over low-level assembly when they exist
  • Use projects and folders for any nontrivial campaign (>5 workflows)
  • Use result() to block until complete (default: wait=True, poll_interval=5)
  • Use typed result properties first, fall back to .data for unmapped fields
  • Use batch submission for compound libraries or analogue series
  • Chain workflows for multi-step chemistry campaigns:
    • pKa → macropKa → permeability (ADME assessment)
    • tautomer search → docking → pose-analysis MD (pose refinement)
    • MSA generation → protein-ligand cofolding (AI structure prediction)
  • Use webhooks for long-running campaigns (>50 workflows) or asynchronous pipelines
  • Use streaming for interactive feedback on large conformer/docking searches

Summary

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.

1---
2name: rowan
3description: 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 infrastructure.
4license: Proprietary (API key required)
5compatibility: Python 3.12+, API key required
6metadata:
7 version: "1.5"
8 skill-author: Rowan Science
9 trigger-keywords: pKa prediction, molecular docking, conformer search, chemistry workflow, drug discovery, SMILES, protein structure, batch molecular modeling, cloud chemistry
10 openclaw:
11 primaryEnv: ROWAN_API_KEY
12 envVars:
13 - name: ROWAN_API_KEY
14 required: true
15 description: Rowan computational chemistry API key.
16---
17 
18# Rowan: Cloud-Native Molecular-Modeling and Drug-Design Workflows
19 
20## Overview
21 
22Rowan 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.
23 
24Use 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.
25 
26## When to use Rowan
27 
28**Rowan is a good fit for:**
29 
30- Quantum chemistry, semiempirical methods, or neural network potentials
31- Batch property prediction (pKa, descriptors, permeability, solubility)
32- Conformer and tautomer ensemble generation
33- Docking workflows (single-ligand, analogue series, pose refinement)
34- Protein-ligand cofolding and MSA generation
35- Multi-step chemistry pipelines (e.g., tautomer search → docking → pose analysis)
36- Batch medicinal-chemistry campaigns where you need consistent, scalable infrastructure
37 
38**Rowan is not the right fit for:**
39- Simple molecular I/O (use RDKit directly)
40- Post-HF *ab initio* quantum chemistry or relativistic calculations
41 
42## Quick start
43 
44```bash
45uv pip install rowan-python
46```
47 
48```python
49import rowan
50rowan.api_key = "your_api_key_here" # or set ROWAN_API_KEY env var
51 
52# Descriptors require a 3D Molecule, not a bare SMILES string.
53mol = rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O")
54wf = rowan.submit_descriptors_workflow(mol, name="aspirin")
55result = wf.result()
56 
57print(result.descriptors["MW"]) # 180.042 — exact mass
58print(result.descriptors["SLogP"]) # 1.31
59print(result.descriptors["TopoPSA"]) # 63.6 — topological PSA
60```
61 
62If that prints without error, you're set up correctly. These values and examples
63were verified against `rowan-python` 3.1.13.
64 
65## Installation
66 
67```bash
68uv pip install rowan-python
69# or: uv pip install rowan-python
70```
71 
72## User and webhook management
73 
74### Authentication
75 
76Set an API key via environment variable (recommended):
77 
78```bash
79export ROWAN_API_KEY="your_api_key_here"
80```
81 
82Or set directly in Python:
83 
84```python
85import rowan
86rowan.api_key = "your_api_key_here"
87```
88 
89Verify authentication:
90 
91```python
92import rowan
93user = rowan.whoami() # Returns user info if authenticated
94print(f"User: {user.email}")
95print(f"Credits available: {user.credits_available_string()}")
96```
97 
98## Molecule input formats
99 
100Rowan accepts molecules in the following formats:
101 
102- **SMILES** (preferred): `"CCO"`, `"c1ccccc1O"`
103- **SMARTS patterns** (for some workflows): subset of SMARTS for substructure matching
104- **InChI** (if supported in your API version): `"InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3"`
105 
106The API validates molecule inputs and raises `ValueError` for an unparseable
107SMILES or a workflow-incompatible input type. Always use canonicalized SMILES
108for reproducibility.
109 
110### SMILES strings versus molecule objects
111 
112Accepted input types vary by workflow in `rowan-python` 3.1.13. Only these
113common workflows accept a bare string: pKa, conformer search, membrane
114permeability, ADMET, LogP, macropKa, solubility, and pose-analysis MD. Most
115others — including descriptors, tautomer search, docking, analogue docking,
116BDE, NMR, and Fukui — require `rowan.Molecule.from_smiles(smiles)` or an RDKit
117`Mol`/`RWMol`. A wrong type raises `ValueError` before submission.
118 
119**Tip:** Use RDKit to validate SMILES before submission:
120 
121```python
122from rdkit import Chem
123smiles = "CCO"
124mol = Chem.MolFromSmiles(smiles)
125if mol is None:
126 raise ValueError(f"Invalid SMILES: {smiles}")
127```
128 
129## Core usage pattern
130 
131Most Rowan tasks follow the same three-step pattern:
132 
1331. **Submit** a workflow
1342. **Wait** for completion (with optional streaming)
1353. **Retrieve** typed results with convenience properties
136 
137```python
138import rowan
139 
140# 1. Submit — use the specific workflow function (not the generic submit_workflow)
141workflow = rowan.submit_descriptors_workflow(
142 rowan.Molecule.from_smiles("CC(=O)Oc1ccccc1C(=O)O"),
143 name="aspirin descriptors",
144)
145 
146# 2. & 3. Wait and retrieve
147result = workflow.result() # Blocks until done (default: wait=True, poll_interval=5)
148print(result.data) # Raw dict
149print(result.descriptors["MW"]) # 180.042 exact mass; no result.molecular_weight property
150```
151 
152For long-running workflows, use streaming:
153 
154```python
155for partial in workflow.stream_result(poll_interval=5):
156 print(f"Complete: {partial.complete}") # bool, not a percentage
157 print(partial.data)
158```
159 
160### result() vs. stream_result()
161 
162| Pattern | Use When | Duration |
163|---------|----------|----------|
164| `result()` | You can wait for the full result | <5 min typical |
165| `stream_result()` | You want progress feedback or need early partial results | >5 min, or interactive use |
166 
167**Guideline:** Use `result()` for descriptors, pKa. Use `stream_result()` for conformer search, docking, cofolding.
168 
169## Working with results
170 
171Rowan's API includes **typed workflow result objects** with convenience properties.
172 
173### Using typed properties and .data
174 
175Results have two access patterns:
176 
1771. **Convenience properties** (recommended first): `result.descriptors`, `result.best_pose`, `result.scores`. Result classes differ: conformer search uses `get_energies()` and `get_conformers()` methods.
1782. **Raw fallback**: `result.data` — raw dictionary from the API
179 
180Example:
181 
182```python
183result = rowan.submit_descriptors_workflow(
184 rowan.Molecule.from_smiles("CCO"),
185 name="ethanol",
186).result()
187 
188# Convenience property (returns all descriptors):
189print(result.descriptors["MW"]) # exact/monoisotopic mass
190print(result.descriptors["SLogP"])
191print(result.descriptors["TopoPSA"]) # usual topological PSA
192 
193# Raw data fallback:
194print(result.data["descriptors"])
195```
196 
197**Note:** `DescriptorsResult` does **not** have a `molecular_weight` property.
198`MW` is exact/monoisotopic mass, not average molecular weight. `TPSA` is a 3D
199charged-surface descriptor; use `TopoPSA` for the usual topological polar
200surface area used in drug-likeness rules.
201 
202### Cache invalidation
203 
204Some result properties are lazily loaded (e.g., conformer geometries, protein structures). To refresh:
205 
206```python
207result.clear_cache()
208new_structures = result.get_conformers() # Refetched for ConformerSearchResult
209```
210 
211## Projects, folders, and organization
212 
213For nontrivial campaigns, use projects and folders to keep work organized.
214 
215### Projects
216 
217```python
218import rowan
219 
220# Create a project
221project = rowan.create_project(name="CDK2 lead optimization")
222rowan.set_project("CDK2 lead optimization")
223 
224# All subsequent workflows go into this project
225wf = rowan.submit_descriptors_workflow(
226 rowan.Molecule.from_smiles("CCO"), name="test compound"
227)
228 
229# retrieve_project takes a UUID; list_workflows scopes with parent_uuid.
230project = rowan.retrieve_project(project.uuid)
231workflows = rowan.list_workflows(parent_uuid=project.uuid, size=50)
232```
233 
234### Folders
235 
236```python
237# Create a hierarchical folder structure
238folder = rowan.create_folder(name="docking/batch_1/screening")
239 
240wf = rowan.submit_docking_workflow(
241 # ... docking params ...
242 folder=folder,
243 name="compound_001",
244)
245 
246# List workflows in a folder
247results = rowan.list_workflows(parent_uuid=folder.uuid)
248```
249 
250## Workflow decision trees
251 
252### pKa vs. MacropKa
253 
254**Use microscopic pKa when:**
255 
256- You need the pKa of a single ionizable group
257- You're interested in acid–base transitions and protonation thermodynamics
258- The molecule has one or two ionizable sites
259- Speed is critical (faster, fewer credits)
260 
261**Use macropKa when:**
262 
263- You need pH-dependent behavior across a physiologically relevant range (e.g., 0–14)
264- You want aggregated charge and protonation-state populations across pH
265- The molecule has multiple ionizable groups with coupled protonation
266- You need downstream properties like aqueous solubility at different pH
267 
268**Example decision:**
269 
270```text
271Phenol (pKa ~10): Use microscopic pKa
272Amine (pKa ~9–10): Use microscopic pKa
273Multi-ionizable drug (N, O, acidic group): Use macropKa
274ADME assessment across GI pH: Use macropKa
275```
276 
277### Conformer search vs. tautomer search
278 
279**Use conformer search when:**
280 
281- A single tautomeric form is known
282- You need a diverse 3D ensemble for docking, MD, or SAR analysis
283- Rotatable bonds dominate the chemical space
284 
285**Use tautomer search when:**
286 
287- Tautomeric equilibrium is uncertain (e.g., heterocycles, keto–enol systems)
288- You need to model all relevant protonation isomers
289- Downstream calculations (docking, pKa) depend on tautomeric form
290 
291**Combined workflow:**
292 
293```python
294# Step 1: Find best tautomer
295taut_wf = rowan.submit_tautomer_search_workflow(
296 initial_molecule=rowan.Molecule.from_smiles("O=c1[nH]ccnc1"),
297 name="imidazole tautomers",
298)
299best_taut = taut_wf.result().best_tautomer
300 
301# Step 2: Generate conformers from best tautomer
302conf_wf = rowan.submit_conformer_search_workflow(
303 initial_molecule=best_taut,
304 name="imidazole conformers",
305)
306```
307 
308### Docking vs. analogue docking vs. cofolding
309 
310| Workflow | Use When | Input | Output |
311|----------|----------|-------|--------|
312| Docking | Single ligand, known pocket | Protein + SMILES + pocket coords | Pose, score, dG |
313| Analogue docking | 5–100+ related compounds | Protein + SMILES list + reference ligand | All poses, reference-aligned |
314| Protein-ligand cofolding | Sequence + ligand, no crystal structure | Protein sequence + SMILES | ML-predicted bound complex |
315 
316## Protein utilities
317 
318### Upload proteins
319 
320```python
321# From local PDB file
322protein = rowan.upload_protein(
323 name="egfr_kinase_domain",
324 file_path="egfr_kinase.pdb",
325)
326 
327# From PDB database
328protein_from_pdb = rowan.create_protein_from_pdb_id(
329 name="CDK2 (1M17)",
330 code="1M17",
331)
332 
333# Retrieve previously uploaded protein
334protein = rowan.retrieve_protein("protein-uuid")
335 
336# List all proteins
337my_proteins = rowan.list_proteins()
338```
339 
340### Protein preparation guidance
341 
342- **File format**: PDB, mmCIF (Rowan auto-detects)
343- **Water molecules**: Rowan usually keeps relevant water; remove bulk water beforehand if desired
344- **Heteroatoms**: Cofactors, ions, and bound ligands are usually preserved; remove unwanted heteroatoms before upload
345- **Multi-chain proteins**: Fully supported
346- **Resolution**: Works with NMR structures, homology models, and cryo-EM; quality matters for downstream predictions
347- **Validation**: Rowan validates PDB syntax; severely malformed files may be rejected
348 
349## Workflow catalog
350 
351Nine common workflow categories — descriptors, microscopic pKa, MacropKa, conformer
352search, tautomer search, docking, analogue docking, MSA generation, and protein-ligand
353cofolding — each with submission code and result shapes, plus the complete list of every
354supported workflow type (core modeling, structure-based design, advanced computational
355chemistry, reaction chemistry, advanced properties, binding free energy, and sequence and
356structural biology) are in
357[references/workflow_catalog.md](references/workflow_catalog.md).
358 
359## Batch submission, webhooks, and asynchronous work
360 
361Batch submit/poll/retrieve, the non-blocking fire-and-check pattern, webhook setup,
362secret creation and rotation, payload and signature verification (with a FastAPI
363handler), and webhook best practices are in
364[references/batch_and_webhooks.md](references/batch_and_webhooks.md).
365 
366## Access, pricing, and credits
367 
368Free-tier limits, credit consumption per workflow, and typical cost estimates are in
369[references/access_and_pricing.md](references/access_and_pricing.md).
370 
371## Worked example and troubleshooting
372 
373A full lead-optimization campaign — project setup, tautomers, pKa across an analogue
374series, result collection, and a docking follow-up — is in
375[references/end_to_end_example.md](references/end_to_end_example.md).
376 
377Common errors with their fixes, and debugging tips, are in
378[references/troubleshooting.md](references/troubleshooting.md).
379 
380## Recommended usage patterns
381 
382- **Prefer Rowan-native workflows** over low-level assembly when they exist
383- **Use projects and folders** for any nontrivial campaign (>5 workflows)
384- **Use `result()` to block until complete** (default: `wait=True, poll_interval=5`)
385- **Use typed result properties first**, fall back to `.data` for unmapped fields
386- **Use batch submission** for compound libraries or analogue series
387- **Chain workflows** for multi-step chemistry campaigns:
388 - `pKa → macropKa → permeability` (ADME assessment)
389 - `tautomer search → docking → pose-analysis MD` (pose refinement)
390 - `MSA generation → protein-ligand cofolding` (AI structure prediction)
391- **Use webhooks** for long-running campaigns (>50 workflows) or asynchronous pipelines
392- **Use streaming** for interactive feedback on large conformer/docking searches
393 
394## Summary
395 
396Use 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.
397 
398Rowan 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.
399 

Discussion

Alternatives

Also in Molecules & structures