Inspiration

A small lab's first experiment is often a one-shot guess. A student or a two-person biotech picks a compound and a target, guesses a concentration range, and runs a 96-well dose-response plate to find the IC50, the concentration that cuts the target's activity in half. If the range misses, the plate is wasted: compound, robot time, and about a week. The guess is hard because published numbers disagree. Kalliokoski et al. (2013) compared thousands of ChEMBL IC50 measurements of the same compound on the same target and found a typical lab-to-lab spread of 0.68 log units, close to 5-fold. For lapatinib on HER2, the 21 ChEMBL papers we use spread about 8.6-fold. Robot simulators tell you a protocol runs, not whether its answer will be right. AI "co-scientists" exist (Google's AI co-scientist, CMU's Coscientist), but they are not built for a student with one robot and a small budget. We wanted the opposite of hype: a planner where every number can be traced to a source, and anything simulated says so.

What it does

Type a research question, like “HER2 kinase inhibitors in breast cancer.” Titrate takes it through four stages in a few seconds, then tells you what to change.

First, it asks whether the topic is worth it. Titrate finds the OpenAlex topic where papers matching your question actually live and pulls its yearly publication counts from 2015 to 2024. A trained momentum model estimates the chance the field grows faster than typical. A viability matrix combines momentum, novelty, evidence, automatability and cost into one score, a weighted average using weights you control. It also suggests less crowded topics nearby, with one click to switch.

Second, it designs a first experiment from real measurements. Titrate starts from the median of published ChEMBL IC50 values and how widely they spread. It brackets that guess by at least 2 log units (100-fold) on each side, or 1.645 times the measured spread if that is wider. For lapatinib on HER2 that gives 10 concentrations at a 3-fold dilution from 2,399 nM down to 0.12 nM, with 3 replicates and 4 positive and 4 negative controls. A design review then checks every citation in code. A ChEMBL claim is re-rendered from the record itself, and a literature quote only counts if it is an exact run of whole sentences from the cited abstract. Model-written text is never marked verified. An optional LLM skeptic (Gemini) can object to the design, and when an API key is configured, each objection is re-simulated so the numbers decide. Third, the robot runs it in simulation. A fixed template, with no model-written code, compiles the design into an Opentrons Flex protocol, and the official Opentrons simulator executes it: 463 log lines, 38 tips and 850 µL of compound, all counted from the run log. An animated deck replays the run. Tips leave the rack, rows fill from blue to pink as the dilution proceeds, and a plate audit checks that every well ends as planned. Fourth, it shows how wrong the answer could be. Titrate runs 1,000 virtual experiments. Each one draws a true IC50 from the real lab-to-lab spread, adds pipetting error from the published Opentrons spec and plate-reader scatter, then fits the standard four-parameter dose-response curve. It reports the fold error, meaning how many times too high or too low the measured IC50 is compared with the true one. For the HER2 design, 9 in 10 virtual experiments land within 1.22 times the truth. Finally, it tells you what to change. Sliders for top concentration, dilution factor, number of points, replicates and transfer volume re-simulate the robot run and the 1,000 experiments in about a second. A planner ranks changes by how much error they remove per tip and microliter, and warns when a change makes things worse. Every number shows its source on hover: OpenAlex, ChEMBL, the Opentrons spec, the simulator, or “simulated, seed 42.”

How we built it

We worked contract-first. The four of us agreed on four JSON contracts between the stages, written as Pydantic models and Kiro specs, then built against validated sample data so nobody waited on anyone.

For data we used OpenAlex for topics and publication counts, and ChEMBL for IC50 values (binding assays only, one value per paper, flagged duplicates removed). We also froze a set of PubMed abstracts for quote checking. Every API response is cached in SQLite.

The momentum model is a gradient-boosted classifier trained on 1,452 OpenAlex topics. It uses only 2015 to 2019 counts as features (trend slope, level, volatility, last-year jump, curvature, and field) to predict growth in 2020 to 2024. It reached an AUROC of 0.709, plus or minus 0.024, against 0.697 for a simple slope baseline, and won 21 of 25 test splits. The robot side is a fixed Python template targeting the Opentrons Flex at API level 2.20, run with opentrons 10.1.0. A closed-form cost model is property-tested against what the simulator counts. The uncertainty engine is a vectorized Monte Carlo in numpy with scipy curve fits, about 25% faster after we gave the fitter the exact derivatives of the curve. We calibrated it against held-out real ChEMBL measurements, using a 90% predictive interval that accounts for the uncertainty in the estimated mean as well as the spread. The frontend is React, TypeScript and Vite, with a hand-drawn SVG deck and charts, and a source on every number. We built it with Kiro: specs for each stage, steering docs for our honesty rules and Opentrons gotchas, hooks for typechecks and contract sync, and property-based tests with Hypothesis and fast-check. That came to 58 commits in one day.

Challenges we ran into

Google Scholar was off limits. We planned to scrape it, then found its robots.txt disallows it and its terms forbid automated access, so we rebuilt on OpenAlex, PubMed and ChEMBL instead. The public data was messier than expected. An early check put lapatinib’s median IC50 at 10 nM because of duplicate records. With one value per paper it is 24 nM from 21 papers. OpenAlex’s topic search found zero topics for natural-language questions like “JAK inhibitors in autoimmune disease,” and it files “Advanced Breast Cancer Therapies” under pulmonary medicine, which made our first nearby-topic suggestions nonsense. Grouping the papers that match a question by their primary topic fixed both problems Our first citation checker could be fooled. It could give a green badge to a model’s paraphrase, so we rebuilt it so only text that code can prove gets a green badge. Our first calibration interval ignored the uncertainty in the estimated mean, so it was too narrow. With the corrected interval, the 90% range covers 89% of held-out measurements at the published spread. We also learned that simulators check syntax, not science. Our first protocol passed the Opentrons simulator, yet it pipetted only row A and left the top well empty. The plate audit and a rewritten compiler came out of that bug. Finally, the momentum model plateaued at an AUROC of 0.703. Shape features helped, but forecasting research trends stays hard, so we report the baseline next to the model.

Accomplishments that we're proud of

One question goes to a simulator-verified robot protocol and 1,000 virtual experiments in seconds, and it can run offline from cache. Every number on screen carries a source or is labeled simulated, so we never present a guess as data. The uncertainty model is checked against real measurements, not just against itself. Property-based tests tie the cost model to the actual simulator and keep the momentum features from seeing future data. And the animated replay and plate audit catch real protocol mistakes, not just bad syntax.

What we learned

Biology dominates robot error. Labs disagree by 0.68 to 0.93 log units, while the published random error of the Flex 1-Channel 1000 µL pipette at 50 µL is 0.3%. So the planner spends its effort on concentration range and replicates, not pipetting. Honesty is an architecture decision. Putting a source on every field changed our contracts, our interface, and our tests. Working contract-first with sample data let four people build five stages in parallel in one day. Public datasets have quirks that only show up when a real question flows through them end to end.

What's next for Titrate

We want to support any ChEMBL target and compound with enough independent papers, not just our three prepared pairs. We want the LLM skeptic on by default, plus literature quotes from PubMed abstracts as a second kind of evidence, which the checker already supports. We want to close the loop by letting people upload real plate-reader results and update the starting guess, so the second experiment learns from the first. The generated protocol already passes the official simulator, so the next step is a real Opentrons Flex, ideally with a BU lab, comparing the predicted spread to the measured one. And we want more assay formats: 384-well plates, 8-channel pipettes, and costs in dollars based on user prices.

Built With

Share this project:

Updates

Submission history