Breathing Room
Inspiration
A doctor's appointment lasts fifteen minutes. The three months before it — the wheezing on bad-air days, the nights of broken sleep, the times you reached for a rescue inhaler — get compressed into "I've been having some trouble breathing, I think it's been worse lately?" We built Breathing Room for that gap. The longevity conversation is usually about extending healthspan through better data; the cheapest, most neglected data source is what patients could tell us between visits, if capturing it took ten seconds instead of a habit they'll abandon.
What it does
Breathing Room turns a ten-second voice note into a structured medical record — through a conversation, and not just a form.
You only need to press record. After a patient describes their symptoms in a quick ten second recording, Breathing Room features an LLM-assisted pipeline to extract structured data containing the symptom itself and other necessary information so the doctor can have the best conversation with the patient when the time comes.
The data is in your control. We know that it's important for the user to accurately report their symptoms. Breathing Room makes it easier as the app uses a natural voice, with ElevenLabs, that asks questions in the case that valuable info is missing.
You can understand your symptoms better. Using health data synchronized from Apple Health, any patient can see how their symptoms have changed, along with environmental factors. All of your symptoms are also mapped to a realistic 3D body to better visualize your health.
How we built it
SwiftUI and SwiftData were used for app storage as well as the core logic that extracted the symptom data and generated important notes from it.
The in-app natural conversation runs on Azure OpenAI's gpt-5-mini, which returns strict JSON data and the follow up questions for the missing fields. ElevenLabs does the speaking and the backup transcription.
The 3D body is a free Blender mesh shown in SceneKit, with 31 spots we placed by hand and dots colored by severity. Health data comes straight from HealthKit, which tells us which app each number came from, so we didn't have to connect Fitbit or Strava separately.
Challenges we ran into
- Deciding the model shouldn't guess severity. Our first version inferred 1–10 from language, and it worked — that was the problem. A briefing full of machine-guessed numbers isn't a patient record. Ripping inference out (nullable schema field, spoken follow-up, "unrated" states through every view and statistic) was a philosophy change disguised as a refactor.
- Voice UX is trial by fire. Silence-detection auto-submit felt magical until Apple's recognizer finalized on a thinking pause and "submitted" mid-sentence. We kept the hands-free start and gave the end back to the user.
- Speech in the simulator: SFSpeechRecognizer can't initialize there at all, and its permission prompt can't be pre-granted — so unattended test paths use a scripted transcriber, and the simulator's live path runs on cloud STT.
- Merging two branches that had diverged for a day — one adding the integrations layer, one rewriting the extraction taxonomy — including preserving a seeded persona's exact RNG draw sequence so a teammate's statistically-pinned tests kept passing while the severity model underneath changed completely.
- Fitbit famously never supported Apple Health — until Google Health's v5.05 update added two-way sync. Discovering that mid-design flipped our strategy from "build a Fitbit OAuth client" to "HealthKit is the only hub we need."
Accomplishments that we're proud of
- A voice conversation that's actually load-bearing: the spoken follow-ups fill the exact fields the body map and briefing need, verified live — "my knee aches" → "Is it your left or right knee?" → "the left one" → a dot on the left knee.
- The correlation sentences in the briefing ("4 of 13 episodes followed nights with under 6h sleep") are computed against base rates from real structured data, not hardcoded.
- One HealthKit integration honestly presents as an ecosystem: every source on the Connections screen is backed by real per-sample attribution, and the app never claims a connection it doesn't have.
- The full loop — voice → conversation → structured event → 3D body → background-generated briefing — runs end-to-end under 77 automated tests.
What we learned
Since this was our first time working in iOS development, we learned a lot about how to create our testing environments for our app as well as the general development structures for Swift.
We also learned to better manage our version control, as merging two branches that had been separate proved to be a problem.
What's next for Breathing Room
- MyChart/FHIR clinical records via HealthKit, so labs and med lists join the briefing.
- Oura/Whoop/Dexcom via the same hub; pollen alongside AQI for asthma.
- Longitudinal follow-through: the model noticing "you logged chest pain three times this week" and suggesting the briefing early.
- Clinician-side export formats (PDF, HL7-adjacent) shaped with actual physicians.
Log in or sign up for Devpost to join the conversation.