Research prototype, not a medical device
OncoSense
A wearable band that shines red and near-infrared light into skin and reads what comes back.
Built in person at MIT Lincoln Laboratory with Eric Niu, and presented to an audience at MIT. A 10-channel spectral sensor reads the returned light; a neural network of about 480 parameters on the band reads skin state; a browser monitor shows it live.
returned to sensor 0.0% · mean depth reached ~0.00 mm
Animated diagram of 850 nm near-infrared light entering skin from the LED, scattering through the stratum corneum, epidermis and dermis, and partly returning into the spectral sensor beside it. Near-infrared reaches deepest; the white LED’s short wavelengths stay shallow.
From graph paper to the arm
The inner face of the band holds two LEDs and a spectral sensor side by side, so light goes in, scatters through the skin and comes back out a few millimetres away. The outer face carries the microcontroller and the battery.



- Light sources
- 850 nm near-infrared LED (EPIGAP OSA, 3D-printed mount), 660 nm red LED, on-board white LED
- Sensor
- Adafruit AS7341, 10 channels: eight bands from 415 to 680 nm, Clear and NIR
- Brain
- Adafruit QT Py SAMD21
- Body
- Neoprene band with hook-and-loop, JST battery
- Geometry
- LED and sensor side by side: diffuse reflectance
Lasers out, LEDs in

hypothesis
The work began in nonlinear optics: second-harmonic generation from collagen, a possible marker for tumours.
review
Dr. Yuzhe Xiao and Jack Hasty of UNT’s Applied Physics Research Group confirmed that second-harmonic generation needs femtosecond lasers, far beyond anything a wearable can carry.
pivot
So the team moved to linear optics that LEDs can drive: diffuse reflectance and photoluminescence, aimed first at skin hydration, where the literature reports r ≈ 0.93 against corneometers. Hydration is the stepping stone back toward screening.
scale
AFFOA advised on turning the band into a textile wearable. The groundwork is an eight-page literature review.
Ten bands back
The AS7341 splits the returned light into eight visible bands from 415 to 680 nm, plus Clear and near-infrared. The band reads it four ways:
- Hydration
- 660 or 850 nm, scored from 0 (dry reference) to 100 (moisturised reference).
- Surface scan
- 850 nm, percent change against a clean-skin baseline: normal, occlusive or reduced return.
- Spectral
- White LED across all ten bands: a reflectance spectrum, melanin index and erythema index.
- AI reading
- All three sources in turn, about 2.5 s, into the on-band network.
| Channel | Reflectance |
|---|---|
| F1, 415 nm | 16% |
| F2, 445 nm | 18% |
| F3, 480 nm | 23% |
| F4, 515 nm | 25% |
| F5, 555 nm | 23% |
| F6, 590 nm | 33% |
| F7, 630 nm | 46% |
| F8, 680 nm | 52% |
| Clear | 32% |
| NIR | 56% |
melanin index 28 · erythema index 36
Drag the sliders to reshape the spectrum. The model here is simplified for this page; the monitor runs a JavaScript port of the project’s physics-informed simulator.
Room light, subtracted
Firmware v2 reads every sample with the LED off, then on, and keeps the difference. Four on/off pairs are averaged with a trimmed mean at 50 ms integration. A lamp flickering overhead moves both readings together, so the difference holds still.
Switch off the differential read to see what the first version saw. Then lift the band, or flood it with light, and watch the flags.
- LED off (room light)
- LED on
- On minus off (what v2 keeps)
Lamp flicker. The difference trace stays level while room light changes. Flags raised: none.
v1 faults, v2 fixes
The summer prototype was comfortable and light-tight, and it detected hydration differences in most trials: about 65% overall success. Calibration drifted between sessions. The causes were traced to ambient light, saturation and fixed thresholds, and the firmware was rebuilt around them.
| v1 fault | v2 fix |
|---|---|
| Room light leaked into every reading. | LED off/on differential read, trimmed mean of four pairs. |
| Bright readings silently clipped at 65,535 counts. | Auto-gain with saturation detection. |
| Fixed thresholds didn't carry from one person or session to the next. | Per-user two-point calibration, direction-agnostic. |
| Nothing warned when the band lost contact or let light in. | Quality flags: NO_CONTACT, AMBIENT_LEAK, SATURATED. |
| Waiting on while(!Serial) froze the band on battery. | Non-blocking boot; streams CSV when a host is there. |
Firmware v2 is modular C++ with a host-tested skin model and a firmware-in-the-loop hardware simulator; CI runs the unit tests, compiles the firmware and does a quick training run.
A network small enough to wear
Firmware v3 scans under all three light sources, turns the result into 12 features and runs a 12→16→12→5 network: about 480 parameters, about 2 KB of flash, hand-written float inference in under a millisecond on the SAMD21.
| very dry | 0% |
|---|---|
| dry | 3% |
| normal | 74% |
| well hydrated | 23% |
| occlusive | 0% |
The 12 input features
Log-change against the wearer’s own baseline for eight visible bands under the white LED (415 nm, 445 nm, 480 nm, 515 nm, 555 nm, 590 nm, 630 nm, 680 nm), 680 nm under the red LED, NIR under the NIR LED, and two shape ratios (red/green, red/blue).
reading
normal
- Confidence74%
- Out of distribution0.3
- Personal noveltyLearning…
Out of distribution is the RMS z-score against the training data; personal novelty is the same against a running model of this wearer. Either above 3 raises a flag instead of a confident answer.
Trained on virtual skin
A pure-numpy trainer learns from a physics-informed skin-optics simulator: melanin, blood, scattering, hydration, occlusive film, illumination, contact and noise, for 400 virtual people in 40 states each.
75.2% on people it never saw
Held out by whole person: 80 unseen virtual people, 3,200 readings. That number measures the simulator, not real skin.
Taught on the band
“Teach the network” takes three scans and re-fits only the output layer by SGD on the device, pulled toward the factory weights. It is saved to flash and survives power-off.
The monitor, in a browser tab
Plain HTML, CSS and JavaScript modules. It talks to a real band over Web Serial in Chrome or Edge, or runs a virtual band with the same protocol, the same simulator and the same network weights. Guided calibration, Teach the network, session recording to CSV or JSON, a device log; installable and offline.



What comes next
Validation against a corneometer, with targets set in advance: coefficient of variation under 5%, Cohen’s d above 2, and correlation above 0.8.
On the roadmap
- UV autofluorescence
- 940 nm water band
- Photodiode-ring detector
- Bluetooth Low Energy
Built with
- Arduino C++ (SAMD21)
- Adafruit_AS7341
- FlashStorage
- Python + numpy
- pytest
- Host-compiled C++ tests
- GitHub Actions
- Vanilla JS + Web Serial
- SVG charts
- Service worker PWA
Try the virtual band
Research prototype, not a medical device
The monitor runs a virtual band in any browser, with no sign-in. Press “Try the virtual band”, capture a baseline, and take an AI reading.