Skip to content
Alpha · We're looking for development partners. Build with us →
Menu

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.

AgeScreening threshold
20 and overHeart rate rise of 30 bpm or more from baseline
13 to 19Heart 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.

ComponentRoleRuns on
POTS Check iOS appTest steps, timing, HealthKit accessiPhone
POTS Check watchOS appLive heart rate on the wristApple Watch
Apple HealthKitHeart rate sourceiPhone
Cascade Swift SDK (early private copy)Records, Turtle, pod storage, AES-256-GCM encryptionInside the app
Local podEncrypted test sessions as Turtle filesApp sandbox
Pod exportEncrypted .pod file for a clinician or backupMade 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 ratecascade:DeviceGenerated. Measured by Apple Watch through HealthKit.
  • Symptomscascade:SelfReported. Entered by the patient while standing, as pots:SymptomEvent.
  • The resultcascade:DeviceGenerated. Computed by the app from the sensor data, and holds the readings it was computed from.
  • Clinician notescascade: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.

LimitsGCM detects a changed file but not a file swapped for an older copy or removed. The app's early SDK copy predates the current pod encryption spec, and the encryption has not been independently audited.

§ 6

What it shows

The protocol works in a shipping app.

6.1

The vocabulary is enough

A whole NASA Lean Test check fits the pots vocabulary: result, heart rate and blood pressure, symptoms, posture, flags.

6.2

Mixed provenance works

Device readings and patient-reported symptoms sit in one session, each labelled.

6.3

Local-first is viable

Encryption, storage and serialization run with no server, offline.

6.4

Exports are readable

Once decrypted, the Turtle opens in any text editor or RDF viewer.

6.5

The pipeline holds

Apple Watch to HealthKit to SDK to encrypted Turtle, end to end in production.

6.6

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.