What if finding the right dataset took minutes, not days?
Locus: search 891k omics datasets in plain English, counted by code
- Runs on
- Web
- First released
- Updated
- Award
- 1st place, Reinvent the Wheel (London)
Locus finds public omics datasets from a plain-English question, then counts the case and control samples in each with code instead of asking a model. It searches 891,000 datasets across 18 repositories. It's for biologists who now hunt through GEO, PRIDE and ENA by hand.
We built it as a team at Reinvent the Wheel, a Tools for Science hackathon in London, on 17 and 18 October 2026, and it won 1st place. I wrote most of the commits. jurilw added the processing pipeline, the figures, the proteomics sample counts and the explanation step, and Charlotte Ellison also contributed.
A model never writes a number
A chatbot can name good datasets, but it guesses how many samples each one holds. So in Locus a model plans the search and picks one field, and code does the counting.
- Claude Sonnet 5.5 plans the search: synonyms, organism, and which assays must come from the same samples.
- SQLite full-text search (BM25) and PubMedBERT embeddings each rank datasets, and reciprocal rank fusion merges the two lists.
- Claude Haiku 5.5 triages the candidates.
- For GEO, the model only chooses which field in the sample records separates case from control.
- Code in
omics_agent/samples.pycounts the samples. Counted facts override any model answer. - Code grades each dataset "usable as is" or "close match" and names which of four checks failed: topic, material, data type or controls.
Accessions come only from repository records, and Locus shows a quote only if it appears word for word in the metadata.
An example: mTOR inhibition
For the query "Matched RNA-seq and Ribo-seq before and after mTOR inhibition", Locus ranked GSE36892 and GSE35469 second and seventh. GEO DataSets and OmicsDI returned nothing.
Locus counted GSE36892 as 4 plus 4 Ribo-seq libraries and 2 plus 2 RNA-seq libraries, and warned that 4 Ribo-seq libraries have no matching RNA-seq. A chatbot with web search guessed 8 plus 8. We recounted four studies by hand and all four Locus counts matched.
Strict on purpose
A Ribo-seq library pairs with an RNA-seq library only if the titles match after assay words are removed and the characteristics match. An unclear pair gets an _unpaired suffix. Locus writes a contrast only with at least 2 pairs per side, and it refuses GSE129816, where untreated and Torin1-treated wild-type samples both sit under "control".
How well it works
I compared Locus with Claude Opus 5.5 using web search, on 8 harness questions (docs/evaluation.md). Locus returned 15 of the 34 datasets Opus named that Locus indexes, and 12 graded strong.
Locus is no better than Opus at picking datasets. Opus chose better ones on 2 of the 8 questions, and Locus misses PXD020186, GSE100007 and PXD058312. Where Locus wins is the counts.
Samplesheets for 10 GEO Ribo-seq studies all pass the pipeline input schema. In 3 biologist interviews, 10 of 10 tasks finished without leaving Locus, though 2 needed sources beyond the named dataset.
The laptop RNA-seq pipeline
During the hackathon we added omics process. It reads the first 2,000,000 reads of each FASTQ file and runs salmon, tximport, DESeq2 and apeglm. It then draws five figures and writes a short explanation, and code checks every number in it and drops any it can't verify.
The first run builds an index in about 7 minutes and uses 3.3 GB of RAM on an 8-core ARM machine. After that a 6-sample study takes about three minutes. The worked example is GSE273888, HeLa cells with 100 nM rapamycin against no treatment.
Limits
- The pipeline reads a subsample, handles one contrast per dataset with at most 4 samples per side, and supports only human and mouse.
- Locus counts sample records, not patients.
- The model picks the case and control field, so a wrong pick gives a wrong contrast.
- Triage isn't cached, so the same query can return different results.
- Most ENA, EGA and dbGaP records lack a species. Proteomics counts cover about 28% of PRIDE.
- Controlled-access data (EGA, dbGaP) gets a link only.
- No wet-lab scientist has reviewed the biology of the worked example.
- The first look is a Welch t-test screen, not DESeq2.
Against other tools
GEO DataSets search and OmicsDI work well for exact keywords, but they returned nothing for the plain-English example above. Chatbots with web search find good datasets, sometimes better than Locus, but they guess sample counts. The nf-core pipelines riboseq and rnaseq run the real analysis. Locus only writes their inputs or runs a subsampled preview.
Try it
The source is at https://github.com/hridaya423/locus under Apache-2.0. There's no hosted demo. You need uv, Node 20 or later, and an Anthropic API key.
uv sync
cp .env.example .env
uv run omics "I work on lung fibrosis in humans and need single-cell and proteomics data from patients and healthy controls"
Without the 1.3 GB local index, Locus searches only the live GEO, PRIDE and CELLxGENE APIs. To add it as an MCP server for agents, run claude mcp add locus -- uv run --directory "$PWD" omics-mcp.