Your health data, encrypted on Walrus—you decide who sees it. Sui + Canton + ENS.
Today, your health data is scattered across Apple Health, hospitals, and insurance companies. You can't truly own it, move it easily, or control who has access. PulseVault changes that by making your phone the place where your health data lives, with you in complete control.
The app is built with React Native and Expo and connects to Apple HealthKit to collect around ten daily health metrics, including steps, resting heart rate, heart rate variability, VO₂ max, blood pressure, sleep, BMI, blood oxygen, and activity. It analyzes the last 30 days of data and creates an easy to understand health risk summary using averages and a transparent risk category such as preferred, standard, or substandard.
Both the raw health data and the summary are encrypted directly on the device before anything leaves the phone. The data uses AES 256 GCM encryption, and the insurer summary is additionally encrypted using the insurer's public key with X25519 and HKDF SHA256. The encrypted file is then uploaded to Walrus decentralized storage. Anyone can access the stored blob, but without the correct key it is just unreadable ciphertext.
Walrus returns both a blob ID and a Sui Blob object that belongs to the user. We then call our Move smart contract, health_anchor::anchor, to create a HealthRecordAnchor owned by the patient. This anchor points to the latest version of the encrypted health record, giving the user an on chain proof of ownership instead of just storing a file identifier.
Privacy and consent are handled through Canton. We use a Daml HealthSummary contract where the patient is the only owner of the record. Doctors or insurance providers are granted access only when the patient chooses. Anyone without permission cannot even see that the record exists. Access can be revoked at any time, giving patients full control over who can view their information. The Walrus blob ID connects the ownership stored on Sui with the consent records managed on Canton.
For identity, we use ENS. Users can have a human readable name such as pulse.eth, which is resolved live on chain using viem to retrieve the wallet address and profile information without relying on hard coded values or wallet specific libraries.
Each technology has a clear role. Walrus securely stores encrypted health data. Sui provides verifiable ownership of the records. Canton manages private consent and access control. ENS provides a simple, human readable identity. Together, they create a health data platform where ownership, privacy, and verification are built into the system instead of depending on centralized providers.
PulseVault brings together four technologies, with the Walrus blob ID connecting them all.
The mobile app is built with React Native and Expo and reads around ten health metrics from Apple HealthKit using @kingstinct/react-native-healthkit, including steps, resting heart rate, HRV, VO₂ max, blood pressure, sleep, BMI, SpO₂, and activity. It summarizes the last 30 days into an insurance focused health report with a transparent Preferred, Standard, or Substandard risk category.
All encryption happens on the device before any data is uploaded. The complete health record is encrypted with AES 256 GCM using @noble/ciphers, while the insurer summary is encrypted with the insurer's public key using X25519, HKDF SHA256, and AES 256 GCM from @noble/curves and @noble/hashes. Private keys never leave the device.
Encrypted data is uploaded to Walrus. The official Walrus SDK depends on WebAssembly, which is not supported by the Hermes engine in React Native, so we uploaded directly through the Walrus HTTP API instead. Using send_object_to ensures the resulting Sui Blob object is owned by the user. The public testnet also lets our web app fetch and decrypt blobs directly in the browser.
On Sui, we published a Move package called health_anchor. The anchor() function creates a patient-owned HealthRecordAnchor that stores the Walrus blob ID, risk band, and version, while update_blob() updates the record as new data is added. The web app interacts with the contract using @mysten/sui, and demo transactions are signed with a faucet funded testnet account.
Consent and access control are handled through Canton using a Daml HealthSummary contract. The patient is the only signatory and decides which doctors or insurers can view the record. Access can be granted or revoked at any time, and anyone without permission cannot even see that the record exists. We deployed the contracts to Canton DevNet through Seaport. One implementation challenge was supporting different Daml versions locally and on DevNet, so we pinned the package ID in the client.
For identity, we resolve pulse.eth live on Sepolia using viem without relying on RainbowKit or hard-coded addresses.
The frontend is built with Vite and React. ENS, Sui, and Walrus work directly from our Vercel deployment, while Canton features run against a local Daml ledger because they require a live ledger. We also included a Daml Script that generates a per party visibility report for anyone who wants to verify the permission model without using the UI.

