The simulation pipeline, the open-source projects at every stage, and the RSX-shaped gap a solo systems person can build
Landscape survey · 2026-07-04
You cannot simulate protein→cell end-to-end — it is six stages bolted together and every stage-join leaks (one stage's output is the wrong kind of object for the next); the guarded-but-recoverable gap is not accuracy, it is SPEED, and there is no production Rust MD engine to claim it.
This is an "explore the search" landscape page. Each stage below is scored three ways: how a modern 2026 pipeline handles it, where it breaks, and how a solo builder makes it simpler — with a repo table drawn from a live GitHub survey (star counts page-scraped 2026-07-04, treat as ±5%). The through-line: the models and data are increasingly open; the recoverable asset is the fast native runtime nobody owns.
Takes a sequence (protein, or a complex: protein+protein, protein+ligand, protein+nucleic acid) and predicts a static 3D pose. The AlphaFold2/3 lineage. Every repo here outputs coordinates, not motion — the shared limit the rest of the pipeline exists to fix.
A 2026 pipeline treats structure as a swappable commodity stage. Boltz-2, Chai-1, Protenix and OpenFold3 have converged on near-identical complex specs, so one normalized input fans out to several models. The real cost is the MSA (multiple-sequence alignment), not the model — teams run it once, cache it, feed every model the same alignment, or go MSA-free (ESMFold, Chai single-seq) when speed beats a few points of accuracy. Because Boltz/Chai/Protenix are all MIT/Apache and commercial-clean, teams ensemble 2–3 of them and keep the best pLDDT/PAE pose rather than bet on one. Boltz-2 is the pivot: structure and a binding-affinity score in one run.
You leave Stage 1 with a beautiful corpse — one frozen crystal-like pose. A protein is a distribution at 310K; function often lives in excited states it never shows. No dynamics, no thermodynamics, no kinetics. Disorder (~30% of the proteome) returns as low-pLDDT spaghetti people wrongly delete. Confidence lies exactly where it matters — allostery, cryptic pockets, point-mutation effects. AF3's affinity outputs are learned correlations with no energy underneath.
Each repo is a Python monorepo with its own conda env, CUDA pins, weight-download dance and bespoke output layout. The stage is conceptually one function — sequence → coordinates — buried under a dozen setup steps. A single Rust CLI can own the ugly parts: resolve/pin the model (Boltz-2 default: MIT, commercial-safe), one input schema compiling to whichever backend's YAML (--model boltz2|chai|protenix|openfold3), cache/reuse one MSA (or --no-msa), and normalize every backend's pose to canonical mmCIF + a small JSON sidecar. Heavy math stays in the model containers; Rust makes the stage one reproducible command.
| Repo | Stars | Lang | What it does |
|---|---|---|---|
google-deepmind/alphafold3 | ~8.3k | Python | Reference AF3; protein/nucleic/ligand complexes, best accuracy. Weights gated + non-commercial |
jwohlwend/boltz | ~4.1k | Python | Boltz-1/2 — AF3-parity structure + binding affinity, MIT, commercial-OK |
facebookresearch/esm | ~4.2k | Python | Archived ESM/ESMFold — single-sequence fold, no MSA |
aqlaboratory/openfold | ~3.4k | Python | Trainable PyTorch AF2; the training substrate the field forks |
RosettaCommons/RFdiffusion | ~2.9k | Python | Design, not prediction — diffuses novel backbones/binders |
evolutionaryscale/esm | ~2.8k | Python | ESM3 generative + ESMC embeddings; fast MSA-free fold (weights NC) |
chaidiscovery/chai-lab | ~2.0k | Python | Chai-1 all-atom complex prediction, MSA-free option, restraint conditioning |
bytedance/Protenix | ~2.0k | Python | AF3 reproduction; Protenix-v2 gains on antibody-antigen |
PaddlePaddle/PaddleHelix | ~1.1k | Python | Hosts HelixFold / HelixFold3, PaddlePaddle AF3-class |
aqlaboratory/openfold-3 | ~780 | Python | 2026 newcomer — bitwise AF3 repro, best open monomeric RNA |
dptech-corp/Uni-Fold | ~420 | Python | PyTorch AF2/Multimer reimpl, trainable multimer |
uw-ipd/RoseTTAFold2 | ~210 | Python | RF2 folding, the RoseTTAFold line |
Takes Stage 1's frozen pose and moves it — integrate Newton's equations, get a trajectory. Two knobs: the integrator (the MD engine) and the forces (classical force field vs neural potential).
Velocity-Verlet at a ~2 fs timestep (4 fs with hydrogen-mass repartitioning), Langevin/Nosé–Hoover thermostat, SPME Ewald for long-range electrostatics, GPU via CUDA. GROMACS is the throughput workhorse; OpenMM is where new methods land. The 2026 shift is ML interatomic potentials (MACE/MACE-OFF, NequIP/Allegro, Orb, UMA) — near-DFT accuracy with open, downloadable weights — dropped into OpenMM via openmm-ml or served by torchmd-net.
The MLIP weights are open; the runtime is the moat. Inference runs in Python/PyTorch/JAX and is 10–100× slower than classical force fields, with per-step Python overhead dominating — the accuracy is there, the speed is not. Setup (topology, atom typing, protonation, solvation) is fragile glue that breaks silently. And the timestep is capped by the fastest bond vibration, so reaching 1 ms = 109–1012 steps — the wall of Stage 3.
The stack is fast physics wrapped in slow Python glue. Two standalone, cargo add-able wedges: (1) a Rust neural-potential inference kernel (Candle/burn) that keeps data resident on GPU and fuses the message-passing kernels — the exact CPU↔GPU-copy-every-step bug that David-OConnor/dynamics admits about its own classical kernel; (2) a deterministic Rust setup tool (PDB → atom typing + protonation + solvation + FF assignment) to kill the silent-failure surface.
There is no production Rust MD engine. lumol (the closest to a general engine) is self-labeled alpha, classical-only, stalled. David-OConnor/dynamics is the most real attempt — genuine classical MD (Verlet + Ewald + Amber FF, CUDA) — but ~8 stars, solo, admits its GPU path copies CPU↔GPU every step, and has zero neural-potential support. Everything else in the Rust orbit is analysis/IO (groan_rs in Rust, chemfiles C++ with Rust bindings) or force-field fragments. Open lane, confirmed.
| Repo | Stars | Lang | What it does |
|---|---|---|---|
lammps/lammps | ~3.0k | C++ | Large-scale parallel MD, materials-heavy, huge plugin surface (GPL) |
facebookresearch/fairchem | ~2.2k | Python | FAIR Chemistry hub — UMA universal potential, data, demos |
openmm/openmm | ~1.9k | C++ | Scriptable GPU MD toolkit; where new methods land |
jax-md/jax-md | ~1.4k | Python/JAX | Differentiable GPU/TPU MD — grad through the sim |
ACEsuit/mace | ~1.3k | Python | Higher-order equivariant MLIP; near-DFT, weights downloadable |
gromacs/gromacs | ~935 | C++ | Fastest classical MD (GH is a mirror; dev on GitLab) |
mir-group/nequip | ~933 | Python | E(3)-equivariant interatomic potentials |
atomistic-machine-learning/schnetpack | ~934 | Python | NN potential-energy-surface toolbox (SchNet, PaiNN) |
torchmd/torchmd | ~711 | Python | End-to-end MD engine in PyTorch |
orbital-materials/orb-models | ~602 | Python | Orb foundation forcefields; weights open |
mir-group/allegro | ~490 | Python | Strictly-local scalable E(3)-equivariant potential |
torchmd/torchmd-net | ~478 | Python/C++ | Train + serve NN potentials (TensorNet, ET), GPU MD |
glotzerlab/hoomd-blue | ~438 | C++/CUDA | GPU MD + Monte Carlo, soft-matter focus |
lumol-org/lumol | ~209 | Rust | "Universal" MD + Monte Carlo — alpha, classical-only, stalled |
David-OConnor/molchanica | ~147 | Rust | Viewer/editor/simulator GUI; CUDA, GPU docking (app, not library) |
openmm/openmm-ml | ~175 | Python | High-level API to drop MLIPs into OpenMM |
ACEsuit/mace-off | ~74 | Shell | Pre-trained transferable organic force fields; weights downloadable (NC) |
David-OConnor/dynamics | ~8 | Rust | Real classical MD lib (Verlet, OPC, SPME, Amber FF) — solo, classical-only, GPU path slow |
MD reaches ns–µs (ms only on D.E. Shaw's Anton ASIC). Biology — folding, allostery, catalysis, gating — lives at ms → s → minutes, 3–9 orders past routine MD. It's a wall, not a slope: cost is exponential in barrier height (Kramers/Arrhenius). 100× more GPUs buys two orders of linear wall-clock against an exponential need. Brute force loses.
Three families patch around it, each trading a different thing:
Metadynamics (PLUMED), replica exchange, umbrella sampling — bias along a chosen collective variable, then unbias. Breaks: you must guess the reaction coordinate; a wrong CV gives a confidently-wrong free-energy surface.
Run thousands of short trajectories, discretize, estimate a transition matrix whose slow eigenvectors give the kinetics. Breaks: needs huge aggregate sampling + careful state/lag choice; bad discretization injects non-Markovian artifacts.
Martini 3 via martinize2 — merge ~4 atoms into a bead for 100–1000× speedup. Breaks: throws away the chemistry (H-bonds, side-chain detail) you often needed; hand-tuned, poor transferability.
The whole live MSM world is one maintained Python library (deeptime) plus a graveyard of archived predecessors (PyEMMA, MSMBuilder, msmtools). The math — TICA (a generalized symmetric eigenproblem C(τ)v = λC(0)v), k-means/regspace clustering, reversible transition-matrix MLE, PCCA+ — is published and small. deeptime is in-memory, single-machine, scipy-bound; it wants the whole trajectory set in RAM. But mdCATH is 3.3 TB and Folding@home is many TB — today you can't MSM the big open datasets on a workstation.
A streaming Rust MSM/TICA/clustering builder: out-of-core TICA (Welford covariance) + streaming mini-batch k-means + transition counting — the covariance accumulation and counting are embarrassingly streamable. One binary ingests trajectory frames → emits metastable states + rate matrix + implied-timescale plot. No Python, no notebook, no AI-glue. And a ready test oracle already exists: mdshare serves the alanine-dipeptide set every deeptime tutorial uses, so the Rust builder validates its eigenvalues/timescales against deeptime's published outputs on the same input (to numerical tolerance — different eigensolvers won't match bit-for-bit). Correctness is checkable without a single experiment — the moat is speed, and speed is verifiable.
| Repo | Stars | Lang | What it does |
|---|---|---|---|
deeptime-ml/deeptime | ~873 | Python | The current MSM stack — TICA, VAMP, clustering, MSM/HMM, VAMPnets |
plumed/plumed2 | ~505 | C++ | The enhanced-sampling library; metadynamics, umbrella, CVs |
markovmodel/PyEMMA | ~338 | Python | Legacy MSM package — archived 2023, points to deeptime |
msmbuilder/msmbuilder | ~167 | Python | Earlier MSM toolkit (Stanford lineage) — archived 2021 |
marrink-lab/vermouth-martinize | ~148 | Python | Martinize2 — all-atom → Martini 3 coarse-grained topologies |
openpathsampling/openpathsampling | ~117 | Python | Transition path sampling — reactive trajectories without a global CV |
markovmodel/msmtools | ~41 | Python | Low-level transition-matrix estimation (the numerics under PyEMMA) |
markovmodel/mdshare | ~34 | Python | Downloader for benchmark sets (alanine dipeptide) — the test oracle |
| Dataset | Scope | License | What it is |
|---|---|---|---|
| mdCATH | 3.3 TB, 5,398 domains, 62.6 ms aggregate | CC-BY-4.0 | Largest open all-atom set; domains × 5 temperatures (HDF5) |
| ATLAS | 1,938 proteins, 3× replicas | CC-BY-NC-4.0 | Standardized MD of PDB structures + flexibility (NOT CC0; ~100 ns short) |
| MISATO | 16,972 MD sims + 19,443 QM ligands | LGPL-2.1 | Protein–ligand complex MD for drug discovery |
| Folding@home | many TB (SARS-CoV-2 etc.) | datasets CC0 | Distributed-computing trajectories; scattered per-project via MolSSI/OSF |
| DESRES (Anton) | fast-folding proteins, GPCR | free-NC, by agreement | The gold ms-scale trajectories — gated by request, not open-download |
Given the structure, predict how it binds — the ligand pose, and the binding constant. This is the drug-discovery funnel.
A funnel: AF3/Boltz-2/Chai fold the complex → Vina/gnina/DiffDock/DynamicBind pose the ligand → OpenFE/FEP (or Boltz-2's affinity head) rank the survivors. Boltz-2 is the 2026 shift — structure and a learned affinity in one pass, collapsing two stages.
Docking gives poses, not affinities — scoring is the weakest link in all of drug discovery. Boltz-2's affinity is a correlation, not a computed ΔG, so FEP still guards the "real number." And FEP is a Stage-3 problem in disguise: its accuracy is bounded by sampling convergence, so slow binders / induced fit produce silent non-convergence. Cryptic pockets are Stage-3 rare events invisible to a static pose. ML potentials (MACE-OFF, Orb) are the credible path to physics-grade affinity — weights downloadable — but the slow Python runtime is, again, the block.
The honest read: the field is drowning in orchestration Python and starved of fast native runtime. The same MSM/kinetics and neural-potential kernels from Stages 2–3 are the simplification here — cryptic pockets and induced fit are rare-event sampling problems, and physics-grade affinity is a fast-inference problem. Don't rebuild the scorers; build the runtime the scorers should call.
| Repo | Stars | Lang | What it does |
|---|---|---|---|
gcorso/DiffDock | ~1.5k | Python | Diffusion generative docking (blind pose) — pose only, no ΔG |
ccsb-scripps/AutoDock-Vina | ~1.0k | C++ | Fastest/most-used open docking engine; empirical scoring |
gnina/gnina | ~950 | C++ | CNN-scored docking (fork of smina/AutoDock) |
OpenFreeEnergy/openfe | ~301 | Python | Alchemical free energy (FEP/TI) — the open Schrödinger-FEP+ path |
luwei0917/DynamicBind | ~297 | Jupyter | Equivariant generative model — ligand-specific flexible (induced fit) |
(Boltz, OpenMM, GROMACS, PLUMED, MACE, Orb recur here from earlier stages — the funnel reuses the same engines.)
Compose interactions into a network and simulate the cell's behaviour — ODEs when copy numbers are high, exact Gillespie SSA (+ tau-leaping) when they're low.
libRoadRunner is the fast SBML engine; COPASI/basico and Tellurium wrap it for humans; BioNetGen/PySB handle rule-based combinatorial networks. Whole-cell splits into two camps: mechanistic (wcEcoli, E-Cell, Vivarium — hand-assembled, organism-specific) and ML virtual-cell (Arc STATE, scGPT, Geneformer, CZI — interpolate transcriptomics).
The universal wall is not the solver — it's the rate constants nobody published. A 50-species model needs 100+ params (kon, koff, kcat, Km); most were never measured, the rest measured in vitro under conditions that don't hold in-cell. Parameter inference is an under-determined inverse problem — sloppy / structurally non-identifiable: many parameter sets fit the same data. SABIO-RK (300k+ params) and BioModels give a fraction of the numbers, never the whole set. And the ML virtual-cell camp does not simulate biophysics — it interpolates transcriptomics with no idea what a protein's structure is doing; its real moat is proprietary Perturb-seq/imaging data (Recursion, Insitro, Ginkgo), unrecoverable without a wet lab.
A Rust exact-Gillespie / tau-leaping core with a structural-identifiability front door: fit a CRN to time-series and report which parameters are non-identifiable from the data rather than faking a fit. The simplification is not "solve the params" (math forbids it) but "tell the user honestly what's fittable" — which no mainstream tool foregrounds.
| Repo | Stars | Lang | What it does |
|---|---|---|---|
bowang-lab/scGPT | ~1.6k | Jupyter | Single-cell multi-omics foundation model (perturbation, annotation) |
chanzuckerberg/cellxgene | ~780 | JS | Interactive single-cell transcriptomics explorer (not a simulator) |
ArcInstitute/state | ~608 | Python | STATE — predicts perturbation response; open weights (NC), no biophysics |
pysb/pysb | ~198 | Python | Rule-based models as Python programs (compiles to BNG/Kappa) |
sys-bio/tellurium | ~142 | Python | Python modeling env over libRoadRunner + Antimony |
copasi/COPASI | ~129 | C++ | GUI+lib for biochemical network sim (ODE, SSA, param-fit) |
RuleWorld/bionetgen | ~68 | C++/Perl | Rule-based modeling of combinatorial signaling networks |
sys-bio/roadrunner | ~62 | C++ | High-performance SBML simulator, LLVM-JIT ODE/stochastic |
CovertLab/wcEcoli | ~41 | Python | Covert Lab whole-cell E. coli model (Science 2022) |
vivarium-collective/vivarium-core | ~37 | Python | Multi-scale composition engine connecting heterogeneous processes |
ecell/ecell4 | ~18 | Python | Multi-algorithm/multi-scale/spatial cell sim |
Kinetic-parameter data (not code): SABIO-RK (300k+ reaction-kinetic params, REST API) and BioModels (SBML repository — publishes topology, hides the numbers).
The RSX edge wasn't the biggest market — it was a specific gap only you saw, exploitable alone. The biotech analogue must be guarded (someone hoards it), recoverable (physics + public tools + public data reconstruct it), and a solo wedge (a standalone artifact useful to non-you users day one). The 2026 finding that reframes everything: the models are less guarded than the folklore says. STATE ships open weights; the Virtual Cell Atlas is CC0; MACE-OFF/Orb weights are downloadable; SABIO-RK holds 300k+ params. So "the crown jewel is proprietary weights" is mostly wrong. The guarded-and-recoverable thing is speed, not data.
A Rust neural-potential MD inference kernel + Markov-State-Model builder — "the fast substrate for biological-timescale dynamics." The field agrees on the methods (MSMs, VAMPnets, MACE-class potentials); the reference implementations are slow Python/JAX and there is no production Rust MD engine. Value in the runtime/solver layer, standalone, users-not-you, no AI-agent glue, no user-coupled SaaS — the same DNA as the simulated-bifurcation QUBO/Ising solver.
A fast Rust MSM/TICA/clustering builder over public trajectories (DESRES-on-request, Folding@home CC0, mdCATH CC-BY, ATLAS, MISATO). Pure numerics — TICA, streaming k-means, reversible transition-matrix MLE, PCCA+. Streaming/out-of-core makes the open trajectory era usable on a workstation, which deeptime can't. Validates to tolerance against deeptime on the mdshare alanine-dipeptide set. MD labs cargo add it day one. A stochastic/low-latency background is the moat here.
A batched, correct mixed-precision neural-potential inference kernel (Candle/burn) for downloadable MACE-OFF/Orb weights — keep data resident on GPU, fuse the message-passing kernels. This is the thing openmm-ml and NVIDIA NIM get wrong (NIM returns near-zero FP8 activations from StripedHyena). You're not training a model; you're building the substrate that serves open weights at speed.
The virtual-cell forward model itself needs the wet-lab Perturb-seq data moat (Recursion ~50PB, Insitro, Ginkgo). You cannot generate 100M perturbed cells without a wet lab — don't race Arc/pharma on their data. Fails the solo-wedge leg.
New force-field training data needs DFT clusters you lack — recover the kernel, not the dataset.
Some kinetic rates are non-identifiable from any public time-series by math, not secrecy — your tool must report that honestly, not fake a fit.
The through-line, every stage: the models and data are increasingly OPEN; the guarded-but-recoverable asset is SPEED. Every simplification above is the same move — take a slow Python reference implementation of published numerics and ship it as one fast standalone Rust runtime. Program the layer above the cell = build the engine that computes what the cell will do, fast enough to close the loop.