steinborn.dev
← all projects

SARVault

An exploratory cheminformatics project - public bioactivity data from ChEMBL, UniChem, and PDBe turned into a reproducible warehouse with SAR answers.

Python · dbt · DuckDB · Snowflake · Dagster · RDKit · Streamlit
View source
open source under MIT · public data
1,868
compounds
2,222
activity measurements
833
scaffold series
296
activity cliffs
loading 3D structure …

PDB 2FUM · M. tuberculosis PknB kinase domain with mitoxantrone (CHEMBL58) · X-ray 2.9 Å · drag to rotate

01 · The problem

Which payload should we make next?

SARVault is an exploration of cheminformatics at warehouse scale. The guiding questions are the ones a medicinal chemistry team working on cytotoxic ADC payloads keeps asking: how does potency rank across the series, where are the activity cliffs, which analogues exist, what does the chemical neighbourhood look like?

The raw material is public - ChEMBL, UniChem, PDBe - but fragmented across sources with different identifiers, formats, and update cycles. Integrating heterogeneous sources into one consistent, queryable model is the same problem that dominates any enterprise informatics deployment. SARVault works this problem end to end. Every step of the pipeline is reproducible.

Scale is not what makes this hard. Under two thousand compounds fit in memory on any laptop. What makes it hard is that the same molecule wears a different name in every source, while a potency value means nothing without the assay it came from. Both problems stay invisible until an answer is already wrong. A join that silently misses is worse than a join that fails.

02 · The system
Dagster orchestration · GitHub Actions CI: tests, source freshness, parse public sources ChEMBL · UniChem · PDBe extraction raw Parquet + provenance dbt medallion staging → marts · star chemistry layer RDKit: MCS · ECFP4 · UMAP Streamlit app SAR ranking · cliffs · maps
DuckDB locally, Snowflake via profile switch - identical dbt models on both

27 dbt models carry the material from raw API responses through staging into marts and an analytics layer, orchestrated as a Dagster asset graph with the dbt tests surfaced as asset checks. UniChem is read from the bulk mapping dumps rather than the live API, which proved the more reliable route. PDBe ligand codes are resolved to concrete co-crystal entries, so the viewer above shows a real structure rather than a promise.

03 · Why it holds up

Systematic activity-cliff detection

Structurally similar pairs with sharp potency differences, scored from ECFP4 fingerprints at warehouse scale - the places where SAR intuition breaks and the interesting chemistry lives.

Chemical space you can see

Bemis-Murcko scaffold series and a 2D UMAP embedding of the payload landscape, computed in the analytics layer and explorable interactively in the app.

Warehouse discipline on public data

Medallion architecture with dbt, incremental fact tables and SCD2 snapshots across ChEMBL releases - the source data changes, history stays queryable.

The cliff definition is a number, not a feeling

A pair counts as an activity cliff when its ECFP4 Tanimoto similarity is at least 0.75 and its potency differs by at least one pChEMBL unit, a factor of ten. Both thresholds are dbt variables, chosen from a profile of the real data rather than from habit. Pairs whose 2D fingerprints are identical are flagged rather than counted, because those are stereochemistry, tautomers or repeat measurements wearing a cliff's clothing.

Aggregation rules live upstream, where they can be tested

Only measurements with a standardized potency value, an exact relation and an admitted endpoint type reach the fact table, so censored values never enter and cannot be averaged into something that looks like activity. Per compound and target the warehouse exposes a median and a maximum with the number of measurements and assays beside them. No plain mean exists anywhere for a dashboard to pick up.

Observability built in

Source freshness checks, anomaly guards, fixture-isolated CI on GitHub Actions, published lineage docs, and versioned warehouse artifacts distributed via GitHub Releases.

04 · What it produces

A ranked list of the pairs worth looking at. 296 activity cliffs across the target set, ordered by steepness rather than by similarity alone, each rendered side by side with both structures.

A map of the chemical space. 1,868 compounds projected to two dimensions from their fingerprints, coloured by potency, clickable through to the underlying series.

A bridge from a molecule to its crystal structure. 370 links from a compound to a PDB entry, resolved from ligand codes, which is what feeds the 3D viewer at the top of this page.

Nine views over one warehouse. Overview, SAR, selectivity, series, space, library, cliffs, payload comparison and data quality, all reading the same marts.

05 · Scope

The scope is deliberately narrow. Four targets, chosen around cytotoxic and tubulin-targeting chemistry, the space behind ADC payloads and classical chemotherapeutics. This is not a general-purpose bioactivity warehouse and does not pretend to be.

There is no predictive model. SARVault describes and organizes, it does not predict potency. That is a decision rather than a gap: the question here was whether public data can be made trustworthy enough to reason over, not whether a regressor can be fitted to it.

Snowflake is prepared, not proven. The same dbt models build against a second profile, which has not been run against a live account.

The data is public and the code is MIT. Everything on this page can be reproduced from the repository, against ChEMBL release 36.

06 · Notes from this project
2026-08-06 cheminformatics

What a UMAP of chemical space can't tell you

The map of nearly two thousand molecules looks like insight. Here is what neighborhood really means in a fingerprint projection and which distances are fiction.

2026-08-05 data-science

How a molecule becomes a vector

ECFP fingerprints turn a structure into a bit vector. The hashing trick and Tanimoto similarity are what make that comparison work at warehouse scale.

2026-07-31 cheminformatics

When similar molecules disagree

How SARVault finds the compound pairs that break SAR intuition in ChEMBL data, with RDKit fingerprints and a warehouse query.

2026-07-21 cheminformatics

Three databases, one molecule

ChEMBL, UniChem, and PDBe disagree about what counts as the same compound. On InChIKeys, salt forms, and why integration is chemistry before it is SQL.

2026-07-15 cheminformatics

Averaging IC50 values

Why averaging IC50 values fabricates SAR. How to aggregate public bioactivity data honestly.

Explore the chemical space.

Open live demo
public ChEMBL data · runs on Streamlit Cloud · idle apps take a moment to wake