Longevity scores you can check line by line.
Evum turns your blood panels into a longevity score, a biological age, and a timeline you own. Every threshold has a citation, every formula is in the repository, and your reports are read on your own device.
Real output of computeDomainScores, from the example panel below.
The whole chain, in public
Nine markers in. A biological age out. Every step readable.
Below is an example panel for a 41-year-old male, the nine inputs the Levine PhenoAge formula takes, and what our engine returns for them — computed at build time by the same functions the app calls. Clone the repository, feed in these numbers, and you get 41.4 as well. That is the whole claim.
Example panel
canonical units- Fasting Glucose97mg/dL
- hs-CRP2.4mg/L
- WBC7.210³/µL
- Lymphocytes23.5%
- RDW13.6%
- Albumin43g/L
- ALP78U/L
- Creatinine88µmol/L
- MCV91fL
Example measurements, not anyone's data. The ranges they are graded against are not examples — they come from marker-ranges.yaml with a citation each.
Biological age
PhenoAge, years
vs 41 chronological
Levine coefficients, pinned by a unit test rather than tuned. Nine inputs are required — an incomplete panel names what is missing instead of estimating.
What is costing years
Each bar re-runs the same formula with that one marker moved to the near edge of its optimal range. Independent counterfactuals — they do not sum to the total.
- RDW+1.2 yr
13.6 % → 13.26 %
- Fasting Glucose+0.6 yr
97 mg/dL → 91.75 mg/dL
- hs-CRP+0.6 yr
2.4 mg/L → 1.35 mg/L
- WBC+0.1 yr
7.2 10³/µL → 6.94 10³/µL
Ranges, not verdicts
A reading is a position, not a pass or a fail.
Every marker carries a direction and a shape — below a threshold, above one, or inside a band — and each is drawn from the reviewed config. The band edges are found by bisecting the classifier itself, so the boundary you see and the grade on the value can never disagree. That is also why they are not round numbers.
State is always a shape and a word, never a colour on its own: our brand green and our "optimal" green are too close for many readers to separate.
Optimal < 100 mg/dLAt risk
Optimal > 55 mg/dLstratified for this cohortBorderline
Optimal 40–60 ng/mLAt risk
Six decisions the architecture already made for you.
Your documents never leave the device
A lab report is parsed where you opened it — PDF text layer or on-device OCR, then deterministic extraction. Only the values you confirm are sent anywhere. The file itself is never uploaded.
Nothing is auto-saved
OCR misreads digits silently and confidently — we have watched it turn an hs-CRP of 0.8 into 0.6 at full confidence, with no alternative candidates. Every extracted value passes through a confirmation screen. There is deliberately no path around it.
Every number is checkable
Reference ranges, formulas, and citations live in MANIFEST.md, verified against PubMed. The scoring engine is open source: run it on your own data and you get the same answer, or disagree with a threshold and open a pull request.
Ranges that fit the person
VO₂max, grip strength and body fat are scored against age- and sex-stratified reference standards, not one adult average. The page below marks which rows were stratified.
Self-host the whole thing
The clients, the domain core, the schema, and the API are all in one repository. Evum Cloud is one deployment of it, not a privileged one — the portable default is always the one that works without us.
No lock-in by construction
Measurements are normalized into one open event schema with explicit units. A value in a unit we cannot convert is refused, never guessed — so what comes out is what went in.
Where it actually is
Early software, told straight. A project that asks you to verify its health numbers should not overstate its own status.
- Lab report scanning & extractionWorking
- Longevity & domain scoresWorking
- Biological age (PhenoAge)Working
- Manual entry with unit conversionWorking
- iOS appIn progress
- Apple Health & wearable syncPlanned
- AI health chatPlanned