Skip to content

Proxy SmartHealthcare Interoperability Proxy

An authorization layer between SMART apps and FHIR servers that stores no clinical data.

Proxy Smart

Proxy Smart sits between SMART on FHIR applications and the FHIR servers that hold the records. It terminates the OAuth flow, validates and narrows scopes, enforces consent, and forwards what survives. Clinical data is never stored on the way through, which keeps the proxy out of the compliance surface that holding records would create.

Around that core sit a set of SMART apps built on a shared component library, an admin dashboard for the platform itself, and an MCP endpoint that exposes the admin API to AI clients.

Where it sits

┌─────────────────────────────────────────────────────────────┐
│                      Frontend Apps                           │
│  Patient Portal │ Consent │ DTR │ Patient Picker │ Admin UI │
│                      SMART DICOM Template                   │
│                                                             │
│  All built with @proxy-smart/shared-ui (SmartAppShell)      │
└──────────────────────────┬──────────────────────────────────┘
                           │ SMART App Launch 2.2.0
┌──────────────────────────▼──────────────────────────────────┐
│                    Proxy Smart Backend                        │
│  Elysia/Bun │ OAuth Proxy │ FHIR Proxy │ MCP Server          │
└──────────┬──────────┬──────────┬────────────────────────────┘
           │          │          │
     ┌─────▼───┐ ┌────▼────┐ ┌──▼───────┐
     │Keycloak │ │FHIR R4  │ │Orthanc   │
     │  (IdP)  │ │Server(s)│ │(DICOMweb)│
     └─────────┘ └─────────┘ └──────────┘

Keycloak is the identity provider; the proxy never issues its own tokens. FHIR servers and DICOMweb endpoints are registered at runtime through the admin UI rather than baked into configuration.

Apps

One app still ships from this repository:

AppPortLocationPurpose
Patient Picker5176packages/patient-picker/Patient selection during standalone SMART launch

The rest live in their own repositories and release on their own cadence:

AppPortRepositoryPurpose
Admin UI5173proxy-smart/proxy-smart-admin-ui (private)Platform administration dashboard
SMART DICOM Template5180proxy-smart/smart-dicom-templateStarter kit for imaging algorithm SMART apps, Apache-2.0 and marked as a GitHub template
Patient Portal5173max-health-inc/patient-portalPatient-facing health records, imaging, IPS
Consent Manager5174max-health-inc/consent-appFHIR Consent resource management
DTR / Prior Auth5175max-health-inc/dtr-appDa Vinci DTR questionnaires and PA workflow

Each external app builds its static assets in its own CI and pushes them into a shared apps_static Docker volume mounted at /app/backend/public/apps. The backend serves them from /apps/{app-name}/. That decoupling is deliberate: an app can ship without a platform release.

The admin UI is the one exception to that path: this repository's CI checks it out, builds it into webapp-dist/, and the backend serves it at /webapp. A deployment that skips it still works -- every admin surface is reachable over the API and, since each admin route is derived into an MCP tool, over /mcp as well.

Where to start

If you are deploying the platform, read Deployment and then Environment Variables. If you are integrating an app against it, OAuth & Authentication and the FHIR Proxy describe the two surfaces you will talk to. If you are assessing spec conformance, the SMART 2.2.0 Checklist tracks implementation status and Compliance Reports publishes the Inferno results from each environment.

Everything else is in the sidebar.

External references

Proxy Smart — Healthcare Interoperability Platform