Reference

Glossary & FAQ

The suite's vocabulary, decoded — and the questions everyone asks first. Jump to the FAQ.

Glossary

terms mirror the naming system & the Clock Contract — nothing here invents a definition the code does not carry

-Dex nodereceptor
A single-signal analyzer — OxyDex senses oxygen, ECGDex cardiac electrical activity, PulseDex raw beat-to-beat timing, GlucoDex glucose, PpgDex optical pulse, CPAPDex therapy-device data, HRVDex the variability ledger, MotionDex inertial motion. A node senses one signal and emits events; it never fuses. The suite reads as a reflex arc: receptor → relay → integration → read-out.
Gangliorthe relay bus
The shared event bus where node exports converge. Named for ganglia, the nerve junctions where signals are relayed. Every node writes the same envelope (ganglior.node-export) so any consumer can read any node without a per-node parser.
Integratorintegration centre
The fusion layer. It ingests every node's export for a night, aligns them on one timebase, cross-checks their clocks, and produces the cross-signal picture no single receptor can — confirmed apnea, corroborated findings, clock-skew verdicts.
Tepnathe read-out
The name of the whole system and of what it produces — an autonomic read-out. Not a ninth node; the tagline over the arc.
tMsfloating wall-clock ms
The suite's canonical time unit: the recording's local civil time encoded as if it were UTC. Two devices recording the same wall-clock minute produce the same tMs regardless of anyone's timezone, so cross-device alignment holds by construction — and a night renders identically on any viewer's machine. A missing stamp is null, never fabricated.
Clock Contractthe time rules
The non-negotiable time model every node obeys: one shared parser, explicit vendor-format regexes (never a locale guess), per-recording anchors, UTC-family display, and honest refusals — out-of-range components return null instead of silently rolling onto a plausible wrong date.
hostAxisrate reconciliation
How a device's free-running crystal is placed on the capture host's clock. Anchors are (device ms, host ms) pairs read off the same rows; a running median interpolates the measured divergence between them. It refuses below 3 anchors and beyond ±5% apparent rate — beyond that the two columns aren't the two clocks you think they are.
evidence badge5-tier ladder
Every surfaced number carries one: measured · validated · emerging · experimental · heuristic. Disc shape encodes trust, never hue. A paper-sourced value reaches "validated" only with a real, checkable citation — never on "the literature says". An unbadged number is treated as a bug, same severity as a wrong unit.
manifestHashcode identity
The sole executed-code identity of a bundle: a deterministic hash over its inlined source assets. It moves only on a real code change, so "which code produced this export" is a checkable fact rather than a claim.
fixtureknown answer
A committed input + the export the code produced from it, pinned by content hashes plus the producing code's manifestHash. The provenance gate reds the moment the code, the input, or the output changes — so "the analysis is reproducible" is verified on every change, not asserted once.
node-exportthe currency
The JSON envelope every node emits: schema.name: "ganglior.node-export", a recording block (start, duration, coverage, timing provenance), ganglior_events[], and per-night summaries. It is what the Integrator ingests and what you can re-load into the node that wrote it.
coveragerecorded vs spanned
A night's envelope duration counts time the sensor may not have been recording. Coverage declares the recorded segments so a rate (events per hour) divides by hours actually observed — an honest denominator instead of a flattering one.
ODIdesaturation index
Oxygen Desaturation Index — desaturation events per hour of recording, at a stated depth (ODI-4: drops ≥4%; ODI-3: ≥3%). The suite grades ODI-4 against published AASM bands and deliberately leaves ODI-3 ungraded, because no published severity ladder exists for it.
rMSSDHRV metric
Root mean square of successive RR-interval differences — the workhorse parasympathetic HRV statistic. Extremely sensitive to missed beats (one missed beat per thousand inflates it ~20%), which is why the suite instruments detector miss-rate instead of assuming it away.
local-firstthe privacy stance
Every analyzer is a single HTML file running entirely in your browser: no network, no CDN, no account, no upload. The page works from a file:// URL on an air-gapped machine. Verified by an automated no-network gate, not by promise.

FAQ

the questions every new visitor asks, answered plainly

Does my health data leave my device?
No. Each analyzer is one self-contained HTML file that runs in your browser with no network access — no upload, no account, no analytics, no CDN fonts. You can run it offline from a downloaded file. This is enforced by an automated gate that fails the build if any bundle tries to fetch anything.
Is this a medical device? Can it diagnose sleep apnea?
No. Tepna is not a medical device and does not diagnose, treat, screen for, or prevent anything. It computes research-grade patterns from consumer wearables for personal self-quantification. If a night's numbers worry you, that is a conversation for a clinician with clinical instruments — a home wrist oximeter is not a polysomnograph.
What devices work with it?
Consumer wearables with exportable data: the Wellue O2Ring / O2Ring S (SpO₂, pulse), Polar H10 chest strap (raw ECG, RR), Polar Verity Sense (optical PPG), ResMed CPAP machines (SD-card EDF), CGM sensors via their CSV exports, and Polar Sensor Logger captures. See How to Collect Data for the per-device walk-through.
Why one app per signal instead of one big app?
Because a receptor that does one transduction well is checkable. Each node has its own gates, fixtures, and validation surface; the cross-signal picture is the Integrator's job, fed by every node's export. Splitting sensing from fusing is what lets a single node be verified end-to-end.
How do I know the numbers are right?
Three mechanisms, all automated: evidence badges on every surfaced number state how validated the metric is; content-addressed fixtures pin committed inputs to their exports under the exact code that produced them, and turn red the moment any of the three moves; and a mutation-testing program checks that the test suite actually notices when the arithmetic is deliberately broken. Where the suite cannot validate something, the badge says so rather than borrowing confidence.
Two of my devices disagree about the time. Which one is right?
Probably neither — consumer wearables drift by parts-per-million and jump on battery events. The suite's answer is to put every device on one timebase (the capture host's, when one exists), declare measured offsets instead of silently shifting data, and veto a recording whose clock demonstrably reset mid-night. "Declared, never silently corrected" is a house rule.
Can I export my results? Re-load them later?
Yes. Every node exports a JSON envelope (ganglior.node-export) that the same node re-loads losslessly, and the Integrator consumes for fusion. Exports can be scrubbed of device identifiers for sharing. The export is the suite's currency — nothing is locked in.
Units — metric or imperial?
Metric is canonical, always: kg, cm, °C, mmol/L, mmHg where clinically conventional. Storage and math are metric; imperial exists only as an optional display conversion at the screen boundary.
How do I cite Tepna?
Cite the concept DOI 10.5281/zenodo.22068939 (resolves to the latest archived version), or a specific version's own DOI from its Zenodo record. The repo's CITATION.cff carries the full citation metadata — GitHub renders a "Cite this repository" button from it.
Is it open source? Can I build on it?
Yes — Apache-2.0, one licence for the whole suite. Source is on GitHub; every bundle is built deterministically from it, and the build, tests, and provenance gates run in public CI.

◈ end

Intended use & safety

Tepna computes biometric patterns from your wearable and sensor data to support personal self-quantification. It is not a medical device, does not diagnose, treat, cure, screen for, or prevent any disease or condition, and is not a substitute for professional clinical evaluation. Always consult a qualified healthcare provider about your health. For research and personal use only. 100% local — no data leaves your device.

T Tepna physiological-signal suite
© 2026 Michal Planicka — Concept · Architecture · Algorithms Not a medical device · does not diagnose or treat · research & personal use only · ◈ Made in Asheville, NC
licenceApache-2.0
v2.8.0