Michelle v0.1 · October 2026

Pathogen identification,
from a single spectrum.

Michelle is a passive pathogen detection service built on ARC linear classifiers. Give it a raw Raman or MALDI-TOF spectrum — get a species identification and a score back, with no calibration needed for identification.

87.6%Combined accuracy
61,599Spectra validated
295Built-in classifiers
2Modalities, fused
Overview

A compact, self-contained detection engine

Zero-hyperparameter one-vs-rest models trained on max-normalised 64-bin spectral features. Given a raw spectrum, Michelle returns a species and its ARC linear score. When both channels are supplied, scores are fused by maximum across modalities.

Raman & MALDI-TOF

Two spectroscopy channels in one API. Use either on its own, or both together for fused scoring.

No calibration to identify

ARC saturates on training-positive examples, so argmax is always the decision rule. No thresholds at inference.

Baked into the binary

All 295 classifiers are compiled in. No external model files, no model downloads, no runtime dependencies.

Local & LAN ready

Built-in web UI and REST API on port 8080. Designed for local or LAN deployment behind your own auth proxy.

Technology

ARC — Absolute Regret Compression

Each species has one binary classifier:

scorek(x) = coefk · x + interceptk

The score exceeds 0.5 for every training-positive example by the ARC saturation guarantee. The species with the highest linear score wins.

Built-in library

295 classifiers

30
265
  • 30 Raman classifiers Ho et al. 2019
  • 265 MALDI-TOF classifiers RKI Zenodo 2023
How it works

From raw spectrum to species in four steps

Both modalities are reduced to a 64-dimensional max-normalised vector before classification.

01

Submit

Raw Raman or MALDI-TOF spectrum sent as JSON — or pasted / uploaded as CSV in the web UI.

→
02

Reduce to 64 bins

Spectrum is binned and max-normalised so the brightest peak equals 1.0.

→
03

Score

Every ARC classifier computes a linear score against the 64-element vector.

→
04

Identify

Highest score wins. Species, score and runner-up returned. Two channels? Fused by max.

Raman

Feature extraction

Divide the spectrum into 64 equal-width bins, take the mean intensity per bin, then divide every bin by the bin maximum so the brightest peak = 1.0.

MALDI-TOF

Feature extraction

Place each peak by m/z into one of 64 bins spanning 2,000 – 13,500 Da (winner-take-all per bin), then max-normalise.

Validation results

Independently validated on two public datasets

All classifiers are trained on a disjoint training split. Test spectra are submitted directly to classify_fp without HTTP overhead.

Raman · Ho et al. 2019
88.2%

52,897 / 60,000 spectra
30 species

MALDI-TOF · RKI Zenodo 2023
64.7%

1,035 / 1,599 spectra
265 species

Context on MALDI accuracy. 183 of 265 MALDI species have n ≤ 3 spectra in the dataset. ARC classifiers trained with fewer than ~10 positives are under-constrained, and these species contribute most of the MALDI error mass. Accuracy on species with n ≥ 10 exceeds 83%.

Accuracy by Raman species

All 30 Raman species, 2,000 test spectra each — sorted by accuracy.

SpeciesNCorrectAccuracy
182 species with n < 5 are omitted; most score 0% due to insufficient training data.
SpeciesNCorrectAccuracy
Priority pathogens

Performance on high-consequence species

MALDI-TOF results for Tier 1 and other priority organisms, with the most common confusion for each.

SpeciesModalityNCorrectAccuracyTop confusion
100%Francisella tularensis, P. aeruginosa and E. faecium
≥ 95%B. mallei, V. cholerae and S. aureus
Work in progressB. pseudomallei (20.0%) and B. melitensis (11.1%) — see limitations
REST API

Simple JSON endpoints

All endpoints accept and return application/json. Base URL: http://<host>:8080

POST/api/v1/detectClassify one or two channels
GET/api/v1/pathogensList all registered species
POST/api/v1/calibrateSet BNFS background baseline
POST/api/v1/pathogens/registerAdd a new species at runtime
GET/healthReturns ok when server is running

Request fields — /detect

