A computational layer for CPET
Oxynet
Physiological intelligence for exercise testing.
Oxynet extracts physiological structure from cardiopulmonary exercise test signals and returns it as structured measurements: consistent across protocols, populations and devices, and available to people, clinical software and AI agents through the same API.
The Problem & Solution
Standardising CPET Interpretation
Problem
Interpretation variability limits clinical utility
Threshold determination is a visual judgment made against several criteria that do not always agree. Where they disagree, the answer depends on which criterion the reader weighted and how the data were smoothed before plotting, and none of that reaches the report.
Solution
A measurement layer under the interpretation
Oxynet computes the same quantities the same way on every recording, whatever produced it, so the reading a clinician gives is anchored to numbers that do not move between sessions, sites or systems.
From raw CPET signals to structured physiology
Intensity Domains
Drag the slider to see raw CPET measurements become standardised intensity domains: LT and RCP detected automatically, and every breath classified.
Moderate Domain
Below LTVO₂ reaches steady state within minutes. Blood lactate returns to resting levels. Exercise is fully sustainable.
Heavy Domain
LT → RCPA VO₂ slow component emerges. Lactate rises but stabilises above baseline. Prolonged exercise remains possible.
Severe Domain
Above RCPRespiratory compensation is engaged. Lactate and VO₂ rise continuously toward VO₂max. Exercise tolerance is time-limited.
Based on Keir et al., Sports Medicine (2022)
Oxynet is a computational engine, not a replacement for clinical expertise. It measures; the reading stays with the clinician.
Three ways in
One engine, three doors
Start in the browser. Call the API when it should happen automatically. Connect an assistant over MCP when the question arrives in a conversation. The same models answer behind every door, and one key covers the API and MCP.
Your export
23 formats, detected automatically
- Thresholds
- Oscillationbeta
- Substrate
- Signal integrity
Browser · for clinicians and labs
Drop the file in. Read the physiology out.
Reduce variability across clinicians and sessions. The app reads your metabolimeter export as exported and returns the same structured measurements every time, with no change to how you capture data and nothing to install.
Free inferences in the browser. Cortex, COSMED, MetaSoft and more. The uploaded file is parsed and discarded, and the parsed record is deleted after 24 hours.
- 1Upload the file your system already exports, in whatever format it writes.
- 2Oxynet processes the signals and detects ventilatory thresholds automatically.
- 3Receive structured outputs (intensity domains, VT1, VT2) ready for clinical review.
The test happens. The interpretation follows.
The unit of work is not a person uploading a file. A testing service that runs thousands of CPETs a year can have every one of them interpreted as it is recorded: no export, no manual transfer, no decision to make per test. That is the integration Oxynet is built for.
Designed to integrate, not replace
Oxynet runs on top of existing CPET systems. It reads CPET time-series and returns structured outputs over the API or, by arrangement, in a local or embedded deployment, without changes to your data capture hardware, clinical workflow, or reporting interface.
Rather run the open research models on your own machine? The pyoxynet package →
What Oxynet produces
Structured physiological measurements
Every CPET processed by Oxynet returns the same structured set of results, in the same shape, regardless of the device, protocol or population that produced it.
Routine interpretation
Thresholds and intensity domains
- VT1 and VT2, in time, V̇O₂ and V̇CO₂
- Every breath classified moderate · heavy · severe
- Detected consistently across protocols and ergometers
The entry point, and the part with the longest validation record. Same input, same output, which is what makes longitudinal and multi-centre comparison possible.
Quantitative phenotyping
betaVentilatory oscillation analysis
- Each episode: period, amplitude, cycles, location in the test
- Clarity: how far it stands above the recording’s own background
- End-tidal CO₂ corroboration and phase agreement
- Whether the swing damped, held steady or grew
Not a yes/no verdict. The oscillation is measured and located, so a rhythm that fades during exercise is reported as a different finding from one that emerges late.
Metabolism
Substrate use and FATMAX
- Fat and carbohydrate oxidation rates, stage by stage
- FATMAX, against work rate and against %V̇O₂peak
- The crossover where carbohydrate overtakes fat
- Gross efficiency and the oxygen cost of a watt, on a cycle ergometer
Indirect calorimetry from V̇O₂ and V̇CO₂, so it also runs on tests with no ergometer channel, against %V̇O₂peak alone. Above RER 1.0 the fat figure is reported as a bound rather than a rate, because there the exhaled CO₂ is no longer all metabolic.
Derived quantities
Standard CPET measurements
- V̇O₂max, V̇Emax, RERmax, each a 20 s rolling average rather than one breath
- O₂ pulse
- V̇E/V̇CO₂ slope as a profile over the test, with bootstrap intervals
Computed on request against the same recording, so a report and its underlying numbers cannot disagree. The V̇E/V̇CO₂ slope is returned as a profile because a slope that climbs across a test is a different finding from a flat one.
Signal integrity
Whether the numbers can be believed
- Cross-channel gas checks: V̇CO₂ against V̇E, PetCO₂ against PetO₂
- Sampling adequacy: which oscillation periods this file can resolve
- Clock integrity: many carts restart the clock at each phase
These describe the recording, not the patient. A file can fail every check and come from a healthy subject, and where the engine repairs something it says so instead of applying it silently.
No output carries a confidence score. Nothing here is calibrated against clinical outcomes, so a percentage would be a number without a meaning. Where a recording cannot support an analysis, Oxynet says so, and says why.
Scientific validation
Measured against expert interpretation
Threshold detection is evaluated against expert labelling across cohorts that differ in population, protocol, ergometer and metabolimeter, documented across 7 peer-reviewed papers. Agreement with an expert is the floor the engine has to clear.
The promotion gate
No model reaches the registry without clearing all four, on a cohort it never saw, on both the time axis and the oxygen uptake axis.
- V̇O₂ bias
- ≤ 120 mL/min
- V̇O₂ correlation
- ≥ 0.80
- Time bias
- ≤ 60 s
- Time correlation
- ≥ 0.80
Capabilities have different evidence maturity
Answering on the live API, with the evaluation that let each model ship stored beside it. Threshold detection carries the longest record.
Shipped and usable: the API, the MCP endpoint, the schema, the package and the deployment options.
Running, and not yet shown to transport. Oscillation analysis sits here, developed on a single heart-failure cohort.
What Oxynet is not
- Not a medical device. No CE mark, no FDA clearance, and not registered as software as a medical device in any jurisdiction.
- Not a diagnosis. The engine returns physiological measurements; interpreting them for a patient is the clinician’s act.
- Not calibrated against outcomes. No output carries a confidence score, because there is nothing to calibrate one against.
A model for your lab
Trained on your tests.
Read your way.
Every lab has its own protocol, population, metabolimeter and its own way of marking VT1 and VT2. If you have labelled tests, Oxynet fine-tunes its threshold models on them, so the model you call is fitted to the way your experts read a recording.
- 1
Share
Labelled tests, under the data transfer agreement. It names every way the data may be used, and lets you withdraw it from future training.
- 2
Fine-tune
Training starts from the model pretrained on every contributing lab. Its encoder is kept, and the layers that place the thresholds are retrained on your recordings.
- 3
Gate
Evaluated against your experts’ labels on the same four criteria every model clears, bias and correlation on V̇O₂ and on time. It ships only if it passes.
- 4
Serve
A named model, called by name on the API and over MCP, and scoped to your key.
A model fitted to one lab is evidence about that lab. It says nothing yet about how it transports to a second population, and it is reported that way. A model built for you, or a joint development project, is agreed separately from the data agreement, which covers sharing the data.
Open Source
The Pyoxynet Package
The open research side of Oxynet: the models and tools, in a package you can import. Built with Keras and TensorFlow, models available in efficient TFLite format.
Inference Model
Estimates exercise intensity domains from CPET data with high accuracy. Supports VO₂, VCO₂, VE, PetO₂, PetCO₂, VE/VO₂, and VE/VCO₂ inputs.
Generator Model
Creates realistic synthetic CPET data for research and validation using a Conditional GAN (CGAN) architecture.
Requires Python 3.8+. Pyoxynet automatically handles data interpolation and supports second-by-second, breath-by-breath, and averaged CPET data formats.
pip install pyoxynetResearch
Scientific Publications
Peer-reviewed research, reviews, and articles behind the Oxynet project.
Get in Touch
Contact
Say what you need, and it reaches the right person.
Researchers and laboratories
Run a cohort
Bring a set of recordings through the engine and get structured measurements back, consistently across protocols and devices. Or bring labelled tests and have a model fine-tuned on them.
Run a cohortSoftware, devices, developers
Integrate Oxynet
Call the engine from the software you already ship. Your product, your reporting, our physiology.
Integrate OxynetStrategic and commercial
Partner with Oxynet
Build on the computational layer: licensing, deployment options and joint validation work.
Partner with OxynetBugs, feature requests and anything else: oxynetcpetinterpreter@gmail.com