Inspiration

Every time I walked into a new clinic, someone asked me for my history. And I could never answer. Which clinic was that? What year? What did they put me on?

I used to think that was a memory problem. It isn't. Nobody can remember that. The record of my own body was never mine it stayed in whichever clinic created it.

Then I noticed the other side of it. Friends of mine went into medicine, and none of them want to work in the public system here. It isn't only the pay, the research on why doctors leave points straight at paperwork.

What it does

Asclepius listens to a consultation and does two things with it.

For the doctor, it drafts the work, a structured clinical summary and action cards for what was actually decided: prescriptions, lab orders, referrals, follow-ups, care-record notes. The doctor reviews, edits, approves. Nothing dispatches until they click.

For the patient, it produces a record they own. At approval the whole thing is encrypted in the browser. One key is generated per consultation, then locked twice over , once to the doctor's wallet, once to the patient's.

What goes on chain is the storage address, two content hashes, and those two locked copies of the key. The operator has neither wallet, so there is no version of the key we can open. Getting into a record without one of those two wallets means breaking the encryption itself.

Which means the interesting property isn't that we promise not to read your records. It's that we can't. A breach, a rogue employee and a court order all return the same thing: ciphertext. The database holds status, timestamps and addresses ,no clinical text at all, by schema rather than by policy.

And because the patient holds a copy rather than a login to our portal, one longitudinal record accumulates across clinics, systems and borders by construction. No integration required. Nobody has to carry a folder of printouts to their next appointment.

Two things are deliberately not automatic:

  • Every action card must quote the doctor's own words as evidence, so fabricating a prescription also means fabricating the doctor saying it.
  • The model's tool calls are read off the response and never executed. It fills in a form; it doesn't press a button.

How we built it

Fourteen Maven modules on Java 21 and Spring Boot 3.5.6, with Spring AI 1.0.3 as the transport for both AI hops.

Challenges we ran into

The model that handles multi-language conversation hands back one undifferentiated string , no speakers, no timestamps. But every action card has to quote the doctor, not the patient.

No speaker means no evidence. No evidence means no card. The whole thing falls over.

And it cannot be recovered afterwards: mapping words back onto time needs a forced aligner, and an aligner committed to one language is precisely the wrong instrument for speech that switches mid-sentence.

So the pipeline inverted. Split by speaker first, cut, then transcribe each turn alone.

Accomplishments that we're proud of

Diarization runs on a clinic laptop

Per-turn transcription didn't cost what I expected. I predicted accuracy would degrade materially with less surrounding context. Measured against whole-recording transcription of the same file, it doesn't degrade so much as shift different words wrong, not more.

The evidence requirement works as a safety property, not a feature. Every card carries the doctor's words in the language spoken.

The non-custodial claim is structural. I can demo it by opening my own database in front of you and showing ciphertext.

What we learned

Constraints beat prompts. The reliable safety properties came from typed schemas and required arguments, not from asking the model nicely. A schema that cannot express a fabricated field is worth more than an instruction not to fabricate.

What's next for Asclepius

Key recovery. Today, losing your wallet loses your records. Acceptable for a prototype, unacceptable for a patient. The answer is probably to split the key into several shares held by people or devices the patient trusts, so any few of them together can restore it without ever reassembling a copy on our side, which is the hard part.

Built With

Share this project:

Updates

Submission history