
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
CPET interpretation is variable and often requires manual adjustment. Different software tools can produce inconsistent results, increasing clinician workload and introducing uncertainty into clinical decision-making.
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 changed
From classification to measurement
Asking a CPET where VT1 and VT2 sit is one question. Asking what physiological structure the signals contain is a larger one, and it is the question the engine is now built to answer.
Classification
A verdict. Two patients either side of the same cut-off are reported as different. Two patients at opposite ends of one category are reported as the same.
Measurement
Numbers with units. Each one carries where it sits in the test, how far it stands above that recording's own background, and whether the channel it came from can be believed.
A worked example: oscillatory ventilation
Exercise oscillatory ventilation is usually reported as present or absent. Oxynet returns the oscillation itself: each episode with its period, its amplitude as a share of ventilation, how many times it exceeds the background variation of that recording, whether end-tidal COβ moves in antiphase to corroborate it, whether the swing grew or faded across the test, and where the burden peaked.
Located
An oscillation that fades during exercise is a different finding from one that emerges late.
Corroborated
A ventilatory swing that end-tidal COβ does not follow is reported as exactly that.
Bounded
Where a channel is clipping, the numbers it feeds are returned as bounds, not measurements.
Oscillation analysis is in beta and has been developed on a single heart-failure cohort. It has not yet been tested for transportability to a second population, and is offered for research use on that basis.
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.
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
The measurement nobody asks for and everybody needs. These describe the recording, not the patient, and a repair is always reported rather than silently applied.
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. Twenty 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 or stream CPET time-series data from your existing system.
- 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. Twenty 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. Free inferences, nothing stored, no installation.
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 and shows strong agreement, documented across peer-reviewed publications. Agreement with an expert is the floor the engine has to clear. The measurements it makes beyond that are the reason to build on it.
Threshold detection carries the longest evidence record here. Oscillation analysis is beta, developed on a single heart-failure cohort and not yet tested for transportability to a second population. Both are research software, and neither is a medical device.
View publications β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