Case 01 · Healthcare & Medical Software

Medplum Self-Hosted FHIR Platform & Patient Portal

Health-Tech Platform & FHIR Integration Engineersmedplum.comProduct EngineeringCloud & DevOpsData & Integration
← All case studies

Medplum is an open-source, API-first, headless EHR built around HL7 FHIR R4 (Apache 2.0). We self-hosted it on the client's own AWS account and built a custom React patient portal and clinician workflows on top of its FHIR REST and GraphQL surface.

The challenge

A telehealth startup needed a HIPAA/SOC 2-ready patient portal — charts, scheduling, and lab results — in eight weeks, and refused to keep paying a legacy EHR's per-provider fees. Their incumbent system was a closed database with no safe way to attach custom intake forms or ingest outside lab feeds.

  • Self-hosting a full FHIR stack inside the client's own AWS account so no PHI ever left their boundary, while staying HIPAA/SOC 2 defensible.
  • Ingesting HL7v2 ADT and lab messages from a reference lab and mapping them cleanly onto FHIR Patient, Encounter, and Observation resources.
  • Enforcing SMART-on-FHIR OAuth 2.0 PKCE consent so patients and guardians only ever saw records they were authorized to see.
Our solution

We deployed Medplum via its official AWS CDK construct (ECS Fargate, RDS Aurora Postgres, ElastiCache Redis, CloudFront), then built a custom patient portal with the @medplum/react component library and wrote Medplum Bots to ingest lab data and summarize visit notes back into FHIR.

  • One-command deploy on the client's AWS via `npx medplum aws init` then `cdk deploy`, fronted by CloudFront with Secrets Manager-held OAuth credentials.
  • An HL7v2 → FHIR translator built on the @medplum/hl7 package, mapping ADT^A01 messages to FHIR Patient/Encounter with automated validation tests.
  • A Medplum Bot (serverless TypeScript) that calls an LLM to summarize visit notes and writes them back as structured FHIR Observation resources.

A customized view of the system we shipped for this engagement — the components and how requests and data flow between them.

consentnotessyncdeploy📱Patient Portal🖥️ClinicianDashboard🔐SMART OAuth2PKCE🏥Medplum FHIRServer🤖Medplum Bot(LLM)🔁HL7v2 → FHIR Bot🗄️RDS AuroraPostgres☁️AWS CDK / ECSFargate
TypeScriptReactNode.js / ExpressFHIR R4 APIPostgreSQLRedisAWS CDK / ECS FargateMantine
Shipped a HIPAA/SOC 2-ready patient portal on the client's own AWS account in 8 weeks, with zero PHI leaving their boundary.
Cut lab-result turnaround from 24–48 hours of manual HL7 handling to near-instant FHIR sync.
Eliminated all legacy per-provider EHR license fees as the clinic scaled past 40 providers.
Direct value addedGives the client a fully owned, standards-based clinical data platform with no per-seat vendor tax, and a portal experience they fully control.
Why it mattersFHIR R4 is the interoperability standard healthcare buyers expect. Self-hosting an open platform on the client's own cloud keeps them compliant and in control instead of locked into a closed EHR.

Before — manual bottleneck flow

1Legacy EHR LookupBottleneck
Front-Desk Staff · 20 mins

Staff re-key patient details into a closed EHR terminal with no way to attach custom intake data.

2Manual HL7 Lab HandlingBottleneck
Data Coordinator · 24–48 hours

Lab HL7v2 messages are printed, read, and typed into the EHR by hand, delaying results.

3Per-Provider License AddBottleneck
Operations · Days

Every new clinician triggers a vendor seat purchase and a fresh onboarding ticket.

After — automated optimized flow

1Self-Service Portal Intake
Patient Portal · 3 mins

Patient completes SMART-on-FHIR-secured intake; consent and access scopes resolve instantly.

2Bot-Driven FHIR Sync
Medplum Bot · Instant

HL7v2 lab feeds auto-map to FHIR Observation/Encounter resources on arrival.

3Unified Clinician View
Provider Dashboard · 10 ms

Clinicians open a complete FHIR-native chart with labs and notes already in place.

Portrait of Dr. Sarah Jenkins
Honestly, I expected the self-hosting to be the painful part, but they had it running in our own AWS inside a couple of sprints. The thing that actually mattered to us — that no patient data sits with a vendor — was handled properly, and the HL7 ingestion saved us from a lot of manual re-keying.
Dr. Sarah Jenkins at UNC Health

Have a problem like this?

Tell us your goal and we'll turn it into a structured plan — from idea to stable, scalable reality.

Contact us