Field notes from a hackathon follow-up
After the hackathon: 2,307 molecules against an ebolavirus glycoprotein on a desktop machine
On a Saturday in July we sat in the Hogpatch event space in San Francisco, trying to do something that sounds like a joke at first: find small molecules that might occupy the Bundibugyo ebolavirus glycoprotein pocket, and do it in an afternoon. The event was Ebolathon: Compute to Cure, hosted by onepot and muni. The rules were simple. Rank ten compounds from onepot's CORE library, defend the choices in a five-minute discussion with the judges, and the organizers take it from there: selected compounds go to synthesis and a pseudovirus entry assay, and the assay data will be made public.
Our team came together by accident and turned out to be a good one. Victor C. Onuh arrived best prepared, with the key papers read and known small-molecule binders in hand. Raul Ortega-Ochoa used MolMiner, a 3D-aware generative model from his own research, to propose variants of the known binders. Jan Weinreich searched and filtered onepot's catalog for purchasable matches, and Philip Thomas ran docking and binding-strength calculations across the Rowan, Modal and muni platforms, sometimes all three at once. Philip first learned docking twenty years ago on a lab Pentium 3, where you submitted a job, went out for a long lunch, and came back to a series of errors. Posing a molecule in the cloud in seconds was, for him, the remarkable part of the day.
We ranked our ten, presented, and went home. But none of us felt done. A hackathon forces speed over care: you pick compounds by the afternoon and hope. We wanted to know what the same question looks like when you answer it properly, with a calibrated receptor, embedded controls, a measured noise floor, and a few thousand molecules instead of a shortlist. So we kept working on it.
Let us set expectations early, because the subject matter invites hype. Nothing in this post is a drug candidate, and nobody cured anything. What we have is a careful computational triage of 2,307 molecules against the ebolavirus glycoprotein pocket, run on a workstation under a desk, with the uncertainty quantified. We think that is worth sharing anyway: partly because the result is interesting, and partly because the tooling has crossed a threshold where a small team can do this kind of screen without a data center.
The target in brief
Bundibugyo virus (BDBV) is one of the ebolaviruses. It causes severe hemorrhagic fever with high case-fatality rates, and there are no approved small-molecule therapeutics against it. Its glycoprotein (GP) is the only protein on the viral surface, and it does everything the virus needs to get into a cell: GP1 handles attachment and receptor engagement, GP2 drives membrane fusion. Jam GP and the virus cannot enter.
The best-studied place to jam it is a pocket at the GP1-GP2 interface, at the base of the trimer. This is where the entry inhibitors toremifene and clomiphene bind. Both are old, inexpensive drugs (selective estrogen receptor modulators) that were found to block Ebola entry by wedging into this pocket and destabilizing the prefusion conformation of the trimer (Zhao et al., Nature 2016). One honest caveat about that literature: these drugs are cationic amphiphiles, and part of their cellular anti-Ebola activity may come from lysosomal trapping rather than from GP binding alone. The pocket is nonetheless conserved across ebolaviruses, which makes it the obvious starting point.
Two experimental structures do most of the work in this story. 5JQ7 is an X-ray structure of the related Zaire ebolavirus GP with toremifene bound; it tells us exactly which 19 residues touch the ligand. 6DZM is a cryo-EM structure of the BDBV GP trimer; it gives us the BDBV-specific shape of the pocket. Between the two viruses, 18 of those 19 pocket residues are identical, and the single difference is a conservative one (an arginine in EBOV, a lysine in BDBV).
Setting up the screen properly
The hackathon version of a screen is: take what you can get, score what you can, submit. The follow-up version starts with the receptor. Measuring from the 5JQ7 coordinates, the pocket touches only a single GP1-GP2 pair, so we cropped the 6DZM trimer down to a 270-residue construct that keeps the whole pocket plus a shell of supporting residues. The GP1-GP2 disulfide bond was declared explicitly, so the two chains cannot drift apart during the structure prediction, and a pocket constraint keeps the ligand near the 19 contact residues. Every compound was then co-folded against this experimental template with Boltz-2, and its affinity head (the part of the model that predicts binding strength) produced the score.
The score is aff = log10 of the predicted IC50 in µM. Lower means tighter binding: −1 corresponds to about 0.1 µM, +2 to 100 µM. We treat it strictly as a relative ranking inside this campaign, and we will come back to why.
Before spending any compute on the library, we calibrated. Six controls went through the exact same protocol: three known actives (toremifene, clomiphene, and the reference triarylethylene from the Zhao paper) and three small fragments (phenol, anisole, diphenyl ether) that have no business binding a large hydrophobic pocket. With a molecular-weight correction on the affinity head, the weakest active and the strongest fragment are separated by 1.62 log units; without the correction the gap is only 0.34. The correction ships with Boltz-2 itself, so we did not fit it to our six controls; that is what makes the improved separation meaningful to us. The correction stayed on for everything.
We also got a noise floor for free. The library we screened unknowingly contained phenol, anisole and diphenyl ether, the same three molecules as our negative controls, so they were scored twice under identical settings. The replicate spread is a median of 0.046 log units. Our rule from there on: any difference smaller than 0.1 is not a real difference. One caveat on that number: it was measured on three small, rigid fragments, so treat it as a floor on the noise, not the noise itself; the decision-relevant uncertainty for drug-sized molecules is larger, and the results section puts a number on it.
One more methods note, because it matters and is easy to hide: ligands were neutralized and scored as drawn. We did not enumerate tautomers or stereoisomers (clomiphene, for example, is an E/Z mixture in the pharmacy but a single drawn isomer here). That is a stated limitation of the screen.
Why 3D structure is the point
A SMILES string tells you which atoms are bonded to which, not a shape. Binding is a three-dimensional event: a molecule either fits the pocket and makes the right contacts, or it does not. Every score in this screen comes from a predicted 3D complex of ligand and protein, not from the string. Boltz-2 co-folds the two together, so the pose and the affinity come out of the same calculation, and we can inspect what the model thinks binding looks like instead of trusting a number. You can play with all ten top-scoring complexes in the interactive viewer at the top of this post.
To be precise about where the 3D comes from here: part of it is imposed. We co-fold against an experimental template with a pocket constraint, so the protein backbone is anchored by measurement, not discovered by the model. What the model adds is the ligand pose and the score, and those are the parts we can inspect. This is also how we build at Chembricks more broadly: our own models are trained on quantum-chemistry reference data computed on real 3D geometries, and the molecular representations they learn from encode 3D atomic structure. The same holds on the generation side: MolMiner builds molecules fragment by fragment and conditions each step on the force-field-relaxed 3D geometry of the partial structure, which is what lets it steer toward property windows without losing chemical sense. Accounting for 3D structure costs more compute than scoring strings. It is also the step that ties a prediction to something physically checkable.
A quiet box under the desk
The screen ran on a Tenstorrent QuietBox, a liquid-cooled workstation with four Wormhole n300 accelerator cards, an AMD EPYC processor and half a terabyte of RAM. No GPU is involved. Two of the four cards did the screening, running tt-bio, a port of Boltz-2 to Tenstorrent hardware, behind our own Chembricks Fold job API. Fold did the unglamorous work: validating each job, sharding batches of about 20 ligands across both cards, handling retries safely, and asserting that the service holds the right cards before anything starts. For the current Blackhole stack, measured timings and a comparison with NVIDIA H200, B200 and A100 are on the TT-Bio benchmark page.
Why not rent cloud GPUs like everyone else? Three reasons. Cost: co-folding thousands of protein-ligand complexes for a week on rented GPUs is a real bill; for context, muni estimated around $750 in compute for a single autonomous design run on a comparable target, and a multi-thousand-compound screen pushes that higher. We will not pretend the arithmetic always favors the box: for a single one-off screen, rented GPUs would probably finish faster for a few hundred dollars. The case for the workstation is the marginal cost of iteration (every recalibration, re-screen and follow-up batch is electricity, not an invoice) and privacy. The machine's API is reachable only inside our Tailnet, with no public route at all, and even the sequence searches run against a local 1.3 TB database. For this project the sequences and structures are public anyway; for a proprietary compound library or an unpublished structure, nothing needing to leave the building is the point. And throughput turns out to be fine: between 13 and 15 ligands per hour, so the first batch (about 230 compounds) took 15 hours and the second (about 2,080) about six and a half days. A screen like this is an overnight-to-one-week job, not a capacity-planning exercise.
We also learned where the bottleneck actually sits, and it is not where we expected. The structure-prediction leg takes 42 to 50 seconds per ligand on the cards. The affinity calculation then spends five to seven minutes on the host CPU; the host processor, not the cards, is the limit.
What came out of the screen
2,307 unique compounds scored, with zero chemistry failures. (Two inorganic compounds we had included as decoys, lithium carbonate and cisplatin, never made it into the screen: RDKit rightly refuses to treat them as organic ligands.) The library broke down as 220 compounds from our hackathon-era collection, 1,000 close analogs of the strongest early hits, 1,000 deliberately diverse compounds, 80 known drugs, and 7 controls.
| Series | n | Best aff | Median aff |
|---|---|---|---|
| Hackathon-era library | 220 | −0.99 | +0.56 |
| Generated analogs of early hits | 1,000 | −1.61 | −0.27 |
| Generated diverse set | 1,000 | −0.54 | +1.25 |
| Known drugs | 80 | −1.20 | +0.57 |
| Controls | 7 | −0.32 | +1.99 |
The control ladder orders correctly: actives above fragments above the decoy. Toremifene is the strongest known active at −0.32; the fragments sit around +2.0; aspirin, our decoy, lands at +2.75, rank 2,302 out of 2,307. That ordering is the calibration claim the screen rests on, and it comes with a sobering footnote we want to state plainly: toremifene sits at rank 493, so roughly 490 library compounds outscore the best validated active. Given that toremifene's real activity is only micromolar, most of those 490 are likely false positives, and the ladder cannot tell us which few are not. What the ladder does establish is that the model separates binders from non-binders at the extremes, so the unknowns at the top are worth looking at, as a triage list.
| Control | Role | aff | Rank (of 2,307) |
|---|---|---|---|
| Toremifene | Known active | −0.318 | 493 |
| Clomiphene | Known active | +0.192 | 930 |
| Reference triarylethylene | Known active | +0.270 | 974 |
| Phenol | Fragment | +1.986 | 2,170 |
| Anisole | Fragment | +2.039 | 2,190 |
| Diphenyl ether | Fragment | +2.147 | 2,224 |
| Aspirin | Decoy | +2.750 | 2,302 |
At the top of the list, 74 compounds score −1.0 or better. Read that as an enriched tail, not as 74 nanomolar binders: in a pocket whose validated actives are micromolar, a tail this deep says as much about the model's residual generosity as about chemistry. The strongest single score is B2S0219 at −1.61.
| Rank | Compound | aff | Heavy atoms | MW | clogP |
|---|---|---|---|---|---|
| 1 | −1.607 | 28 | 460 | 4.4 | |
| 2 | −1.592 | 32 | 448 | 4.0 | |
| 3 | −1.581 | 28 | 423 | 4.9 | |
| 4 | −1.558 | 49 | 648 | 7.3 | |
| 5 | −1.486 | 41 | 606 | 7.5 | |
| 6 | −1.460 | 33 | 451 | 4.8 | |
| 7 | −1.455 | 29 | 459 | 3.7 | |
| 8 | −1.454 | 32 | 499 | 5.6 | |
| 9 | −1.450 | 32 | 453 | 5.4 | |
| 10 | −1.443 | 28 | 415 | 4.3 |
All ten are analogs of the strongest early hits. Hover a structure and click to copy its SMILES. We print MW and clogP on purpose: the top of the list is heavy and lipophilic, which is partly the pocket and partly the model. Read the ranks as soft: ensemble uncertainty at the top of the list is about 0.7 log units, so the ordering inside the top 25 is closer to a tie cluster than a league table.
The result we actually trust is not any single compound but a family. The top 50 contains ten members of an imidazolidinedione-core series (20 percent), against a library rate below one percent (22 of 2,307): a 22-fold enrichment. Full disclosure of where that family came from, because it matters: 21 of its 22 members are analogs of CPD0114, the strongest compound in our hackathon-era library, so the enrichment denominator is partly our own seeding decision. What convinces us anyway is that the shift survives the two obvious confounders. The family's median score is −1.11 against +0.51 overall. Against size-matched compounds from the rest of the library (same heavy-atom range, n=635, median −0.33) the family is still 0.8 log units better, so it is not just the size bias talking. The family also wins on ligand efficiency, the score per heavy atom (median 0.033 against −0.023 for the library), so it is not just buying score with atoms. A whole chemotype outscoring its own size class by three quarters of a log unit is a much stronger statement than any individual rank, for reasons the next section quantifies.
One more number we want on the record, because every medicinal chemist will compute it anyway: the top 25 are heavy and greasy, with a median MW of 481 and median clogP of 5.4 against library medians of 316 and 3.5, and two of the top five exceed MW 600. Part of that is the pocket, which is large and hydrophobic; part of it is the model's residual fondness for bigger molecules. Any serious follow-up triage should filter on properties and assay-interference risk, not just score.
Two more observations. The top 25 spans 16 different scaffolds, and their median similarity to toremifene, clomiphene and tamoxifen is only 0.16 on a 0-to-1 fingerprint-similarity scale (Tanimoto): structurally almost unrelated. These are not SERM lookalikes, and the pocket seems to like the scaffold shape more than the SERM pharmacophore. And among the 80 known drugs we included, a remdesivir-like compound (−1.20), apalutamide (−1.10) and lopinavir (−1.09) score in the top few percent. Worth some cold water here: these three are among the largest, most lipophilic drugs in the set, which is exactly what our own residual size bias predicts, and their scores sit within ensemble noise of hundreds of other compounds. Most plausibly these are bias-consistent artifacts; certainly nothing actionable.
1 · B2S0219 · −1.61
2 · B2S0034 · −1.59
3 · B2S0775 · −1.58
4 · B2S0564 · −1.56
5 · B2S0292 · −1.49
6 · B2S0307 · −1.46
7 · B2S0304 · −1.46
8 · B2S0880 · −1.45
9 · B2S0823 · −1.45
10 · B2S0233 · −1.44How much of this should you believe?
We re-audited our own conclusions before writing this, and the honest answer is: the family, yes; the exact ordering at the top, no. Bear in mind throughout that this pocket is out of the affinity model's training distribution, so every score is a relative scale, not a measurement. Each affinity value is the mean of two ensemble members (two variants of the affinity model whose disagreement is our uncertainty signal), and their disagreement is a median of 0.46 log units across the library but 0.71 on the top 25. Two members make a thin ensemble, so treat those spreads as a floor on the noise, not a measurement of it; a seed-replicate would be the real test. Even so, the head of the list is a tie cluster inside ensemble noise; B2S0219 is not meaningfully “the” winner. The imidazolidinedione family signal, a shift of one and a half log units across 22 compounds, is far larger than that noise. One thing the median cannot average out is a bias the whole model shares, so the family claim is really “the model's preference for this chemotype is stable,” which is not the same as correct. The assay decides.
Two more checks held up. The molecular-weight correction fixed the controls but did not remove all size bias (the score still shows a rank correlation, Spearman −0.4 to −0.7 depending on the series, with heavy-atom count), so we re-ranked by ligand efficiency, a binding-efficiency index of score per heavy atom: 16 of the top 25 survive that re-ranking, which is reassuring. And the poses are at least self-consistent. By construction, the template-guided co-folding keeps the pocket within about 1 Å of the experimental structure; that is a constraint-satisfaction check, not independent validation. The genuinely informative check is geometric: the top compounds contact 9 to 17 of the 19 pocket residues, while the bottom compounds touch only 4 to 6 and sit at the pocket mouth. Scores and structures agree, which is self-consistency within one model, not proof.
Acknowledgements
Thanks to Kat Yenko for feedback on this article, and to Kat and the muni and onepot teams for organizing Ebolathon and for keeping the synthesis and assay pipeline moving. Thanks also to Rowan, OpenRouter, Modal, Anyscale and Posthog for sponsoring. The hackathon team was Victor C. Onuh, Raul Ortega-Ochoa, Philip Thomas and Jan Weinreich. Raul also produced a MolMiner batch seeded from the tamoxifen series. The Boltz-2 port we ran is moritztng's tt-bio, the structures are 6DZM and 5JQ7 from the Protein Data Bank, and the pocket definition traces to Zhao et al., Nature 2016. The team's hackathon library-matching tool is public.
References
- Zhao, Y. et al. Toremifene interacts with and destabilizes the Ebola virus glycoprotein. Nature (2016). nature.com/articles/nature18615
- RCSB Protein Data Bank, entry 5JQ7: Crystal structure of Ebola glycoprotein in complex with toremifene. rcsb.org/structure/5JQ7
- RCSB Protein Data Bank, entry 6DZM: Bundibugyo virus GP (mucin-deleted) in complex with pan-ebolavirus human antibody ADI-15878 Fab. rcsb.org/structure/6DZM
- Passaro, S., Wohlwend, J. et al. Boltz-2: Towards Accurate and Efficient Binding Affinity Prediction. bioRxiv (2025). biorxiv.org/content/10.1101/2025.06.14.659707; code at github.com/jwohlwend/boltz
- Ortega-Ochoa, R., Vegge, T., Frellsen, J. MolMiner: Toward Controllable, 3D-Aware, Fragment-Based Molecular Design. arXiv:2411.06608. arxiv.org/abs/2411.06608
- moritztng. tt-bio: a port of Boltz-2 to Tenstorrent hardware. GitHub. github.com/moritztng/tt-bio
- moritztng. TT-Bio: biomolecular structure, design and embeddings on Tenstorrent. Performance benchmarks against NVIDIA H200, B200 and A100 (2026). moritztng.github.io/tt-bio
- Yenko, K., Wagen, C., Wagen, A., Alia, D. Hits from a Hackathon. muni research (2026). muni.bio/research/hits-from-a-hackathon
- The team's hackathon library-matching tool. ebalon. GitHub. github.com/janweinreich/ebalon
Try it. The poses and scores above are the real model outputs, so start there. And if you want to run calibrated co-folding screens like this one on your own targets, talk to us.
Screening and simulation results support decisions; they do not replace experimental, regulatory or safety validation.
The Chembricks team
Get new articles by email
Notes on physics validation for AI chemistry, straight from the team. No spam.
Double opt-in. Unsubscribe anytime.