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.
See how it works
From Raw Data to Clinical Insight
Drag the slider to see how raw CPET measurements are transformed into standardised intensity domains, automatically detecting LT and RCP to classify every breath.
Intensity Domains
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)
Ready to run one of your own?
Drop a real CPET file into the app
Free inferences in the browser. Cortex, COSMED, MetaSoft and more, read as exported. Nothing is stored.
Open app.oxynet.net →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.
Oxynet is a computational engine, not a replacement for clinical expertise. It measures; the reading stays with the clinician.
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.
Programmatic access
Built for machines, agents and clinical systems
Oxynet exposes CPET interpretation as structured data, so clinical software, research pipelines and AI assistants can call the physiological models directly, without a person deciding, one test at a time, to use it.
REST
HTTP API
/v1/cpet · /v1/cpet/{id}/analyze
Upload the vendor file exactly as exported and work with the handle you get back. 21 metabolimeter formats are detected automatically, so nothing upstream has to normalise units or columns first.
MCP
Model Context Protocol
/oxynet-mcp
A native connector for Claude, Gemini CLI and any MCP client. An assistant asked to analyse a folder of tests calls the physiological models directly, so the signals never travel through the conversation.
Schema
OpenAPI 3.0
/v1/openapi.json
Importable into a custom GPT action, a client generator, or an integration platform. Every endpoint, parameter and response shape is machine-readable.
Plain text
Agent documentation
/llms.txt · /llms-full.txt
A web page returns an empty shell to anything that fetches it. The integration guide is also served as plain text, so an agent can read it in one request.
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.
# any MCP client, one line
claude mcp add --transport http oxynet \
https://app.oxynet.net/oxynet-mcp --header "X-API-Key: ..."
# then, in the conversation
"analyse every CPET in this folder and tell me which
ones show oscillatory ventilation"
No result carries a confidence score, and an assistant should not invent one. Nothing here is calibrated against clinical outcomes. Where a recording cannot support an analysis, the API says so and says why. That refusal is the correct thing to report, not an obstacle to work around.
Who it's for
Built for Your Context
The same engine, reached the way that fits your context: a browser, an API call, an assistant, or a Python import.
For clinics & hospitals
Consistent interpretation at scale
Reduce variability across clinicians and sessions. Oxynet reads your metabolimeter export as exported and returns the same structured measurements every time, with no change to how you capture data.
Open the app →For manufacturers & software partners
A physiology engine behind your system
Call Oxynet from the software you already ship. Send the recording, receive structured measurements, display them in your own interface. Your product, your reporting, our physiology.
See the integration →For researchers
A cohort, analysed in one pass
Point an API client, or an AI assistant over MCP, at a directory of tests and get structured results back per recording. The open-source Python package covers local inference and synthetic data generation.
Analyse a cohort →How it works
Simple to Use, Simple to Integrate
For clinics & hospitals
Direct use
- 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.
For manufacturers & software partners
API integration
- 1Integrate the Oxynet API into your existing CPET software or device platform.
- 2Send CPET data via standard API calls, with no change to your data capture pipeline.
- 3Receive standardised interpretation outputs and display them within your software.
Deployment
Available in Three Formats
One engine, three doors. Start in the browser, move to the API when it should happen automatically, and use the open-source package when the work belongs in a script.
API & MCP
REST for clinical software, MCP for AI assistants, one key for both. 21 vendor formats are detected automatically, so nothing upstream needs converting.
Read the docs →Web app
Drop a raw metabolimeter file into the browser at app.oxynet.net and read the result. No installation, and the uploaded file is parsed and discarded: the parsed record is deleted after 24 hours.
Open app.oxynet.net →Python package
The pyoxynet research package: run inference locally, generate synthetic CPET data, and build custom pipelines.
Install from PyPI →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 in an embedded deployment, without changes to your data capture hardware, clinical workflow, or reporting interface.
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.
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.
Quick Start
Code Examples
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
Interested in collaboration or have questions about the project?
Feedback & Issues
Oxynet Team
Bug reports, feature requests, and general inquiries about the Oxynet project.
oxynetcpetinterpreter@gmail.comPrincipal Investigator
Andrea Zignoli
Research collaborations, academic partnerships, and scientific enquiries.
andrea.zignoli@unitn.it