// reference build

Curlew

Healthcare & medtech — remote patient monitoring

Home readings your care team actually sees.

Curlew is the patient side of a clinic-run remote monitoring programme. A patient pairs their home blood pressure cuff, glucometer, scale and pulse oximeter over Bluetooth, takes readings on the schedule their clinic set, logs symptoms and medication, and messages the practice — while the clinic watches the trend and is alerted when a reading falls outside the range set for that person. It is used by people managing hypertension, type 2 diabetes or heart failure between appointments, and by the nurses and care coordinators running the monitoring list. It supports a care plan; it does not diagnose.

A BuildspaceLabs reference build. We designed Curlew in-house to show how we approach native mobile — it is not a client engagement, and every name, record and figure inside these screens is fictional demo data.

  • BLE device pairing
  • HealthKit & Health Connect
  • Time-sensitive prompts
  • Biometric unlock
Curlew shown on three phones — Today, Blood pressure trend, Today, in Material 3 — on a healthcare & medtech brand backdrop
// platforms

Two native designs, one shared core

Curlew is designed twice — once in the iOS idiom and once in Material 3 — on top of a shared domain core, rather than one layout wrapped twice for both stores. The frameworks below are the stack each side is specced against.

iOS

Swift · SwiftUI2 screens in this set

Android

Kotlin · Jetpack Compose · Material 31 screen in this set
// screens

The screens

3 surfaces from the build — 2 in the iOS idiom and 1 redesigned in Material 3 on Android. Everything inside the frames is fictional demo data.

Curlew — the Today screen, running on iOS
01iOS

Today

The daily hub: greeting with check-in progress, the next scheduled prompt with start and snooze actions, live Bluetooth state for four home devices, a 2×2 vitals grid with sparklines, the flagged 148/94 evening reading, today's medications, and the symptom check-in, over a five-tab bar and a persistent monitoring-aid disclaimer.

Curlew — the Blood pressure trend screen, running on iOS
02iOS

Blood pressure trend

Thirty days of systolic and diastolic readings plotted against the clinic-set target band, with out-of-range points ringed, a drag-scrub readout, medication-change and symptom annotations, the out-of-range list, the in/high/low distribution, excluded-reading note, and export actions.

Curlew — the Today, in Material 3 screen, running on Android
03Android

Today, in Material 3

The same day and the same data rebuilt in the Material 3 idiom: top app bar in its collapsed state, filled and elevated cards, wavy progress indicator, assist chips, M3 list items with checkboxes, a connected segmented button group, navigation bar with an active-indicator pill, and a FAB in place of the iOS in-card CTA.

// why native

Why it has to be native

The case for building this twice rather than wrapping a web app. Each one is designed around an operating-system capability a browser either cannot reach or cannot be trusted to hold.

BLE GATT pairing and bonded reconnect

The app talks to the Bluetooth SIG Blood Pressure (0x1810), Glucose (0x1808), Weight Scale (0x181D) and Pulse Oximeter (0x1822) profiles directly, including indication-based stored-record transfer — a cuff that batched three readings while out of range hands them all over on the next connect, with timestamps reconciled against device drift. Web Bluetooth cannot bond, cannot background, and is not available on iOS at all.

Background sync without the app being open

CoreBluetooth state restoration on iOS, plus a foreground service and BLE scan-callback wake on Android, mean a scale stepped on at 6am or a cuff powered on across the room syncs on its own. A web app is dead the moment its tab is.

HealthKit and Health Connect read/write

Blood pressure, blood glucose, body mass and oxygen saturation land in the OS health record the patient and their other clinicians already trust, with per-type permission prompts and revocation handling. Only a native app can hold those entitlements.

Reminders that survive travel, DST and battery managers

Time-zone-aware local notifications using the iOS Time Sensitive interruption level and Android exact alarms with Doze exemptions, so the 7:00 PM reading prompt and 9:00 PM medication prompt actually fire.

Camera capture and tap-to-pair

On-device text recognition (Vision on iOS, ML Kit on Android) reads a value straight off a non-Bluetooth device display, and CoreNFC / Android NFC handles tap-to-pair for clinic-issued kit that ships with a tag on the box.

Offline-first encrypted store

SQLCipher with keys in Keychain and Android Keystore, Face ID / BiometricPrompt unlock, and a conflict-safe outbound queue so readings taken with no signal reach the clinic in order once connectivity returns.

// stack

The stack it is designed for

The target architecture this build is specced against, chosen per constraint rather than per habit — the stack shifts with the problem.

  • Swift 6 + SwiftUI (iOS 17+), Swift Charts for the trend plots, Observation-based state, Swift Concurrency actors around the BLE stack
  • Kotlin 2.x + Jetpack Compose with Material 3 / Material 3 Expressive, dynamic colour, Compose adaptive layouts for tablets and foldables
  • Kotlin Multiplatform shared core (care-plan rules, target-range evaluation, unit conversion, dedup and sync queue) consumed natively by both apps, with SQLDelight models
  • CoreBluetooth on iOS and the Nordic Android BLE library on Android against Bluetooth SIG GATT profiles 0x1810 / 0x1808 / 0x181D / 0x1822, with a device-quirks layer per cuff model
  • HealthKit and Health Connect integration, plus CoreNFC / Android NFC for tap-to-pair and Vision / ML Kit text recognition for camera capture
  • SQLCipher-encrypted local store with keys in Keychain and Android Keystore, Face ID / BiometricPrompt gating, and certificate pinning on all clinic traffic
  • HL7 FHIR R4 backend (Observation, MedicationStatement, CarePlan, Communication) exposed over SMART on FHIR so the clinic side lands in the existing EHR rather than a parallel silo
  • APNs and FCM push with time-sensitive delivery, plus OpenTelemetry tracing and privacy-scrubbed crash reporting that never carries clinical values off-device
// next

Working on something shaped like this?

Curlew is a reference build, so there is nothing to buy on this page. If your team has a problem that needs this kind of depth — offline for a full shift, real sensors, work that has to happen with the screen off — tell us about it and we will tell you honestly whether we are the right people to build it.