13 classics, one schema
Eleven repertories plus two materia medicas — Kent, Clarke, Hering, Bryant, Pulford and more — all normalised to the same field model.
Open-domain classical homoeopathy, compiled into clean, app-ready JSON. 13 public-domain Materia Medica and Repertory classics (1840–1906), extracted from their scanned page images into structured, self-describing JSON.
Every remedy and rubric string is kept verbatim from the source — nothing invented, paraphrased or filled in. Unknown fields are null, never a guess.
// what you get
Two shapes, both self-describing via a top-level "type" field — one for repertories (rubric → remedies) and one for materia medica (remedy → symptoms).
Eleven repertories plus two materia medicas — Kent, Clarke, Hering, Bryant, Pulford and more — all normalised to the same field model.
Every text string is copied character-for-character from the source scan. Extraction quality is reported per book so you know exactly what you hold.
Kent alone ships 59,114 rubrics across 34 chapters, with 353,000 remedy links — the whole library totals roughly 108,000 rubrics.
No build step, no install. Pull any book straight from a raw or jsDelivr URL into a browser app, a Node script or a notebook.
The extraction is fully reproducible: pipeline/omm_pipeline.py classifies a source text, applies the right grammar parser and reports a verbatim-fidelity rate.
Files are compact JSON (no indentation) — roughly 40% smaller than pretty-printed, and they parse identically. Ideal for shipping inside an app.
// structure
Every file is self-describing. "type" is either "repertory" or "materia_medica"; schema_version is "1.0".
Shared by both shapes.
| field | type | notes |
|---|---|---|
| id | string | slug, e.g. kent-repertory-1897 |
| title | string | full title |
| author | string | author(s) |
| year | integer | year of the edition used |
| publisher | string | where known, else "" |
| source_file | string | the OCR text file it was built from |
| counts | object | { sections, rubrics, remedy_links } or { remedies, symptoms } |
| field | type | rule |
|---|---|---|
| sections[].title | string | a chapter (e.g. Mind, Stomach), or General when the source has no chapter structure |
| rubrics[].text | string | the symptom string, verbatim from the source |
| rubrics[].parent | string|null | for sub-rubrics, the heading this entry refines; null for a top-level rubric |
| remedies[].abbrev | string | the remedy exactly as printed |
| remedies[].grade | integer|null | 1–3 only if the source prints a grade, otherwise null — never defaulted |
| remedies[].name | string|null | canonical remedy name, resolved where possible, else null |
| remedies[].polarity | string | printed polarity marker (e.g. +) |
| rubrics[].note | string|null | verbatim prose attached to a rubric (Jahr Part II), else null |
| remedy_index | object | every printed remedy token → { name, resolved } |
| field | type | rule |
|---|---|---|
| remedies[].name | string | the remedy as printed (may be OCR-damaged in some books) |
| remedies[].abbrev | string | printed abbreviation |
| remedies[].canonical_name | string|null | best-effort resolved name, else null |
| symptoms[].chapter | string | the labelled group the symptom belongs to (e.g. Stools, Aggravation), or General |
| symptoms[].text | string | the symptom string, verbatim |
| symptoms[].grade | integer|null | only if printed, else null |
1. Verbatim — every text is copied from the source, not rewritten. 2. No invention — unknown values are null; grades are never assumed. 3. Validation — each file passes schema validation with zero errors and reports a verbatim-fidelity rate in its QC report.
// sample
A trimmed extract from a repertory file — the top-level type, the book metadata, and a rubric with its graded remedies.
{
"schema_version": "1.0",
"type": "repertory",
"book": {
"id": "kent-repertory-1897",
"title": "Repertory of the Homoeopathic Materia Medica",
"author": "James Tyler Kent",
"year": 1897,
"publisher": "Philadelphia: Examiner Printing House",
"language": "en",
"public_domain": true,
"source_file": "data/source_txt/kent-diff.txt",
"pipeline_version": "omm_pipeline 1.0",
"counts": { "sections": 34, "rubrics": 59114, "remedy_links": 353000 }
},
"sections": [
{
"id": "kent-repertory-1897-s1",
"title": "Mind",
"rubrics": [
{
"id": "kent-repertory-1897-r00001",
"text": "Anger (Irascibility) …",
"parent": null,
"remedies": [
{ "abbrev": "Acon", "grade": null, "polarity": "+", "name": "Aconitum napellus" }
]
}
]
}
],
"remedy_index": {
"Acon": { "name": "Aconitum napellus", "resolved": true }
}
}
{
"schema_version": "1.0",
"type": "materia_medica",
"book": {
"id": "bell-therapeutics-1906",
"title": "Homoeopathic Therapeutics",
"author": "James B. Bell",
"year": 1906,
"counts": { "remedies": 103, "symptoms": 5547 }
},
"remedies": [
{
"name": "Aconitum Napellus",
"abbrev": "Acon",
"canonical_name": "Aconitum napellus",
"symptoms": [
{ "chapter": "Mind", "text": "Anxiety, with fear of death", "grade": null }
]
}
]
}
// the set
Eleven repertories and two materia medica books, extracted from public-domain scans. Every text string is verbatim from the source scan; unknown values are null, never a guess.
| Book | Year | Rubrics |
|---|---|---|
| Kent's Repertory | 1897 | 59,114 |
| Clarke's Clinical Repertory | 1900 | 12,537 |
| Hering's Repertory | 1889 | 11,156 |
| Bryant's Pocket Repertory | 1900 | 8,892 |
| Pulford — Rheumatism & Sciatica | 1898 | 7,518 |
| Sensation-as-if | 1890 | 2,721 |
| Vilas — Eye & Ear | 1890 | 2,465 |
| Humphreys — Sexual System | 1860 | 1,280 |
| Jahr — Symptomatology | 1847 | 587 |
| Lippe's Repertory | 1879 | 452 |
| Drake — Foot-sweat | 1894 | 84 |
| All repertories | 11 books | ~108,000 |
Plus two materia medica books, counted separately: Jahr's Manual, Part I (199 remedies / 26,734 symptoms) and Bell's Therapeutics (103 remedies / 5,547 symptoms). Authors are credited in CREDITS.md; Kent ships split by chapter — 34 chapter files + index.json.
Data only — this repository ships the JSON dataset and its extraction pipeline; there is no app or interface to preview.
// get started
No build step and no install. Read any book straight from a raw URL or a jsDelivr CDN URL. Files are compact JSON and parse identically to pretty-printed.
import json, urllib.request
URL = "https://raw.githubusercontent.com/drsamonline/" \
"homoeopathic-materia-medica-repertory-json/main/" \
"repertory/kent-1897/index.json"
rep = json.load(urllib.request.urlopen(URL))
for sec in rep["sections"]:
for r in sec["rubrics"]:
if any(x["abbrev"] == "Acon" for x in r["remedies"]):
print(sec["title"], ">", r["text"])
const base = "https://cdn.jsdelivr.net/gh/drsamonline/" +
"homoeopathic-materia-medica-repertory-json@main/";
const rep = await fetch(base + "repertory/kent-1897/mind.json")
.then(r => r.json());
const mind = rep.section;
console.log(mind.rubrics.length, "mind rubrics");
The branch is main. Swap the path for any book listed below.
| book | author | year | size | verbatim | path |
|---|---|---|---|---|---|
| Kent’s Repertory | James Tyler Kent | 1897 | 59,114 rubrics | 94.1% | repertory/kent-1897/index.json |
| Clarke’s Clinical Repertory | John Henry Clarke | 1900 | 12,537 rubrics | 100% | repertory/clarke-clinical-1900.json |
| Hering’s Repertory | Hom. Med. Soc. of Pennsylvania | 1889 | 11,156 rubrics | 93.7% | repertory/hering-repertory-1889.json |
| Bryant’s Pocket Repertory | J. Bryant | 1900 | 8,892 rubrics | 90.2% | repertory/bryant-pocket-1900.json |
| Pulford — Rheumatism & Sciatica | Alfred Pulford | 1898 | 7,518 rubrics | 92.6% | repertory/pulford-rheumatism-1898.json |
| Sensation-as-if | A. W. Holcomb | 1890 | 2,721 rubrics | 100% | repertory/sensation-as-if-1890.json |
| Vilas — Eye & Ear | O. H. Vilas | 1890 | 2,465 rubrics | 80.3% | repertory/vilas-eye-ear-1890.json |
| Humphreys — Sexual System | F. Humphreys | 1860 | 1,280 rubrics | 100% | repertory/humphreys-sexual-1860.json |
| Jahr — Symptomatology | G. H. G. Jahr | 1847 | 587 rubrics | 100% | repertory/jahr-repertory-1847.json |
| Lippe’s Repertory | Constantine Lippe | 1879 | 452 rubrics | 88.7% | repertory/lippe-repertory-1879.json |
| Drake — Foot-sweat | Olin M. Drake | 1894 | 84 rubrics | 100% | repertory/drake-foot-sweat-1894.json |
| Jahr’s Manual, Part I | G. H. G. Jahr | 1847 | 199 remedies / 26,734 symptoms | 98.7% | materia_medica/jahr-materia-medica-1847.json |
| Bell’s Therapeutics | James B. Bell | 1906 | 103 remedies / 5,547 symptoms | 97.2% | materia_medica/bell-therapeutics-1906.json |
Kent ships split by chapter in repertory/kent-1897/ (34 chapter files + index.json). A few large files exceed GitHub’s per-file upload limit and ship as parts — extremities.json + extremities-2.json, and jahr-materia-medica-1847.json + jahr-materia-medica-1847-2.json. Concatenate the parts.
Data: CC0 1.0 Universal — public domain dedication. Free to use, modify and redistribute, including commercially. Source texts were all published before 1929 and are in the public domain. Please credit the authors of each book and the JSON compiler (Dr Sohil Momin) wherever this data is used — see CREDITS.md.
// faq
"grade": null mean? ▸null. Grades are never defaulted or assumed. The same no-invention rule applies to every unknown value — it is null, never a guess.repertory/kent-1897/ — 34 chapter files plus index.json — so an app can load one chapter at a time. Its single 21 MB file exceeds GitHub’s per-file upload limit, so it ships as parts (e.g. extremities.json + extremities-2.json). Concatenate the parts to rebuild the full file.pipeline/omm_pipeline.py classifies a source text, applies the right grammar parser, validates the output and reports a verbatim-fidelity rate. skill/omm-json-builder/ packages the same pipeline as an agent skill.