FieldTypeReq.Description
primary.channelstringyes"raman" or "maldi_tof"
primary.x_axisnumber[]yesWavenumbers cm⁻¹ (Raman) or m/z Da (MALDI). Length equals intensities.
primary.intensitiesnumber[]yesRaw intensity values. Arbitrary scale — max-normalised internally.
secondaryobjectnoSecond channel. Must differ from primary's channel to trigger fusion.
// POST /api/v1/detect
{
  "primary": {
    "channel":     "raman" | "maldi_tof",   // required
    "x_axis":      [...],   // wavenumbers or m/z
    "intensities": [...]    // same length as x_axis
  },
  "secondary": { ... }          // optional — fusion
}
{
  "species":         "Francisella tularensis",
  "confidence":      2.451,   // ARC linear score of winner
  "sigma_species":   0.5,     // D156 angular precision estimate
  "n_bands_hit":     14,      // BNFS spectral band count
  "band_hits":       [true, false, ...],  // 64 booleans
  "runner_up":       "Francisella philomiragia",
  "runner_up_score": 0.182,
  "dual_channel":    null     // set when secondary supplied
}
# Raman
curl -s -X POST http://localhost:8080/api/v1/detect \
  -H 'Content-Type: application/json' \
  -d '{"primary":{"channel":"raman",
       "x_axis":[400,401,...],
       "intensities":[0.1,0.3,...]}}'

# MALDI-TOF (30-peak list)
curl -s -X POST http://localhost:8080/api/v1/detect \
  -H 'Content-Type: application/json' \
  -d '{"primary":{"channel":"maldi_tof",
       "x_axis":[3064.1,4364.2,...],
       "intensities":[...]}}'
# Dual-channel fusion
curl -s -X POST http://localhost:8080/api/v1/detect \
  -H 'Content-Type: application/json' \
  -d '{"primary":  {"channel":"raman",
                    "x_axis":[...],"intensities":[...]},
       "secondary":{"channel":"maldi_tof",
                    "x_axis":[...],"intensities":[...]}}'
Calibrate

Background baseline

Submit a blank or buffer spectrum once at startup to set the BNFS (Background Noise Floor Subtraction) thresholds. Same format as /detect primary input.

Register

Add a reference fingerprint

Register a custom species from a labelled reference spectrum at runtime. For production-quality classifiers, retrain with fitguard classify and recompile.

Web UI

Built-in interface

A single-page UI is served at GET /. Paste or upload a CSV, pick the channel, and see the top-ranked species, its ARC score and the runner-up.

Quick start
# Start the server
./target/release/michelle

# Then open in browser
open http://localhost:8080
No authentication. Michelle is designed for local or LAN deployment. Expose it behind an auth proxy before connecting it to the public internet.
Technical notes

Known limitations, stated openly

Where results are weaker, the cause is understood — closely related organisms and sparse training data.

Brucella species

All Brucella species share nearly identical MALDI-TOF mass fingerprints. Even expert MALDI labs report <50% inter-species accuracy within the genus.

B. anthracis / B. cereus

The two are genomically almost identical; ~20% of B. anthracis spectra score highest for B. cereus. Combined genus-level accuracy is ~98%.

Burkholderia cepacia complex

Multiple BCC species are nearly indistinguishable by MALDI; most resolve correctly to the dominant species B. contaminans.

Singleton species

Species with a single training spectrum have unconstrained ARC coefficients and should not be used for clinical decisions. A minimum of 5 spectra per species is recommended.

Reproduce

Running the accuracy test

# Generate MALDI preprocessed CSV (one-time)
python3 scripts/prepare_maldi_data.py

# In-process benchmark (no HTTP required)
cargo run --release --bin accuracy_test
# Writes accuracy_results.csv (295 rows)
Retraining

Train your own classifiers

ARC classifiers are trained with fitguard classify (FitGuard CLI). The training script is at scripts/train_arc_fingerprints.py. After training, recompile src/sensor/classifier.rs and src/sensor/maldi_library.rs with the updated coefficients.

Build the next generation of pathogen detection with ARC Medical

Michelle v0.1 is live and validated. Talk to us about partnership, pilots and investment.

Visit arc.ceo