You instrument everything except the room you decide in.
Every service you run has an SLO, an error budget and a dashboard. The operator has no baseline, no history and no alert — and the published research says the operator is the component that degrades first. OptiBreath is an air quality instrument with a /metrics endpoint.
The gap
One dependency in your critical path has no telemetry.
You would not run a service this way. You would not accept a dependency with no health check, no baseline and no history — and then trust its output at three in the morning.
- Your servicesSLOs, error budgets, burn-rate alerts, a dashboard per tier
- Your infrastructureNode exporter on every host, 15-second scrape, a year of retention
- Your dependenciesSynthetic probes, third-party status pages piped into the same board
- Your CIBuild duration, flake rate, queue depth — all trended
- The operatorNothing. No signal, no baseline, no alert, no history.
The 03:00 problem
Your worst air arrives at the hour of your worst decisions.
A closed bedroom is the least ventilated room a knowledge worker occupies, and it is at its worst in the small hours. That is also when the pager goes off, when you are least rested, and when the blast radius of a wrong call is largest.
Carbon dioxide, 22:00 to 08:00
Sealed bedroom, one occupant. Hover for any point.
View as a table
| Time | CO₂ (ppm) | Band |
|---|---|---|
| 22:00 | 620 | Optimal |
| 22:10 | 682 | Optimal |
| 22:20 | 742 | Optimal |
| 22:30 | 800 | Elevated |
| 22:40 | 856 | Elevated |
| 22:50 | 910 | Elevated |
| 23:00 | 962 | Elevated |
| 23:10 | 1,013 | Degraded |
| 23:20 | 1,062 | Degraded |
| 23:30 | 1,109 | Degraded |
| 23:40 | 1,155 | Degraded |
| 23:50 | 1,200 | Degraded |
| 00:00 | 1,243 | Degraded |
| 00:10 | 1,284 | Degraded |
| 00:20 | 1,324 | Degraded |
| 00:30 | 1,363 | Degraded |
| 00:40 | 1,401 | Impaired |
| 00:50 | 1,437 | Impaired |
| 01:00 | 1,472 | Impaired |
| 01:10 | 1,506 | Impaired |
| 01:20 | 1,539 | Impaired |
| 01:30 | 1,571 | Impaired |
| 01:40 | 1,601 | Impaired |
| 01:50 | 1,631 | Impaired |
| 02:00 | 1,660 | Impaired |
| 02:10 | 1,688 | Impaired |
| 02:20 | 1,715 | Impaired |
| 02:30 | 1,741 | Impaired |
| 02:40 | 1,766 | Impaired |
| 02:50 | 1,790 | Impaired |
| 03:00 | 1,814 | Impaired |
| 03:10 | 1,836 | Impaired |
| 03:20 | 1,858 | Impaired |
| 03:30 | 1,880 | Impaired |
| 03:40 | 1,900 | Impaired |
| 03:50 | 1,920 | Impaired |
| 04:00 | 1,940 | Impaired |
| 04:10 | 1,958 | Impaired |
| 04:20 | 1,976 | Impaired |
| 04:30 | 1,994 | Impaired |
| 04:40 | 2,011 | Impaired |
| 04:50 | 2,027 | Impaired |
| 05:00 | 2,043 | Impaired |
| 05:10 | 2,058 | Impaired |
| 05:20 | 2,073 | Impaired |
| 05:30 | 2,087 | Impaired |
| 05:40 | 2,101 | Impaired |
| 05:50 | 2,114 | Impaired |
| 06:00 | 2,127 | Impaired |
| 06:10 | 2,140 | Impaired |
| 06:20 | 2,152 | Impaired |
| 06:30 | 2,163 | Impaired |
| 06:40 | 2,175 | Impaired |
| 06:50 | 2,186 | Impaired |
| 07:00 | 2,196 | Impaired |
| 07:10 | 1,385 | Degraded |
| 07:20 | 969 | Elevated |
| 07:30 | 755 | Optimal |
| 07:40 | 645 | Optimal |
| 07:50 | 589 | Baseline |
| 08:00 | 560 | Baseline |
At 1,845 ppm you are in the band where Satish et al. measured decrements across most of their decision-making measures — with initiative and basic strategy hit hardest. Those are not abstract categories. They are the two things incident command is made of.
Every postmortem you have ever written asks about the state of the system. None of them ask about the state of the operator, because nobody has the data. This is the instrument that would have had it.
Integration
It speaks the protocol you already run.
No app-only walled garden, no polling a vendor cloud to read a sensor sitting two metres away. The device exposes its own endpoint on your LAN, and it is the same shape as everything else in your scrape config.
$ curl -s http://optibreath.local/metrics | grep -v '^#' optibreath_co2_ppm{room="home-office",unit="ob-0142"} 1847optibreath_pm25_ugm3{room="home-office",unit="ob-0142"} 6.4optibreath_voc_index{room="home-office",unit="ob-0142"} 154optibreath_temperature_celsius{room="home-office",unit="ob-0142"} 23.2optibreath_humidity_ratio{room="home-office",unit="ob-0142"} 0.48optibreath_pressure_hpa{room="home-office",unit="ob-0142"} 1013.4 # Cumulative time in each band. Trend it, and you have a# ventilation SLO for the room you work in.optibreath_band_seconds_total{room="home-office",band="optimal"} 18420optibreath_band_seconds_total{room="home-office",band="degraded"} 7260optibreath_band_seconds_total{room="home-office",band="impaired"} 1980 optibreath_calibration_age_seconds{sensor="co2"} 5443200optibreath_build_info{version="1.4.2",hw="core"} 1optibreath_up 1# On the device's own LAN address. No cloud round trip,# no account, no vendor between you and your data.groups: - name: cognitive-environment rules: - alert: VentilationDegraded expr: optibreath_co2_ppm > 1000 for: 15m annotations: summary: "{{ $labels.room }} above 1,000 ppm for 15m" runbook_url: "https://optibreath.space/science#bands" # The one that matters at 03:00. - alert: OnCallRoomImpaired expr: optibreath_co2_ppm{room="bedroom"} > 1400 for: 5m labels: severity: criticalPrometheus
A /metrics endpoint on the device's LAN address, mDNS-discoverable, base units, sane label cardinality. Scrape it with the same job config as anything else you run.
MQTT
Every reading published to a topic per channel, so it drops into an existing broker or Home Assistant without a bridge.
Webhooks
Band transitions POST outbound. Wire them to Alertmanager, a Slack channel, or whatever already wakes you up.
Raw export
Two years of one-minute samples as CSV or Parquet, straight off the device. Your data, in a format whatever you already use will open. Not an export button that emails you a link in an hour.
Local API, MQTT and the Prometheus exporter are on every tier, Core included. Core measures and displays everything; Pro is the one you can scrape.
Hong Kong
Few places make this argument better.
Dense curtain-wall towers, centralised air handling nobody on the floor controls, small flats, and a climate that punishes you for opening a window. If you work here, the gap between the air you assume you have and the air you actually have is unusually wide.
The buildings are sealed by design
Curtain-wall towers with centralised air handling get optimised for thermal load in a subtropical climate rather than for outdoor air per occupant. The supply rate to your particular floor is a number you have almost certainly never seen, and could not change if you had.
The flats are small and the doors stay shut
A home office that doubles as a bedroom, somewhere between 20 and 40 square metres, aircon on and windows shut against the humidity, is about the fastest-accumulating room in this whole argument. Small volume, one occupant producing all of it, and no route out.
Opening a window is not a free action
For a good part of the year, outdoor air arrives with humidity and regional particulate attached. Which is the argument for reading CO₂ and PM2.5 side by side rather than either alone, before deciding whether opening the window helps or makes things worse.
The objections
Answered in the order you will raise them.
“This is a contested literature and I will check.”
Please do. The papers that failed to replicate the effect are on our own science page, including a 2019 review co-authored by the lead author of the study we lean on, which is openly sceptical below about 5,000 ppm. The uncontested part is narrower: CO₂ tracks ventilation rate per occupant, poor ventilation independently correlates with worse symptoms and performance, and none of it is perceptible unaided.
“I am not buying hardware that bricks when the vendor dies.”
It never depended on us. Every sensor, the display, local history, alerting and the local API work with the radio off and no account. If we wind down we have committed to publishing the API specification, the service manual and the firmware signing tooling.
“I do not want another SaaS subscription.”
The instrument is complete without one. The optional analytics layer is included for the first year and removing it takes away analysis features and nothing else. No sensor is disabled in firmware waiting for an upgrade fee.
“Cheap CO₂ monitors exist.”
They do, and most use a single-channel NDIR cell that drifts and leans on auto-baselining to hide it. If you are going to alert on a number, you need to trust it at the threshold — which means a dual-channel cell with a sealed reference, pressure compensation, and on Pro a traceable calibration certificate you can point at.
Add the missing exporter.
The first 500 units carry an engraved serial, their own calibration record and the analytics layer for life. Founding units ship Q1 2027.
Or start with the evidence, which is where we would start.