ECGDex is the suite’s most precise cardiac receptor — it senses one signal, the heart’s electrical activity, and computes everything from raw µV samples. It is authoritative for HRV magnitude: chest ECG owns that signal until its own quality gate trips.
Read the suite as a reflex arc: receptors → relay → integration → insight. ECGDex is an afferent receptor — it does exactly one transduction well and reports inward. It never reaches into another node; cross-signal work happens only through the Ganglior export, consumed by the Integrator.
ECGDex is built from external *.js files referenced by ECGDex.src.html and bundled to a standalone ECGDex.html. Dependencies point downhill only — UI → DSP → Core — and each file owns exactly one job. Edit the .js + .src.html, never the bundle; re-bundle after changes.
buildHash provenance stamp). 100% local.crossNight() stats stay per-node).tMs (local civil time encoded as if UTC) and reads it back with getUTC* — so the recording reads identically in any viewer’s timezone, and two devices recording the same minute land on the same tMs. parseTimestamp is duplicated locally by design.The pipeline is the same shape across the suite: ingest → parse on the canonical clock → compute in DSP → grade & render in UI → emit onto the bus. No number is computed in the render layer; it asks DSP for the value and the registry for how to show it.
Drop the Polar Sensor Logger ECG export (or generate a synthetic night). Samples are parsed off the main thread in a Web Worker so the UI stays live.
A 5–15 Hz band-pass isolates the QRS energy; Pan–Tompkins finds R-peaks, then a parabolic vertex refines each to sub-sample precision.
A per-beat SQI gate (flatline, kurtosis, two-detector agreement, RR plausibility) excludes unreliable beats; correction rate and % analyzable are reported.
Clean RR drives the full HRV suite (time/Poincaré/Lomb–Scargle/DFA/SampEn); morph.js adds QT/QTc, ectopy and the AF screen.
Export autonomic-surge and arrhythmia events with absolute tMs — the corroboration other nodes (OxyDex, CPAPDex) borrow.
Every metric ECGDex surfaces carries an evidence grade — a non-hue badge whose fill is the confidence ladder: solid bullseye for a raw reading, down to a dashed ring for a friendly estimate. A measurement and a projection must never look alike. Grades live in ecgdex-registry.js, the one source of truth.
Honesty is architectural: a guess is never dressed as a measurement, a missing value stays null rather than fabricated, and confidence is kept separate from signal quality. The node-specific caveats:
Morphology (QT, ST, axis) is directional within-subject trend only. A single chest lead cannot replace a diagnostic 12-lead ECG.
The AF screen reads RR irregularity (ΔRR entropy + CV), not P-wave morphology. It is a screen, not an arrhythmia diagnosis.
ECGScope draws a multi-resolution min/max envelope pyramid — plain decimation would alias R-peaks away and corrupt the read.
ECG owns HRV magnitude — but a tripped SQI gate yields to a clean PPG/oximetry backup rather than reporting a confident wrong number.
ECGDex is one self-contained file. Open ECGDex.html in any browser — online, offline, or from file://. Nothing installs, nothing phones home.
Drag a Polar H10 export (polar sensor logger csv/txt) onto the upload zone. It’s read in-browser and turned into metrics on your device alone.
Start in Core for the headline readiness and a plain-language line. Step up to Advanced for full tables and charts, or Research for composites and the full dump. Each metric’s evidence dot tells you how far to trust it.
Export a ganglior.node-export JSON to feed the Integrator, or to upgrade a peer node’s read. Events carry a wall-clock t; consumers reconstruct absolute time from the recording start.
Edit the ecgdex-*.js files or ECGDex.src.html — never the bundled ECGDex.html — then re-bundle. Run Dex-Test-Suite.html until all-green, and verify-provenance.html after re-bundling.