Skip to content

Patient Portal ​

Note: This app lives in a separate repository: max-health-inc/patient-portal. It deploys independently -- its CI builds static assets and pushes them into the apps_static Docker volume on the target server. The backend serves it at /apps/patient-portal/.

International Patient Portal built on IPS (International Patient Summary) and IPA (International Patient Access) standards. Patients can view their health summary, medical imaging, and clinical documents through a SMART on FHIR interface.

It launches via SMART App Launch, authenticates the patient, and presents their health data through standardized FHIR profiles rather than a vendor-specific shape, which is what makes the same portal usable against a different server.

┌────────────────┐  SMART launch  ┌──────────────┐  FHIR R4   ┌─────────────┐
│ Patient Portal │ ────────────── │  Proxy Smart │ ─────────── │ FHIR Server │
│   (browser)    │  Bearer token  │  /fhir/*     │            │ (IPS, IPA)  │
│                │                │  /dicomweb/* │            │    PACS     │
└────────────────┘                └──────────────┘            └─────────────┘

The summary view is built from the patient's IPS document, retrieved through the FHIR $summary operation and broken into navigable sections. Individual resources (allergies, conditions, medications, immunizations, observations) are read through IPA-compliant queries, so a server that implements the profile serves this portal without adapter code.

Imaging is a first-class view rather than a link out. Studies are browsed down through series to instances over DICOMweb, and pixel data is rendered in-browser by Cornerstone3D with the usual stack scrolling, zoom, pan, and window/level controls.

SMART Configuration ​

FieldValue
Client IDpatient-portal
Launch TypeStandalone, EHR Launch
Scopesopenid, profile, patient/Patient.read, patient/Condition.read, patient/Observation.read, patient/AllergyIntolerance.read, patient/MedicationRequest.read, patient/Immunization.read, patient/DocumentReference.read, patient/ImagingStudy.read
Redirect URI{base}/callback

Development ​

See the patient-portal repository for development instructions.

CommandDescription
bun run devStart dev server on port 5173
bun run buildProduction build
bun run typecheckTypeScript type checking
bun run lintESLint

Imaging Integration ​

The Patient Portal uses the DICOMweb Proxy built into Proxy Smart. When DICOMWEB_BASE_URL is configured on the backend, imaging features become available.

Viewer Controls ​

ControlAction
Scroll wheelNavigate through slices in a stack
Left dragWindow/Level adjustment
Right dragZoom
Middle dragPan

See Patient Portal Imaging for detailed imaging architecture.

IPS Integration ​

The portal requests the patient's International Patient Summary via the FHIR $summary operation:

GET /fhir/Patient/{id}/$summary

The IPS Bundle is parsed into sections (allergies, medications, conditions, immunizations, etc.) and rendered as navigable cards.

Tech Stack ​

LayerTechnology
FrameworkReact 19, TypeScript
BuildVite, Tailwind CSS
UIshadcn/ui (via shared-ui)
FHIRhl7.fhir.uv.ips-generated (IPS 2.0.0 types)
ImagingCornerstone3D, @babelfhir-ts/dicomweb
AuthSMART on FHIR (SmartAppShell)

Proxy Smart — Healthcare Interoperability Platform