-
-
home_page
-
research_questions
-
four_historical_layers
-
botanical_case_studies
-
reviewed_claims
-
source_register
-
evidence_ledger
-
backtest_results
-
analysis_methodology
-
temporal_model_status
-
end_to_end_pipeline
-
extraction_and_harmonisation
-
temporal_reveiw_and_eligibility
-
temporal_ranker
-
application_architecture
Inspiration
Every ethnobotany talk tells the same stories. Willow led to aspirin, goat's rue led to metformin, periwinkle led to vinblastine. They are true, but they are chosen after the fact. Nobody counts the thousands of written claims that went nowhere.
The closest prior work counts confirmations without a baseline. Yarnell & Touwaide (2019) took Dioscorides' diuretic plants and found that most of the studied genera were "confirmed". The missing question is how many random plants would also come out as diuretic.
There is also a known confounder: research effort. Plants with more traditional uses get more papers, and more papers mean more chances to confirm something. A herbal can look prophetic just because it named the plants scientists were going to study anyway.
So we asked one narrow question that can be tested:
When an old text said "this plant treats X", was that pair confirmed more often than a fair control, once you account for which plants science was going to study?
Either answer is a result. If tradition beats the controls, that is the first quantified effect size for the idea. If it doesn't, that is a rigorous negative result.
What it does
Antikythera is a research workbench with a hosted observatory. It turns four historical source layers into dated, auditable claims and checks them against dated pharmacology, without letting the future leak into the past.
A run goes like this:
- Collect sources. It acquires four layers with licence and edition records: Dioscorides (Berendes' 1902 German translation), Paul of Aegina Book VII (Adams, 1844–47), Culpeper's Complete Herbal, and open-access Balkan ethnobotany tables (Pieroni et al., CC BY).
- Extract claims from exact spans. A deterministic extractor proposes plant–indication claims. Each proposal is tied to SHA-256-checked byte offsets in the raw file. Result: 2,972 proposals from 844 chapters and 91 table rows.
- Map indications. A TF-IDF baseline maps each claim to one of twelve categories (metabolic, joint, urinary, and so on).
- Resolve identities as probabilities. A historical name like Dioscorides' mekon is not one species. It becomes a distribution (0.8 Papaver somniferum, 0.2 P. rhoeas), each with a date when that knowledge was available. The analysis samples from these distributions instead of picking one answer.
- Build the evidence ledger. Dated studies come from Europe PMC/PubMed. Each is graded by verdict, study tier (in vitro, in vivo, clinical) and scope (whole plant or isolated compound). Only original botanical studies count. A confirmation needs in vivo or clinical support.
- Run the time machine. It freezes the record at 1900, 1950, 1980, 2000 and 2010. At each freeze it sees only the claims and evidence dated up to that year, then looks 20 years ahead.
- Compare against matched controls. Claimed pairs are compared with unclaimed pairs matched on the same species, the same family and indication, or similar earlier research effort. A "famous plant" ranking by publication volume is the baseline to beat. Identity sampling and family bootstrap carry uncertainty into every number.
- Rank and publish. A LightGBM ranker is trained, calibrated and evaluated on separate calendar windows, never a random split. The React observatory shows the whole chain, from source sentence to verdict.
What we found
We reviewed 21 claims (poppy, corn poppy and periwinkle across Dioscorides and Culpeper), 4 identity distributions, 9 taxa, 40 evidence grades and 30 research-effort records. Then we ran the real pipeline.
4 species–indication pairs tested on the plant itself
→ 3 confirmed in vivo (goat's rue, poppy seed, Madagascar periwinkle; all metabolic)
→ 0 of those 3 claimed by the reviewed texts
precision@4 tradition = 0.75 famous-plant baseline = 0.75
risk ratio undefined (no reviewed claimed pair has been tested yet)
None of the three confirmations was claimed by tradition. Modern testing followed the metformin and vinca stories, not the herbals.
That is the "null wins" outcome, and we report it as it is. The project is built so that this result can't be tuned away.
How we built it
Pipeline (Python)
- Source adapters per layer: an OCR lexicon for the German Dioscorides, a commentary cut-off for Adams' Paul, and rowspan expansion for the Balkan XML tables.
- Exact-span extraction with byte-offset validation. A claim whose span doesn't match the raw file fails the build.
- TF-IDF indication mapping with scikit-learn.
- GBIF backbone for modern taxonomy candidates. Name-match scores never become historical identity probabilities automatically.
- Europe PMC and PubMed retrieval, cached, with dated publication records and annual publication counts for the research-effort covariate.
- DuckDB for local records, jobs and an append-only review trail, with Parquet exports.
timemachine/: freezes, three matched comparisons, the famous-plant baseline, identity draws, family bootstrap, and era and inherited-claim ablations.- LightGBM with sigmoid calibration. Train, calibration and evaluation freezes are 1950, 1980 and 2000. Models persist as JSON, not pickle files.
Workbench (FastAPI + React)
- In local mode, FastAPI serves a review API: name, decision, reason and attestation for every record, with revision checks to prevent stale overwrites.
- A React 19 + Vite observatory with seven views: Time machine, Corpus & review, Evidence ledger, Backtest results, Plant identities, Research shortlist and The method.
- A scroll-driven landing page: a year dial running from 60 CE to 2026, a roadmap of the four layers, and case-study cards that freeze the record the year before each discovery.
Hosting
- A static snapshot on Render, rebuilt from
mainon every push. Live at antikythera-unsg.onrender.com.
Design decisions that shaped the result
- Time cuts, never random splits. A random split would let 2015 evidence teach the model about 1950. Every feature and label is cut at the freeze year.
- Controls before charts. Matching on the same species, the same family and similar research effort targets the specific ways tradition can look good by accident.
- A compound is not a plant. Colchicine, morphine and paclitaxel papers are graded and stored, but they can't confirm a whole-plant use.
- Sources over stories. Checking the sources changed our case studies:
- The Colchicum gout line in our Dioscorides edition is Berendes' 1902 commentary, not the ancient text.
- Chapter 193 is about Cyclamen.
- Culpeper's "periwinkle" is Vinca, not Catharanthus.
- The yew behind paclitaxel is the Pacific yew, not the Mediterranean one.
- Uncertainty is part of the data. Identities are distributions, families are resampled, and missing records stay unknown instead of becoming "not confirmed".
- Misses are shown next to hits. The case-study cards include plants where tradition missed or was dangerous, each with a hazard trail.
What is real and what is still open
Real: the source texts and checksums, the 2,972 extraction proposals, 69 unique PubMed records, the reviewed records and pipeline run, and the matched comparisons and numbers above.
Disclosed: the review was AI-assisted, and every reviewed record names its reviewer that way. DISCLOSURE.md describes exactly what was reviewed and how.
Open:
- Independent audits. The 200-claim, 150-mapping and 300-abstract audits are not done, so the report status is exploratory analysis and there is no headline effect size.
- Temporal windows. Literature retrieval was capped and returned mostly recent papers. Every tested pair was first tested between 2021 and 2025, so the mature 20-year windows are empty, and the 2010 window doesn't close until 2030.
Challenges we ran into
- Ancient dates are ambiguous. Translator commentary and later edition additions would have created false early evidence if we had dated every Culpeper line to 1653.
- Historical names map to several species. A single "best guess" would hide most of the uncertainty.
- The research-effort confounder is easy to name and hard to control. It needed dated annual counts, not one total.
Accomplishments that we're proud of
- An end-to-end pipeline from raw historical text to temporal backtest, with byte-level provenance on every claim.
- Three matched controls, a famous-plant baseline, identity sampling and family bootstrap, all running on real reviewed records.
- A validator that rejects reviewed claims whose spans don't match the source file.
- A public observatory that shows how each result was reached, not just the result.
- 105 passing tests across the Python invariants and the frontend data boundaries.
What we learned
The famous discovery stories don't survive a careful read of the sources unchanged. A rigorous backtest also needs old evidence as much as old claims. Without dated early studies, the time machine has nothing to score.
What's next for Antikythera
- Re-collect literature oldest-first, with broader synonym coverage, so the 1950–2000 windows fill with real first tests.
- Recruit independent reviewers for the audits and release the headline number, whichever way it goes.
- Extend coverage to more sources (Paul of Aegina and the Balkan layer in full) and more indication categories.
- With domain experts, turn the forward ranker into a short, hazard-checked list of untested plant–indication pairs worth a lab test.
This is a tool for prioritising lab research. It gives no medical advice, and the illustrations must not be used to identify plants.
Built With
- duckdb
- europe-pmc
- fastapi
- gbif
- lightgbm
- python
- react
- scikit-learn
- vite