Cascade in use
Case study
Published Feb 2026
POTS Check
One app, one condition, end to end: how a shipping iPhone and Apple Watch app keeps its results as Cascade records, and what that does and doesn't prove.
- Status
- On the App Store since December 2025 (v1.3a)
- Platform
- iOS 18+ and watchOS 11+
- Uses
- The pots vocabulary (now v1.4), through an early private copy of the Cascade Swift SDK
- Stores
- An encrypted local pod on the phone
- Sends
- No health data; optional anonymous usage analytics (privacy policy)
§ 1
The clinical problem
The key sign of POTS is rarely measured.
Postural Orthostatic Tachycardia Syndrome is a disorder of the autonomic nervous system: heart rate rises abnormally on standing. It affects an estimated 1 to 3 million Americans, is often linked to long COVID, and can go unrecognised for years, because a routine orthostatic check measures blood pressure, not heart rate.
The NASA Lean Test is a simple version of a tilt-table test. POTS Check runs it at home: a 5-minute lying baseline, then 10 minutes standing, with Apple Watch heart rate and the patient's symptoms recorded throughout.
| Age | Screening threshold |
|---|---|
| 20 and over | Heart rate rise of 30 bpm or more from baseline |
| 13 to 19 | Heart rate rise of 40 bpm or more |
Reaching the threshold is not a diagnosis. Diagnosis also needs the absence of orthostatic hypotension and chronic symptoms, and only a clinician can make it.
§ 2
How it's built
Watch to encrypted file, all on the phone.
| Component | Role | Runs on |
|---|---|---|
| POTS Check iOS app | Test steps, timing, HealthKit access | iPhone |
| POTS Check watchOS app | Live heart rate on the wrist | Apple Watch |
| Apple HealthKit | Heart rate source | iPhone |
| Cascade Swift SDK (early private copy) | Records, Turtle, pod storage, AES-256-GCM encryption | Inside the app |
| Local pod | Encrypted test sessions as Turtle files | App sandbox |
| Pod export | Encrypted .pod file for a clinician or backup | Made on request |
Data flow
Apple Watch heart rate samples DeviceGenerated ↓ HealthKit read per session, heart rate only ↓ POTS Check app + symptoms entered by patient SelfReported ↓ Cascade Swift SDK pots: records in Turtle ↓ AES-256-GCM key in the iOS Keychain ↓ Local pod wellness/pots-sessions/*.ttl ↓ (only if the user exports) .pod file shared by Files, AirDrop or email
Nothing leaves the phone until the user exports. No health data is sent to a server.
§ 3
The protocol in practice
A check result, in Cascade.
An illustrative result, written for this page with terms from pots.ttl v1.4. It is not an export from the app, and the values are made up.
<urn:uuid:e4f5a6b7-c8d9-0123-efab-234567890123>
a pots:POTSCheckResult ;
pots:date "2026-01-20T14:00:00Z"^^xsd:dateTime ;
pots:protocol "nasaLean" ;
pots:baselineDurationSeconds 300 ;
pots:uprightDurationSeconds 600 ;
pots:supineHeartRate [ a pots:HeartRateMeasurement ;
fhir:valueQuantity [ fhir:value "58.0"^^xsd:double ] ] ;
pots:standingHeartRates ( [ a pots:HeartRateMeasurement ;
fhir:valueQuantity [ fhir:value "97.0"^^xsd:double ] ;
pots:secondsSinceStand "180.0"^^xsd:double ] ) ;
pots:symptomEvents ( [ a pots:SymptomEvent ;
pots:symptom "Dizziness" ;
pots:timestampSeconds "180.0"^^xsd:double ] ) ;
pots:maxHeartRateDelta "39.0"^^xsd:double ;
pots:potsThresholdMet true ;
cascade:dataProvenance cascade:DeviceGenerated ;
cascade:schemaVersion "1.4" .
Show the vocabulary excerpt from pots.ttl v1.4
pots:POTSCheckResult a owl:Class ; rdfs:label "POTS Check Result"@en ; rdfs:subClassOf prov:Entity . # exactly one pots:date, pots:protocol pots:HeartRateMeasurement a owl:Class ; rdfs:subClassOf fhir:Observation . pots:SymptomEvent a owl:Class ; rdfs:comment "User-reported symptom captured during the standing phase"@en . pots:supineHeartRate a owl:ObjectProperty ; rdfs:range pots:HeartRateMeasurement ; owl:equivalentProperty sct:78564009 . # Heart rate at rest pots:maxHeartRateDelta a owl:DatatypeProperty ; rdfs:range xsd:double . # 30-second rolling average pots:potsThresholdMet a owl:DatatypeProperty ; rdfs:range xsd:boolean . # >=30 bpm adults, >=40 bpm ages 13-19
Full definitions: the pots vocabulary.
§ 4
Provenance
Each record says where it came from.
One test session holds records from different sources, and each carries its own provenance, so a clinician reading the export can tell a sensor reading from a reported symptom.
- Heart rate
cascade:DeviceGenerated. Measured by Apple Watch through HealthKit. - Symptoms
cascade:SelfReported. Entered by the patient while standing, aspots:SymptomEvent. - The result
cascade:DeviceGenerated. Computed by the app from the sensor data, and holds the readings it was computed from. - Clinician notes
cascade:ClinicalGenerated, if a clinician adds notes to the pod later.
§ 5
Encryption
Encrypted before it touches the disk.
With an account, every Turtle file is encrypted with AES-256-GCM before it is written. Guest mode keeps data in memory only and writes no files. The key is created on first launch and kept in the iOS Keychain. Exports stay encrypted; the user shares the key separately.
§ 6
What it shows
The protocol works in a shipping app.
The vocabulary is enough
A whole NASA Lean Test check fits the pots vocabulary: result, heart rate and blood pressure, symptoms, posture, flags.
Mixed provenance works
Device readings and patient-reported symptoms sit in one session, each labelled.
Local-first is viable
Encryption, storage and serialization run with no server, offline.
Exports are readable
Once decrypted, the Turtle opens in any text editor or RDF viewer.
The pipeline holds
Apple Watch to HealthKit to SDK to encrypted Turtle, end to end in production.
The layers coexist
FHIR and SNOMED mappings, the pots vocabulary and the app's summary, with no change to core.
§ 7
Scope and limits
A first deployment, not a mature ecosystem.
- One team, one app. Built by the people who designed the protocol; no third-party implementation yet.
- One condition. Says nothing about how well the vocabularies fit oncology, cardiology or genomics.
- No EHR integration. The export is for individuals to share, not institutional exchange.
- An early SDK copy. Its encryption predates the current spec.
- Solid layout only. No sync with a Solid server has been built or tested.