<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://www.fhirdocs.afiax.africa/blog</id>
    <title>Afiax FHIR Blog</title>
    <updated>2026-03-01T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://www.fhirdocs.afiax.africa/blog"/>
    <subtitle>Afiax FHIR Blog</subtitle>
    <icon>https://www.fhirdocs.afiax.africa/img/afiax-mark.svg</icon>
    <entry>
        <title type="html"><![CDATA[Medplum Monthly Update - February 2026]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/february-2026-update</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/february-2026-update"/>
        <updated>2026-03-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[February was a productive month for Medplum. We shipped four releases — v5.0.14, v5.0.15, v5.1.0, and v5.1.1, including a minor version bump reflecting the depth of new capabilities — with over 130 commits from 25+ contributors. The biggest themes this month were WebSocket subscription stability and performance improvements, AI-powered provider experiences, scheduling refinements, and revenue cycle tooling — all advancing our 2026 roadmap priorities.]]></summary>
        <content type="html"><![CDATA[<p>February was a productive month for Medplum. We shipped four releases — v5.0.14, v5.0.15, v5.1.0, and v5.1.1, including a minor version bump reflecting the depth of new capabilities — with over 130 commits from 25+ contributors. The biggest themes this month were <strong>WebSocket subscription stability and performance improvements</strong>, <strong>AI-powered provider experiences</strong>, <strong>scheduling refinements</strong>, and <strong>revenue cycle tooling</strong> — all advancing our <a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">2026 roadmap priorities</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="features">Features<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="provider-app-ai-powered-spaces-and-chat">Provider App: AI-Powered Spaces and Chat<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#provider-app-ai-powered-spaces-and-chat" class="hash-link" aria-label="Direct link to Provider App: AI-Powered Spaces and Chat" title="Direct link to Provider App: AI-Powered Spaces and Chat" translate="no">​</a></h3>
<p><img src="https://github.com/techdavidy.png" alt="David Yanez" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/techdavidy" target="_blank" rel="noopener noreferrer" class="">David Yanez</a></strong></p>
<p>The <a href="https://provider.medplum.com/" target="_blank" rel="noopener noreferrer" class="">Provider app</a>'s Spaces experience gained significant AI capabilities this month, advancing our <a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">AI roadmap initiative</a>:</p>
<ul>
<li class=""><strong>LLM components and visualization preview in Spaces</strong> — AI-generated structured components and previews now render inside the chat interface, enabling richer, more interactive AI responses</li>
<li class=""><strong>Attachment support in chat</strong> — Providers can now send and receive file attachments within the base chat component</li>
<li class=""><strong>Updated AI models</strong> — The provider app is configured with the latest available language models</li>
<li class=""><strong><a href="https://storybook.medplum.com/?path=/story/medplum-chat-threadinbox--basic" target="_blank" rel="noopener noreferrer" class="">ThreadInbox</a> as a reusable React component</strong> — Moved to the <code>@medplum/react</code> package, making inbox functionality available to any Medplum-powered application</li>
<li class=""><strong>Navbar alerts and counts</strong> — <a href="https://provider.medplum.com/" target="_blank" rel="noopener noreferrer" class="">Provider app</a> navigation links now support badge icons and resource counts for at-a-glance workflow status</li>
</ul>
<p>The <a href="https://github.com/medplum/medplum/tree/main/examples/foomedical" target="_blank" rel="noopener noreferrer" class="">Foomedical demo</a> — a sample patient-facing experience — was also updated to showcase the latest chat experience.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="aws-lambda-streaming-for-bots">AWS Lambda Streaming for Bots<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#aws-lambda-streaming-for-bots" class="hash-link" aria-label="Direct link to AWS Lambda Streaming for Bots" title="Direct link to AWS Lambda Streaming for Bots" translate="no">​</a></h3>
<p><img src="https://github.com/techdavidy.png" alt="David Yanez" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/techdavidy" target="_blank" rel="noopener noreferrer" class="">David Yanez</a></strong></p>
<p><a class="" href="https://www.fhirdocs.afiax.africa/docs/bots">Bots</a> deployed on AWS Lambda can now stream responses back to callers in real time. This unlocks <a href="https://en.wikipedia.org/wiki/Server-sent_events" target="_blank" rel="noopener noreferrer" class="">Server-Sent Events</a>-style streaming from Lambda-hosted bots — a foundational capability for building AI scribes, copilots, and other latency-sensitive applications. This directly supports the <a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">AI roadmap initiative</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="websocket-subscriptions-scale-and-observability">WebSocket Subscriptions: Scale and Observability<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#websocket-subscriptions-scale-and-observability" class="hash-link" aria-label="Direct link to WebSocket Subscriptions: Scale and Observability" title="Direct link to WebSocket Subscriptions: Scale and Observability" translate="no">​</a></h3>
<p><img src="https://github.com/ThatOneBro.png" alt="Derrick Farris" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/ThatOneBro" target="_blank" rel="noopener noreferrer" class="">Derrick Farris</a></strong></p>
<p>February saw a major investment in <a class="" href="https://www.fhirdocs.afiax.africa/docs/subscriptions">WebSocket subscriptions</a>, improving performance, reliability, and operational visibility at scale — directly advancing the <a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">Enterprise Scale &amp; Infrastructure roadmap priority</a>:</p>
<ul>
<li class=""><strong>Per-user WebSocket subscription limits</strong> — Prevents runaway connections from any single user from destabilizing the platform</li>
<li class=""><strong>Super admin dashboard for subscription stats</strong> — Real-time visibility into active WebSocket subscriptions, connection counts, and resource utilization across the entire platform (<a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/super-admin-guide">super admin guide</a>)</li>
<li class=""><strong>Admin operation to clear all WebSocket subscriptions</strong> — Administrative control for operations teams managing large deployments</li>
<li class=""><strong>Multiple performance improvements</strong> — Subscription criteria is now only evaluated when criteria match, access policy decisions are cached in the hot evaluation loop, active subscription lists are partitioned by resource type, Redis key deletion is non-blocking, and a new efficient event payload format reduces latency and CPU load at high subscription volumes</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="scheduling-enhancements">Scheduling Enhancements<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#scheduling-enhancements" class="hash-link" aria-label="Direct link to Scheduling Enhancements" title="Direct link to Scheduling Enhancements" translate="no">​</a></h3>
<p><img src="https://github.com/noahsilas.png" alt="Noah Silas" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/noahsilas" target="_blank" rel="noopener noreferrer" class="">Noah Silas</a></strong></p>
<p>Building on January's <a class="" href="https://www.fhirdocs.afiax.africa/docs/scheduling/defining-availability"><code>$find</code> and <code>$book</code></a> foundation, scheduling received several refinements this month:</p>
<ul>
<li class=""><strong>Customizable appointment creation before <a class="" href="https://www.fhirdocs.afiax.africa/docs/scheduling/defining-availability#appointment-booking-fhir-operations"><code>$book</code></a></strong> — Developers can now inject custom fields and logic into the appointment object before the booking operation executes, enabling clinic-specific workflows</li>
<li class=""><strong><code>_count</code> parameter for <a class="" href="https://www.fhirdocs.afiax.africa/docs/scheduling/defining-availability#appointment-booking-fhir-operations"><code>$find</code></a></strong> — Limits the number of available slots returned, improving efficiency for high-volume scheduling queries</li>
<li class=""><strong>Adding a visit now creates a busy slot</strong> — The <a class="" href="https://www.fhirdocs.afiax.africa/docs/provider/schedule">Provider calendar</a> correctly blocks time when a visit is added, ensuring accurate availability display</li>
<li class=""><strong>Improved UTC/local day discrepancy handling</strong> — Scheduling operations behave correctly when the server's UTC time and the local calendar day differ</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="revenue-cycle-claim-submission-and-eligibility">Revenue Cycle: Claim Submission and Eligibility<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#revenue-cycle-claim-submission-and-eligibility" class="hash-link" aria-label="Direct link to Revenue Cycle: Claim Submission and Eligibility" title="Direct link to Revenue Cycle: Claim Submission and Eligibility" translate="no">​</a></h3>
<p><img src="https://github.com/techdavidy.png" alt="David Yanez" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/techdavidy" target="_blank" rel="noopener noreferrer" class="">David Yanez</a></strong></p>
<p>Advancing the <a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">Revenue Cycle &amp; Billing roadmap initiative</a>:</p>
<ul>
<li class=""><strong>Claim submission to Candid</strong> — A proof-of-concept integration for submitting claims directly to Candid Health, enabling automated professional billing workflows from within the Provider app (<a class="" href="https://www.fhirdocs.afiax.africa/docs/billing">billing overview</a>)</li>
<li class=""><strong>CoverageEligibilityRequest in <code>$extract</code></strong> — The <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/extract">SDC <code>$extract</code> operation</a> now uses the standard <code>CoverageEligibilityRequest</code> resource for insurance eligibility checks, aligning with the FHIR specification</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="pharmacy-components">Pharmacy Components<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#pharmacy-components" class="hash-link" aria-label="Direct link to Pharmacy Components" title="Direct link to Pharmacy Components" translate="no">​</a></h3>
<p><img src="https://github.com/oleg-mp.png" alt="Oleg Rocklin" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/oleg-mp" target="_blank" rel="noopener noreferrer" class="">Oleg Rocklin</a></strong></p>
<p>New React components for <strong>patient preferred pharmacy selection</strong> are now available in <code>@medplum/react</code>. This supports e-prescribing workflows and the <a class="" href="https://www.fhirdocs.afiax.africa/docs/medications/e-prescibe">ePrescribe integration</a> roadmap initiative.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="multiple-redis-support">Multiple Redis Support<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#multiple-redis-support" class="hash-link" aria-label="Direct link to Multiple Redis Support" title="Direct link to Multiple Redis Support" translate="no">​</a></h3>
<p><img src="https://github.com/mattlong.png" alt="Matt Long" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/mattlong" target="_blank" rel="noopener noreferrer" class="">Matt Long</a></strong></p>
<p>Medplum server now supports <strong>multiple Redis instances</strong>, enabling more flexible infrastructure topologies including Redis Cluster deployments and failover configurations. This is an important step for enterprise-scale deployments that require high availability for caching and pub/sub. (<a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting">self-hosting guide</a>)</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="instance-level-custom-fhir-operations">Instance-Level Custom FHIR Operations<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#instance-level-custom-fhir-operations" class="hash-link" aria-label="Direct link to Instance-Level Custom FHIR Operations" title="Direct link to Instance-Level Custom FHIR Operations" translate="no">​</a></h3>
<p><img src="https://github.com/rahul1.png" alt="Rahul Agarwal" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a></strong></p>
<p>Developers can now define <a class="" href="https://www.fhirdocs.afiax.africa/docs/bots/custom-fhir-operations">custom FHIR operations</a> at the instance level with resource input — enabling more granular, resource-specific API extensions. Combined with updated <a class="" href="https://www.fhirdocs.afiax.africa/docs/bots">bot operation documentation</a>, this gives builders more control over custom workflow APIs. For self-hosters, this is particularly valuable: you can expose clinic- or organization-specific operations directly on your FHIR server without forking Medplum, keeping your customizations cleanly separated from the core platform.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="security-and-authentication">Security and Authentication<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#security-and-authentication" class="hash-link" aria-label="Direct link to Security and Authentication" title="Direct link to Security and Authentication" translate="no">​</a></h3>
<ul>
<li class=""><strong>Public PGP key published</strong> — Medplum now has a published security PGP key for responsible disclosure, listed on the <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance">security page</a> (<a href="https://github.com/codyebberson" target="_blank" rel="noopener noreferrer" class="">Cody Ebberson</a>)</li>
<li class=""><strong>Sub claim fallback in external auth</strong> — Improved compatibility with external OIDC providers that use non-standard subject claim formats (<a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a>)</li>
<li class=""><strong>In-memory rate limit tracking for high-volume abuse</strong> — Heavily rate-limited users are now tracked in memory for faster enforcement (<a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a>)</li>
<li class=""><strong>Access policy search permission explicitly checked</strong> — Tightened enforcement of access control on search operations (<a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="developer-experience">Developer Experience<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#developer-experience" class="hash-link" aria-label="Direct link to Developer Experience" title="Direct link to Developer Experience" translate="no">​</a></h3>
<ul>
<li class=""><strong>Members tab in project admin</strong> — Users and Patients are now combined into a single Members tab on the project admin page for a cleaner project management experience (<a href="https://github.com/maddyli" target="_blank" rel="noopener noreferrer" class="">Maddy Li</a>)</li>
<li class=""><strong>SMART app launch with patient identifier</strong> — SMART app launch URLs now support patient identifiers, improving interoperability with EHR launch contexts (<a href="https://github.com/maddyli" target="_blank" rel="noopener noreferrer" class="">Maddy Li</a>)</li>
<li class=""><strong>Token <code>:text</code> modifier in <a href="https://storybook.medplum.com/?path=/story/medplum-searchcontrol--checkboxes" target="_blank" rel="noopener noreferrer" class="">SearchControl</a></strong> — The <code>SearchControl</code> component now supports the token text modifier for more flexible searches (<a href="https://github.com/codyebberson" target="_blank" rel="noopener noreferrer" class="">Cody Ebberson</a>)</li>
<li class=""><strong>Hidden field support in forms</strong> — Form components now support hidden fields for passing context without user input (<a href="https://github.com/maddyli" target="_blank" rel="noopener noreferrer" class="">Maddy Li</a>)</li>
<li class=""><strong>Membership label filtering in profile chooser</strong> — The profile selection form can now filter memberships by label, contributed by <a href="https://github.com/jeffrey-peterson-vanna" target="_blank" rel="noopener noreferrer" class="">jeffrey-peterson-vanna</a></li>
<li class=""><strong>Operation to refresh reference display strings</strong> — A new operation allows refreshing cached display strings on resource references, keeping display data current after resource updates (<a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a>)</li>
<li class=""><strong>Native bcrypt for improved authentication performance</strong> — Switched from the pure-JavaScript <code>bcryptjs</code> library to native bcrypt bindings, significantly improving password hashing throughput (<a href="https://github.com/codyebberson" target="_blank" rel="noopener noreferrer" class="">Cody Ebberson</a>)</li>
<li class=""><strong>Configurable CDS services URL</strong> — The Clinical Decision Support (CDS) Hooks service URL is now configurable, enabling integration with custom CDS endpoints. CDS Hooks support is part of Medplum's <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance/hti-4">HTI-4 compliance initiative</a>, which covers payer interoperability requirements ahead of the January 2027 enforcement date. (<a href="https://github.com/codyebberson" target="_blank" rel="noopener noreferrer" class="">Cody Ebberson</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="documentation">Documentation<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<p>February's documentation work was substantial, with a major restoration of SDK docs and expanded coverage of operations, subscriptions, and integrations.</p>
<p><strong>Operations and API</strong></p>
<p><img src="https://github.com/deam65.png" alt="Darren Eam" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/deam65" target="_blank" rel="noopener noreferrer" class="">Darren Eam</a></strong></p>
<ul>
<li class=""><strong>Reorganized FHIR operations sidebar and index</strong> — The <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations">FHIR operations docs</a> are now organized with a cleaner sidebar and index page for faster navigation</li>
<li class=""><strong>New documentation for custom and bot operations</strong> — Full coverage of <a class="" href="https://www.fhirdocs.afiax.africa/docs/bots/custom-fhir-operations">custom FHIR operations</a>, including instance-level and system-level patterns</li>
<li class=""><strong>Project and system administration operations</strong> — New reference pages for <a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/super-admin-guide">admin operations</a></li>
<li class=""><strong>Data export and import operations</strong> — Documented the <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/bulk-fhir">Bulk Data Export</a>, <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/ccda-export">C-CDA Export</a>, <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/claim-export">Claim Export</a>, and <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/csv">CSV export</a> API operations</li>
<li class=""><strong>Clinical decision support operations</strong> — New reference for CDS Hooks operations, part of Medplum's <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance/hti-4">HTI-4 compliance initiative</a></li>
</ul>
<p><strong>Subscriptions</strong></p>
<ul>
<li class=""><strong>Subscription extension docs</strong> — Clarified the <a class="" href="https://www.fhirdocs.afiax.africa/docs/subscriptions/subscription-extensions">subscription extension</a> format for interaction filters and retry policy (<a href="https://github.com/ianplunkett" target="_blank" rel="noopener noreferrer" class="">Ian Plunkett</a>)</li>
<li class=""><strong><code>useSubscription</code> lifecycle hooks</strong> — Added documentation for lifecycle hook callbacks in the <a class="" href="https://www.fhirdocs.afiax.africa/docs/react/use-subscription"><code>useSubscription</code></a> React hook (<a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a>)</li>
</ul>
<p><strong>Provider and Clinical</strong></p>
<ul>
<li class=""><strong>DoseSpot notifications</strong> — Updated documentation for <a class="" href="https://www.fhirdocs.afiax.africa/docs/medications/e-prescibe">DoseSpot</a> notification handling (<a href="https://github.com/techdavidy" target="_blank" rel="noopener noreferrer" class="">David Yanez</a>)</li>
<li class=""><strong>Patient login and launch URI clarification</strong> — Improved docs for patient-facing login flows and SMART launch URIs, contributed by <a href="https://github.com/mallikharjunamulpuri" target="_blank" rel="noopener noreferrer" class="">Mallikharjuna Mulpuri</a></li>
<li class=""><strong>Allergy representation</strong> — Clarified allergy status and AllergyIntolerance formatting in the <a class="" href="https://www.fhirdocs.afiax.africa/docs/charting/allergy-intolerances">representing allergies guide</a>, contributed by <a href="https://github.com/aaronhong" target="_blank" rel="noopener noreferrer" class="">Aaron Hong</a></li>
<li class=""><strong>CareTeam tenancy patterns</strong> — Clarified per-patient CareTeam cardinality and multi-tenancy patterns (<a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a>)</li>
</ul>
<p><strong>Infrastructure and Security</strong></p>
<ul>
<li class=""><strong>Docker Hardened Images</strong> — Added Docker Hardened Images to the <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance">security page</a> (<a href="https://github.com/codyebberson" target="_blank" rel="noopener noreferrer" class="">Cody Ebberson</a>)</li>
<li class=""><strong>Medplum Agent solutions page</strong> — Created a dedicated <a class="" href="https://www.fhirdocs.afiax.africa/docs/agent">Medplum Agent solutions page</a>. The <a class="" href="https://www.fhirdocs.afiax.africa/docs/agent">Medplum Agent</a> is an application that runs inside your firewall and bridges on-premise devices (HL7/MLLP, ASTM, DICOM) to the cloud via secure WebSocket channels (<a href="https://github.com/maddyli" target="_blank" rel="noopener noreferrer" class="">Maddy Li</a>)</li>
<li class=""><strong>Branding guide</strong> — New <a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/branding">branding documentation</a> explaining how to customize the Medplum logo and application name (<a href="https://github.com/adityasuri" target="_blank" rel="noopener noreferrer" class="">Aditya Suri</a>)</li>
</ul>
<p><strong>Blog</strong></p>
<ul>
<li class=""><strong>Identity Management: A Practical Guide</strong> — New blog post by <a href="https://github.com/everett-williams" target="_blank" rel="noopener noreferrer" class="">Everett Williams</a> on managing digital identities in healthcare applications (<a class="" href="https://www.fhirdocs.afiax.africa/blog/identity-management">read the post</a>)</li>
<li class=""><strong>Medplum Secures Healthcare Platform on Docker Hardened Images</strong> — Published on the Docker blog, this post by Cody Ebberson and Docker's Ajeet Singh Raina covers how Medplum uses <a href="https://www.docker.com/blog/medplum-healthcare-docker-hardened-images/" target="_blank" rel="noopener noreferrer" class="">Docker Hardened Images</a> to reduce CVE noise, meet HIPAA and SOC 2 requirements, and minimize container security configuration burden</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="bug-fixes">Bug Fixes<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<p><strong>Clinical Data</strong></p>
<ul>
<li class="">Fixed handling of <code>nullFlavor</code> values in CCDA-to-FHIR conversion, improving interoperability with C-CDA documents that contain null-flavored data elements (contributed by <a href="https://github.com/amcgivern" target="_blank" rel="noopener noreferrer" class="">Amanda McGivern</a>)</li>
<li class="">Fixed handling of terminology designations without a language code</li>
</ul>
<p><strong>Scheduling</strong></p>
<ul>
<li class="">Fixed scheduling operations during UTC/local day boundary discrepancies</li>
</ul>
<p><strong>Server and Authentication</strong></p>
<ul>
<li class="">Fixed project-scoped users being properly removed when their project membership is deleted</li>
<li class="">Fixed a string equality check error in the token endpoint</li>
</ul>
<p><strong>Infrastructure</strong></p>
<ul>
<li class="">Fixed the CDK deployment option for retaining RDS instances on stack deletion</li>
<li class="">Fixed basic auth behavior for inactive project memberships</li>
<li class="">Reverted an overly strict date validation change that caused regressions</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="releases">Releases<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#releases" class="hash-link" aria-label="Direct link to Releases" title="Direct link to Releases" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/medplum/medplum/releases/tag/v5.0.14" target="_blank" rel="noopener noreferrer" class=""><strong>v5.0.14</strong></a> — February 3</li>
<li class=""><a href="https://github.com/medplum/medplum/releases/tag/v5.0.15" target="_blank" rel="noopener noreferrer" class=""><strong>v5.0.15</strong></a> — February 20</li>
<li class=""><a href="https://github.com/medplum/medplum/releases/tag/v5.1.0" target="_blank" rel="noopener noreferrer" class=""><strong>v5.1.0</strong></a> — February 24</li>
<li class=""><a href="https://github.com/medplum/medplum/releases/tag/v5.1.1" target="_blank" rel="noopener noreferrer" class=""><strong>v5.1.1</strong></a> — February 27</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="looking-ahead">Looking Ahead<a href="https://www.fhirdocs.afiax.africa/blog/february-2026-update#looking-ahead" class="hash-link" aria-label="Direct link to Looking Ahead" title="Direct link to Looking Ahead" translate="no">​</a></h2>
<p>February's investments in WebSocket subscription performance and Lambda streaming set the stage for more capable real-time and AI-powered workflows in Q1. The scheduling enhancements continue to push toward a full self-scheduling experience, and the Candid claim submission proof-of-concept marks meaningful progress on revenue cycle automation.</p>
<p>Join us on <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">Discord</a> to share feedback or follow along on <a href="https://github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content>
        <author>
            <name>Reshma Khilnani</name>
            <uri>https://github.com/reshmakh</uri>
        </author>
        <category label="monthly-update" term="monthly-update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Identity Management - A Practical Guide]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/identity-management</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/identity-management"/>
        <updated>2026-02-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Healthcare applications require careful decisions about user authentication and access control. Whether you're building an EHR, a clinical workflow tool, or a patient portal, getting identity management right from the start will save you from costly architectural mistakes down the road.]]></summary>
        <content type="html"><![CDATA[<p>Healthcare applications require careful decisions about user authentication and access control. Whether you're building an EHR, a clinical workflow tool, or a patient portal, getting identity management right from the start will save you from costly architectural mistakes down the road.</p>
<p>This guide breaks down the key decisions you'll face when integrating with a FHIR-based platform like Medplum, explains the tradeoffs, and recommends approaches that work well for most healthcare organizations.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-basics-authentication-vs-authorization">The Basics: Authentication vs. Authorization<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#the-basics-authentication-vs-authorization" class="hash-link" aria-label="Direct link to The Basics: Authentication vs. Authorization" title="Direct link to The Basics: Authentication vs. Authorization" translate="no">​</a></h2>
<p>Before diving into architectural decisions, let's clarify two terms that often get confused:</p>
<p><strong>Authentication (AuthN)</strong> answers the question: "Who are you?" It's the process of verifying a user's identity — typically through a username/password combination, single sign-on, or biometric verification.</p>
<p><strong>Authorization (AuthZ)</strong> answers the question: "What can you do?" Once we know who you are, authorization determines which resources you can access and what actions you can perform.</p>
<p>In healthcare, both are critical. You need to know that Dr. Smith is actually Dr. Smith (authentication), and you need to ensure Dr. Smith can only access records for patients in her practice (authorization).</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="decision-1-using-email-address-logins-vs-external-identity-provider-idp">Decision 1: Using Email Address Logins vs. External Identity Provider (IDP)<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#decision-1-using-email-address-logins-vs-external-identity-provider-idp" class="hash-link" aria-label="Direct link to Decision 1: Using Email Address Logins vs. External Identity Provider (IDP)" title="Direct link to Decision 1: Using Email Address Logins vs. External Identity Provider (IDP)" translate="no">​</a></h2>
<p>The first fundamental decision is how to uniquely identify users in your system. You have two primary options:</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="option-a-email-address">Option A: Email Address<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#option-a-email-address" class="hash-link" aria-label="Direct link to Option A: Email Address" title="Direct link to Option A: Email Address" translate="no">​</a></h3>
<p>Using email as the unique identifier is simple and intuitive. Users log in with their email, and the system matches them to their account.</p>
<p><strong>Advantages:</strong></p>
<ul>
<li class="">Familiar to users</li>
<li class="">Works with multiple login methods (Google, Microsoft, Okta)</li>
<li class="">No additional services needed</li>
</ul>
<p><strong>Disadvantages:</strong></p>
<ul>
<li class="">Email addresses change (marriage, company rebranding, job changes)</li>
<li class="">When an email changes, you need manual processes to update the account linkage</li>
<li class="">Can create orphaned accounts if not managed carefully</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="option-b-external-id-eg-okta-user-id">Option B: External ID (e.g., Okta User ID)<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#option-b-external-id-eg-okta-user-id" class="hash-link" aria-label="Direct link to Option B: External ID (e.g., Okta User ID)" title="Direct link to Option B: External ID (e.g., Okta User ID)" translate="no">​</a></h3>
<p>Instead of email, you can use a stable identifier from your identity provider — like an <a href="https://developer.okta.com/docs/api/openapi/okta-management/management/tag/User/" target="_blank" rel="noopener noreferrer" class="">Okta User ID</a> or <a href="https://learn.microsoft.com/en-us/graph/api/resources/user?view=graph-rest-1.0" target="_blank" rel="noopener noreferrer" class="">Azure AD Object ID</a>.</p>
<p><strong>Advantages:</strong></p>
<ul>
<li class="">The ID never changes, regardless of email updates</li>
<li class="">More robust for long-term identity management</li>
<li class="">More flexible for multi-provider scenarios</li>
</ul>
<p><strong>Disadvantages:</strong></p>
<ul>
<li class="">Users are locked to a single identity provider</li>
<li class="">Requires more upfront configuration by admins</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="recommendation">Recommendation<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#recommendation" class="hash-link" aria-label="Direct link to Recommendation" title="Direct link to Recommendation" translate="no">​</a></h3>
<p>The right choice depends on your organization's size and existing infrastructure.</p>
<p><strong>For smaller organizations</strong> without an existing identity provider, email-based identification is perfectly sufficient. It's simpler to set up, requires no additional infrastructure, and the occasional email change can be handled manually without significant overhead. Medplum supports <a href="https://www.medplum.com/docs/auth/mfa" target="_blank" rel="noopener noreferrer" class="">multi-factor authentication (MFA)</a>, which is required for many regulated scenarios.</p>
<p><strong>For enterprise customers</strong> with existing IDP infrastructure (Okta, Azure AD, etc.), a hybrid approach works best:</p>
<ul>
<li class="">
<p><strong>Use external IDs for your organization's internal staff</strong> (the team building and operating the platform). These users have employer-managed identities through your corporate IDP, and stability matters more than flexibility. When an employee's email changes from <code>jsmith@yourcompany.com</code> to <code>jane.smith@yourcompany.com</code>, their account should continue working seamlessly with your existing SSO.</p>
</li>
<li class="">
<p><strong>Use email for patients and domain-level routing to IDPs for partners</strong> (clinicians or administrators at clinics using your EMR, etc.). This provides flexibility because different customer organizations may use different identity providers - or none at all. Email-based identification allows Medplum to dynamically route users to the appropriate IDP based on their email domain. For example, <code>user@clinic-a.com</code> routes to Clinic A's Okta instance, while <code>user@clinic-b.com</code> routes to Clinic B's Azure AD.</p>
</li>
</ul>
<p>This hybrid approach lets you maintain tight SSO integration for your own team while giving customers the flexibility to use whatever identity infrastructure they have.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="decision-2-identity-provider-strategy">Decision 2: Identity Provider Strategy<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#decision-2-identity-provider-strategy" class="hash-link" aria-label="Direct link to Decision 2: Identity Provider Strategy" title="Direct link to Decision 2: Identity Provider Strategy" translate="no">​</a></h2>
<p>The next decision is where user credentials are managed. You have three options:</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="option-a-medplum-as-idp">Option A: Medplum as IDP<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#option-a-medplum-as-idp" class="hash-link" aria-label="Direct link to Option A: Medplum as IDP" title="Direct link to Option A: Medplum as IDP" translate="no">​</a></h3>
<p>Medplum manages credentials directly. Users create accounts with Medplum, which handles password storage, reset flows, and authentication.</p>
<p><strong>Best for:</strong> Smaller deployments, patient-facing applications where you don't have existing identity infrastructure.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="option-b-external-idp">Option B: External IDP<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#option-b-external-idp" class="hash-link" aria-label="Direct link to Option B: External IDP" title="Direct link to Option B: External IDP" translate="no">​</a></h3>
<p>A third-party service (Okta, Azure AD, Auth0) manages credentials. Your platform trusts the <a href="https://www.medplum.com/docs/auth/external-identity-providers" target="_blank" rel="noopener noreferrer" class="">external IDP</a> to authenticate users.</p>
<p><strong>Best for:</strong> Enterprise deployments with existing identity infrastructure. Enables centralized user management - when an employee leaves, disabling their Okta account immediately revokes access to all connected systems.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="option-c-domain-level-routing">Option C: Domain-Level Routing<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#option-c-domain-level-routing" class="hash-link" aria-label="Direct link to Option C: Domain-Level Routing" title="Direct link to Option C: Domain-Level Routing" translate="no">​</a></h3>
<p>This advanced approach routes users to different identity providers based on their email domain. When <code>user@hospital-a.com</code> logs in, they're sent to Hospital A's Okta instance. When <code>user@hospital-b.com</code> logs in, they're sent to Hospital B's Azure AD.</p>
<p><strong>Best for:</strong> Multi-tenant platforms serving multiple healthcare organizations, each with their own identity infrastructure. Medplum supports <a href="https://www.medplum.com/docs/auth/domain-level-identity-providers" target="_blank" rel="noopener noreferrer" class="">domain-level identity providers</a> for this use case.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="decision-3-token-flow-architecture">Decision 3: Token Flow Architecture<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#decision-3-token-flow-architecture" class="hash-link" aria-label="Direct link to Decision 3: Token Flow Architecture" title="Direct link to Decision 3: Token Flow Architecture" translate="no">​</a></h2>
<p>This is where many teams make costly mistakes. Understanding token flows is essential for building a secure, maintainable system.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="whats-a-token">What's a Token?<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#whats-a-token" class="hash-link" aria-label="Direct link to What's a Token?" title="Direct link to What's a Token?" translate="no">​</a></h3>
<p>A token is a data packet that proves a user's identity for API requests. Think of it like a wristband at a concert - it proves you're allowed to be there without requiring you to show your ID at every interaction.</p>
<p>When integrating with external identity providers, you'll encounter multiple tokens:</p>
<ul>
<li class=""><strong>IDP Token</strong> (from Okta, Azure AD, etc.): Proves the user authenticated with the external IDP</li>
<li class=""><strong>Platform Token</strong> (from Medplum): Required to access the FHIR API</li>
</ul>
<p>The question is: how do you get from an IDP token to a platform token?</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="before-building-custom-infrastructure">Before Building Custom Infrastructure<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#before-building-custom-infrastructure" class="hash-link" aria-label="Direct link to Before Building Custom Infrastructure" title="Direct link to Before Building Custom Infrastructure" translate="no">​</a></h3>
<p>When evaluating token flows, it's worth asking whether custom middleware or proxy layers are truly necessary. Modern FHIR platforms typically provide robust, standards-compliant authentication out of the box.</p>
<p>Before adding intermediate infrastructure, consider:</p>
<ul>
<li class=""><strong>What specific requirement does it solve?</strong> Make sure there's a documented need that the platform's native authentication can't address.</li>
<li class=""><strong>What's the maintenance burden?</strong> Custom auth layers require ongoing security updates and auditing.</li>
<li class=""><strong>Does it duplicate existing functionality?</strong> Often, the platform already handles what you're trying to build.</li>
</ul>
<p>In most cases, the three-legged OAuth (redirect flow) described below will meet your needs without additional complexity.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="three-legged-oauth-recommended">Three-Legged OAuth (Recommended)<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#three-legged-oauth-recommended" class="hash-link" aria-label="Direct link to Three-Legged OAuth (Recommended)" title="Direct link to Three-Legged OAuth (Recommended)" translate="no">​</a></h3>
<p><a href="https://www.medplum.com/docs/auth/external-identity-providers" target="_blank" rel="noopener noreferrer" class="">Three legged OAuth</a> is the recommended approach unless your application needs access to other services beyond Medplum:</p>
<ol>
<li class="">User clicks "Login" in your app</li>
<li class="">Browser redirects to Okta</li>
<li class="">User authenticates with Okta</li>
<li class="">Okta redirects back to your app with a code</li>
<li class="">Your app exchanges the code with Medplum</li>
<li class="">Medplum validates with Okta and issues its own token</li>
<li class="">User's browser stores only the Medplum token</li>
</ol>
<p><strong>Result:</strong> User ends up with just a Medplum token. Clean, simple, secure.</p>
<p><strong>Best for:</strong> Applications that only need to access Medplum APIs.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="token-exchange-multi-service-access">Token Exchange (Multi-Service Access)<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#token-exchange-multi-service-access" class="hash-link" aria-label="Direct link to Token Exchange (Multi-Service Access)" title="Direct link to Token Exchange (Multi-Service Access)" translate="no">​</a></h3>
<p><a href="https://www.medplum.com/docs/auth/token-exchange" target="_blank" rel="noopener noreferrer" class="">Token exchange</a> is useful for multi-service workflows:</p>
<ol>
<li class="">User authenticates with Okta</li>
<li class="">Okta issues a token stored in the user's browser</li>
<li class="">Your app sends the Okta token to Medplum's token exchange endpoint</li>
<li class="">Medplum validates the token and issues its own token</li>
<li class="">User's browser stores both tokens</li>
</ol>
<p><strong>Result:</strong> User has both an Okta token and a Medplum token.</p>
<p><strong>Why this matters:</strong> If your application needs to access other services beyond Medplum (billing systems, other healthcare APIs, etc.), the user still has their Okta token to authenticate with those services. This is common in healthcare, where a single workflow might touch multiple systems.</p>
<div class="language-javascript codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-javascript codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Using the Medplum SDK for token exchange</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> medplum </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">MedplumClient</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">baseUrl</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">MEDPLUM_BASE_URL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token literal-property property" style="color:#36acaa">clientId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token constant" style="color:#36acaa">MEDPLUM_CLIENT_ID</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Exchange your external IDP token for a Medplum token</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">exchangeExternalAccessToken</span><span class="token punctuation" style="color:#393A34">(</span><span class="token constant" style="color:#36acaa">OKTA_ACCESS_TOKEN</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Now you can make FHIR API calls</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> patient </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> medplum</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">readResource</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'Patient'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> patientId</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="on-behalf-of-server-side-pattern">On-Behalf-Of (Server-Side Pattern)<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#on-behalf-of-server-side-pattern" class="hash-link" aria-label="Direct link to On-Behalf-Of (Server-Side Pattern)" title="Direct link to On-Behalf-Of (Server-Side Pattern)" translate="no">​</a></h3>
<p>For server-side applications that act as intermediaries, the <a href="https://www.medplum.com/docs/auth/on-behalf-of" target="_blank" rel="noopener noreferrer" class="">On-Behalf-Of</a> pattern allows a trusted backend to make requests on behalf of specific users:</p>
<ol>
<li class="">Your backend authenticates as a ClientApplication</li>
<li class="">When making requests, include a header specifying which user you're acting for</li>
<li class="">Medplum applies that user's access policies to the request</li>
</ol>
<div class="language-bash codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-bash codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">curl 'https://api.medplum.com/fhir/R4/Patient' \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --user $CLIENT_ID:$CLIENT_SECRET \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -H 'content-type: application/fhir+json' \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -H 'x-medplum: extended' \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -H 'x-medplum-on-behalf-of: ProjectMembership/abc123' \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  --data-raw '{"resourceType":"Patient","name":[{"given":["Homer"],"family":"Simpson"}]}'</span><br></span></code></pre></div></div>
<p><strong>Best for:</strong> Architectures where a custom backend mediates all interactions with Medplum. Useful for maintaining audit trails showing both which system made the request and which user it was acting for.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="putting-it-together-recommended-architecture">Putting It Together: Recommended Architecture<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#putting-it-together-recommended-architecture" class="hash-link" aria-label="Direct link to Putting It Together: Recommended Architecture" title="Direct link to Putting It Together: Recommended Architecture" translate="no">​</a></h2>
<p>For most healthcare organizations building on a FHIR platform, here's the recommended approach:</p>
<ol>
<li class=""><strong>Choose your unique identifiers</strong> - external IDs for your internal staff, email for customers and their users</li>
<li class=""><strong>Use an external IDP</strong> (Okta, Azure AD) for enterprise users, with domain-level routing for multi-tenant scenarios</li>
<li class=""><strong>Implement Three-Legged OAuth</strong> unless your application needs access to other services outside of Medplum</li>
<li class=""><strong>Lean on native platform capabilities</strong> unless you have a specific, documented requirement for custom infrastructure</li>
</ol>
<p>This architecture gives you:</p>
<ul>
<li class="">Centralized user management through your existing IDP</li>
<li class="">Stable user accounts that survive email changes</li>
<li class="">Simplicity of token flow</li>
<li class="">Direct API access without unnecessary intermediaries</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="key-questions-to-ask">Key Questions to Ask<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#key-questions-to-ask" class="hash-link" aria-label="Direct link to Key Questions to Ask" title="Direct link to Key Questions to Ask" translate="no">​</a></h2>
<p>Before finalizing your identity architecture, ensure you can answer these questions:</p>
<ol>
<li class=""><strong>Who are your user types?</strong> (Staff, clinicians, patients, caregivers)</li>
<li class=""><strong>What identity providers do they use?</strong> (Corporate SSO, social login, self-registration)</li>
<li class=""><strong>What other systems need the IDP token?</strong> (Determines if you need Token Exchange)</li>
<li class=""><strong>How do you handle user offboarding?</strong> (Centralized IDP makes this easier)</li>
<li class=""><strong>What's your multi-tenancy model?</strong> (May require domain-level routing)</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="conclusion">Conclusion<a href="https://www.fhirdocs.afiax.africa/blog/identity-management#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Identity management doesn't have to be complicated. The key is understanding your requirements before jumping into implementation.</p>
<p>Start with the simplest approach that meets your needs. Three-legged OAuth with an external IDP is the recommended starting point for most healthcare applications. If you later need to access services beyond Medplum, you can adopt token exchange at that point.</p>
<hr>
<p><em>For a complete overview of authentication options, see the <a href="https://www.medplum.com/docs/auth" target="_blank" rel="noopener noreferrer" class="">Medplum Authentication Documentation</a>.</em></p>]]></content>
        <author>
            <name>Everett Williams</name>
            <uri>https://github.com/everett-williams</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Medplum Monthly Update - January 2026]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/january-2026-update</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/january-2026-update"/>
        <updated>2026-02-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[January was a packed month for Medplum. We shipped three patch releases (v5.0.11, v5.0.12, v5.0.13), published the 2026 Roadmap, and landed over 100 commits from 20+ contributors. The biggest themes this month were scheduling, the Provider app, and site reliability — all directly advancing our 2026 roadmap priorities.]]></summary>
        <content type="html"><![CDATA[<p>January was a packed month for Medplum. We shipped three patch releases (v5.0.11, v5.0.12, v5.0.13), published the <a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">2026 Roadmap</a>, and landed over 100 commits from 20+ contributors. The biggest themes this month were <strong>scheduling</strong>, <strong>the Provider app</strong>, and <strong>site reliability</strong> — all directly advancing our <a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">2026 roadmap priorities</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="features">Features<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="provider-app-spaces-messaging-and-tasks">Provider App: Spaces, Messaging, and Tasks<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#provider-app-spaces-messaging-and-tasks" class="hash-link" aria-label="Direct link to Provider App: Spaces, Messaging, and Tasks" title="Direct link to Provider App: Spaces, Messaging, and Tasks" translate="no">​</a></h3>
<p><img src="https://github.com/techdavidy.png" alt="David Yanez" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/techdavidy" target="_blank" rel="noopener noreferrer" class="">David Yanez</a></strong></p>
<p>The <a href="https://provider.medplum.com/" target="_blank" rel="noopener noreferrer" class="">Provider app</a> saw major improvements across messaging, task management, and the new Spaces experience. This work advances the <a class="" href="https://www.fhirdocs.afiax.africa/docs/provider">Provider Application roadmap goal</a> of expanding available workflows.</p>
<ul>
<li class=""><strong><a href="https://provider.medplum.com/Spaces/Communication" target="_blank" rel="noopener noreferrer" class="">Spaces</a> streaming and buffered support</strong> — real-time communication with both streaming and buffered message delivery</li>
<li class=""><strong><a href="https://en.wikipedia.org/wiki/Server-sent_events" target="_blank" rel="noopener noreferrer" class="">Server-Sent Events</a> bot implementation</strong> — SSE support for bots, enabling real-time AI-powered interactions</li>
<li class=""><strong><a href="https://provider.medplum.com/Communication" target="_blank" rel="noopener noreferrer" class="">Messaging</a> improvements</strong> — URL support in the inbox, participant filtering, and topic-based threading for Communications</li>
<li class=""><strong><a href="https://provider.medplum.com/Task" target="_blank" rel="noopener noreferrer" class="">Task management</a></strong> — auto-selection when the task list is empty, priority display for better triage</li>
<li class=""><strong>Navbar updates</strong> for both Medplum and Provider apps by <a href="https://github.com/kevinwadeshaw" target="_blank" rel="noopener noreferrer" class="">Kevin Wadeshaw</a>, plus a new <strong>Get Started page</strong></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="scheduling-find-and-book-operations">Scheduling: $find and $book Operations<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#scheduling-find-and-book-operations" class="hash-link" aria-label="Direct link to Scheduling: $find and $book Operations" title="Direct link to Scheduling: $find and $book Operations" translate="no">​</a></h3>
<p><img src="https://github.com/noahsilas.png" alt="Noah Silas" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/noahsilas" target="_blank" rel="noopener noreferrer" class="">Noah Silas</a></strong></p>
<p>The most significant feature work this month was a ground-up buildout of FHIR-native scheduling operations. This directly supports the <a class="" href="https://www.fhirdocs.afiax.africa/docs/scheduling">Scheduling initiative</a> on our <a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">2026 roadmap</a>, where we committed to self-scheduling, advanced availability management, and resource scheduling.</p>
<ul>
<li class=""><strong><code>$find</code> operation</strong> for querying available slots on a single Schedule resource, now with unique slot identifiers and timezone support (<a class="" href="https://www.fhirdocs.afiax.africa/docs/scheduling">scheduling docs</a>)</li>
<li class=""><strong><code>$book</code> operation</strong> for creating Appointments through a FHIR operation, with a first pass on the Provider UI booking flow</li>
<li class=""><strong>Provider Calendar refactor</strong> to support the new scheduling operations</li>
<li class=""><strong>Timezone support</strong> in <code>SchedulingParams</code>, enabling scheduling across time zones</li>
<li class="">New <a class="" href="https://www.fhirdocs.afiax.africa/docs/search/advanced-search-parameters">search parameters</a> for <code>ActivityDefinition.code</code>, <code>Communication.priority</code>, and <code>ProjectMembership.active</code></li>
</ul>
<p>These operations give developers a clean, standards-based API for building patient self-scheduling and staff scheduling workflows — a capability that has been one of our most requested features.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="system-level-custom-fhir-operations">System-Level Custom FHIR Operations<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#system-level-custom-fhir-operations" class="hash-link" aria-label="Direct link to System-Level Custom FHIR Operations" title="Direct link to System-Level Custom FHIR Operations" translate="no">​</a></h3>
<p><img src="https://github.com/monsieurBelbo.png" alt="Gonzalo Bellver" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/monsieurBelbo" target="_blank" rel="noopener noreferrer" class="">Gonzalo Bellver</a></strong></p>
<p>Developers can now define <a class="" href="https://www.fhirdocs.afiax.africa/docs/bots/custom-fhir-operations">custom FHIR operations</a> at the system level, not just per-resource. This is a key building block for the <a class="" href="https://www.fhirdocs.afiax.africa/docs/bots">Integrations &amp; Plugins roadmap initiative</a>, enabling more flexible bot-powered workflows and custom API endpoints.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="fhir-operations-and-terminology">FHIR Operations and Terminology<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#fhir-operations-and-terminology" class="hash-link" aria-label="Direct link to FHIR Operations and Terminology" title="Direct link to FHIR Operations and Terminology" translate="no">​</a></h3>
<p><img src="https://github.com/deam65.png" alt="Darren Eam" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/deam65" target="_blank" rel="noopener noreferrer" class="">Darren Eam</a></strong></p>
<ul>
<li class=""><strong><a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/patient-summary">Patient <code>$summary</code> operation</a></strong> with updated <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/patient-everything"><code>$everything</code> documentation</a></li>
<li class=""><strong><a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/conceptmap-import">ConceptMap import</a></strong> and comprehensive <a class="" href="https://www.fhirdocs.afiax.africa/docs/terminology">terminology operations documentation</a></li>
<li class="">New <strong><a class="" href="https://www.fhirdocs.afiax.africa/docs/auth">authentication and security operations</a></strong> and <strong><a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/validate-a-resource">resource validation operations</a></strong></li>
</ul>
<p><img src="https://github.com/mattwiller.png" alt="Matt Willer" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a></strong></p>
<ul>
<li class=""><strong>X-FHIR-Query support in <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/extract">SDC <code>$extract</code></a></strong> — enables dynamic queries in <a class="" href="https://www.fhirdocs.afiax.africa/docs/questionnaires/structured-data-capture">Structured Data Capture</a> extraction, improving form-based data capture workflows</li>
<li class=""><strong>Display language overrides</strong> in <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/valueset-expand"><code>ValueSet/$expand</code></a> and <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/codesystem-validate-code"><code>CodeSystem/$validate-code</code></a> — supports multilingual <a class="" href="https://www.fhirdocs.afiax.africa/docs/terminology">terminology services</a>, which is important for international deployments</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="site-reliability-and-infrastructure">Site Reliability and Infrastructure<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#site-reliability-and-infrastructure" class="hash-link" aria-label="Direct link to Site Reliability and Infrastructure" title="Direct link to Site Reliability and Infrastructure" translate="no">​</a></h3>
<p>These changes support the <a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">Enterprise Scale &amp; Infrastructure roadmap priority</a> of handling growing platform traffic.</p>
<p><img src="https://github.com/mattwiller.png" alt="Matt Willer" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a></strong></p>
<ul>
<li class=""><strong>Reserved database connections for healthcheck</strong> — prevents health checks from being starved during high load</li>
<li class=""><strong>Redis failover error handling</strong> in BullMQ workers — improves resilience during Redis cluster failovers</li>
<li class=""><strong>Skip caching on write for <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/resources/auditevent">AuditEvent</a> resources</strong> — reduces memory pressure for high-volume audit logging</li>
<li class=""><strong>Tracing extensions on OperationOutcome</strong> — better observability for debugging production issues</li>
</ul>
<p><img src="https://github.com/mattlong.png" alt="Matt Long" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/mattlong" target="_blank" rel="noopener noreferrer" class="">Matt Long</a></strong></p>
<ul>
<li class=""><strong><a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/super-admin-guide">ReindexJob</a> configuration enhancements</strong> — more control over reindexing for large datasets</li>
<li class=""><strong>Per-resourceType padding configuration</strong> — fine-grained tuning of array padding for storage optimization</li>
<li class=""><strong>Array padding calculator</strong> — tooling to help determine optimal padding settings</li>
</ul>
<p><img src="https://github.com/noahsilas.png" alt="Noah Silas" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/noahsilas" target="_blank" rel="noopener noreferrer" class="">Noah Silas</a></strong></p>
<ul>
<li class=""><strong>Automatic pre/post deploy migration generation</strong> — streamlines the database migration workflow for <a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting">self-hosted deployments</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="security-and-access-control">Security and Access Control<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#security-and-access-control" class="hash-link" aria-label="Direct link to Security and Access Control" title="Direct link to Security and Access Control" translate="no">​</a></h3>
<ul>
<li class=""><strong>Inactive ProjectMembership disables access tokens</strong> — when a membership is set to inactive, associated tokens are immediately invalidated (<a class="" href="https://www.fhirdocs.afiax.africa/docs/access/access-policies">access control docs</a>) (<a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a>)</li>
<li class=""><strong><a class="" href="https://www.fhirdocs.afiax.africa/docs/subscriptions">Subscription</a> Bot execution respects ProjectMembership</strong> — ensures subscriptions run in the correct membership context (<a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a>)</li>
<li class=""><strong>On-behalf-of header support</strong> with proper cache disabling (<a href="https://github.com/maddyli" target="_blank" rel="noopener noreferrer" class="">Maddy Li</a>, <a href="https://github.com/codyebberson" target="_blank" rel="noopener noreferrer" class="">Cody Ebberson</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="sdk-and-developer-experience">SDK and Developer Experience<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#sdk-and-developer-experience" class="hash-link" aria-label="Direct link to SDK and Developer Experience" title="Direct link to SDK and Developer Experience" translate="no">​</a></h3>
<ul>
<li class=""><strong><code>client.post&lt;T&gt;</code> generic type annotation</strong> for better TypeScript ergonomics (<a href="https://github.com/noahsilas" target="_blank" rel="noopener noreferrer" class="">Noah Silas</a>)</li>
<li class=""><strong>Nested connections in <a class="" href="https://www.fhirdocs.afiax.africa/docs/graphql">GraphQL</a></strong> (<a href="https://github.com/maddyli" target="_blank" rel="noopener noreferrer" class="">Maddy Li</a>)</li>
<li class=""><strong>Configurable base64 caps</strong> in core (<a href="https://github.com/syp1xd" target="_blank" rel="noopener noreferrer" class="">Sakshum Gadyal</a>)</li>
<li class=""><strong>Abort signal support for <code>sleep</code></strong> to allow request cancellation (<a href="https://github.com/mirza-kapetanovic" target="_blank" rel="noopener noreferrer" class="">Mirza Kapetanovic</a>)</li>
<li class=""><strong><a class="" href="https://www.fhirdocs.afiax.africa/docs/subscriptions">Subscription</a> AuditEvent destination extension</strong> for routing audit events (<a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="ai-and-mcp">AI and MCP<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#ai-and-mcp" class="hash-link" aria-label="Direct link to AI and MCP" title="Direct link to AI and MCP" translate="no">​</a></h3>
<p>Advancing our <a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">AI roadmap initiative</a>:</p>
<ul>
<li class=""><strong><a class="" href="https://www.fhirdocs.afiax.africa/docs/ai/mcp">MCP server</a> updated</strong> to replace deprecated methods, keeping Medplum's Model Context Protocol support current (<a href="https://github.com/noahsilas" target="_blank" rel="noopener noreferrer" class="">Noah Silas</a>)</li>
<li class=""><strong>AI operation documentation</strong> added (<a class="" href="https://www.fhirdocs.afiax.africa/docs/ai/ai-operation">AI operation docs</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="documentation">Documentation<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#documentation" class="hash-link" aria-label="Direct link to Documentation" title="Direct link to Documentation" translate="no">​</a></h2>
<p>A significant documentation effort this month improved coverage across the Provider app, scheduling, self-hosting, the Medplum Agent, and compliance.</p>
<p><strong>Provider</strong></p>
<ul>
<li class="">Provider app docs updated (<a class="" href="https://www.fhirdocs.afiax.africa/docs/provider">Provider app guide</a>)</li>
<li class="">Updated <a class="" href="https://www.fhirdocs.afiax.africa/docs/charting">charting documentation</a></li>
</ul>
<p><img src="https://github.com/finnbergquist.png" alt="Finn Bergquist" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/finnbergquist" target="_blank" rel="noopener noreferrer" class="">Finn Bergquist</a></strong></p>
<ul>
<li class=""><strong>Revamped multi-tenancy documentation</strong> (<a class="" href="https://www.fhirdocs.afiax.africa/docs/auth/domain-level-identity-providers">multi-tenancy identity providers</a>)</li>
<li class=""><strong>Scheduling docs</strong>: availability time zones, <code>$find</code> beta status, <code>SchedulingParameters</code> duration param (<a class="" href="https://www.fhirdocs.afiax.africa/docs/scheduling">scheduling docs</a>)</li>
<li class=""><strong>DoseSpot enrollment documentation</strong>: how to enroll users with the Enroll Prescriber Bot (<a class="" href="https://www.fhirdocs.afiax.africa/docs/medications">medications docs</a>)</li>
<li class=""><strong>AccessPolicy requirements for Bulk Export API</strong> (<a class="" href="https://www.fhirdocs.afiax.africa/docs/api">API docs</a>)</li>
<li class=""><strong>Observation.valueSampledData</strong> documentation</li>
</ul>
<p><strong>Self-Hosting and Operations</strong></p>
<ul>
<li class="">Self-hosting best practices docs (<a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting">self-hosting guide</a>)</li>
<li class="">AWS Lambda bots on localhost guide (<a class="" href="https://www.fhirdocs.afiax.africa/docs/bots">Bots docs</a>)</li>
<li class="">Node.js version requirement updated to 22+ (<a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting">self-hosting guide</a>)</li>
<li class=""><a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/running-full-medplum-stack-in-docker">Docker Compose</a> persistence and restart policies improved</li>
</ul>
<p><strong>Medplum Agent</strong></p>
<p><img src="https://github.com/ThatOneBro.png" alt="Derrick Farris" width="50" height="50" style="border-radius:50%"> <strong><a href="https://github.com/ThatOneBro" target="_blank" rel="noopener noreferrer" class="">Derrick Farris</a></strong></p>
<p>The <a class="" href="https://www.fhirdocs.afiax.africa/docs/agent">Medplum Agent</a> is an application that runs inside your firewall and connects to devices over low-level protocols such as HL7/MLLP, ASTM, and DICOM, bridging them to the cloud via secure HTTPS WebSocket channels. This month the Agent docs received several updates:</p>
<ul>
<li class="">Minimal <a class="" href="https://www.fhirdocs.afiax.africa/docs/agent/access-policy">access policy for Agent</a> documented</li>
<li class="">Enhanced mode <a class="" href="https://www.fhirdocs.afiax.africa/docs/agent/acknowledgement-modes"><code>aaMode</code></a> documented</li>
<li class="">Section on deactivating memberships added</li>
</ul>
<p><strong>Additional Docs</strong></p>
<ul>
<li class="">Integration tables organized into logical groups (<a class="" href="https://www.fhirdocs.afiax.africa/docs/integration">integrations overview</a>)</li>
<li class="">Terminology services: translated display strings documentation (<a class="" href="https://www.fhirdocs.afiax.africa/docs/terminology">terminology services guide</a>)</li>
<li class="">Compliance documentation and CHPL listing updated for V5 (<a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance">compliance overview</a>)</li>
<li class="">2026 Roadmap published (<a class="" href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap">2026 roadmap</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="bug-fixes">Bug Fixes<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<p><strong>Forms and UI</strong></p>
<ul>
<li class="">Fixed repeatable items in <a class="" href="https://www.fhirdocs.afiax.africa/docs/questionnaires"><code>QuestionnaireForm</code></a></li>
<li class="">Fixed dark mode on the visit details page</li>
<li class="">Fixed color inheritance issue (dark to inherit)</li>
<li class="">Updated diagnoses binding URL in OrderLabsPage</li>
</ul>
<p><strong>Server and API</strong></p>
<ul>
<li class="">Fixed SQL error in date array search parameters</li>
<li class="">Fixed search by POST issue via body-parser update</li>
<li class="">Fixed CCDA timezone offset conversion to FHIR format (<a href="https://github.com/amcgivern" target="_blank" rel="noopener noreferrer" class="">Amanda McGivern</a>)</li>
<li class="">Fixed <code>validateResource</code> argument merging</li>
<li class="">Fixed consistent <code>storageBaseUrl</code> generation with <code>/binary/</code> path (<a href="https://github.com/jfiorato" target="_blank" rel="noopener noreferrer" class="">Jim Fiorato</a>)</li>
<li class="">Fixed out-of-order query results in <code>useSearch</code></li>
<li class="">Fixed too-many-requests error re-wrapping in <code>fetchTokens</code></li>
</ul>
<p><strong>Agent</strong></p>
<ul>
<li class=""><a class="" href="https://www.fhirdocs.afiax.africa/docs/agent/push"><code>pushToAgent</code></a> now returns on first ACK by default</li>
<li class="">Added logging for <a class="" href="https://www.fhirdocs.afiax.africa/docs/agent/acknowledgement-modes">enhanced mode</a> acknowledgments</li>
</ul>
<p><strong>Infrastructure</strong></p>
<ul>
<li class="">Fixed <a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/running-full-medplum-stack-in-docker">Docker Compose</a> full-stack config after hardened images</li>
<li class="">Added persistence to <a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/running-full-medplum-stack-in-docker">Docker Compose</a> files (<a href="https://github.com/mraspberry-uai" target="_blank" rel="noopener noreferrer" class="">Matthew Raspberry</a>)</li>
<li class="">Fixed database connection release during seeding</li>
<li class="">Fixed Spaces message persistence</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="releases">Releases<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#releases" class="hash-link" aria-label="Direct link to Releases" title="Direct link to Releases" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/medplum/medplum/releases/tag/v5.0.11" target="_blank" rel="noopener noreferrer" class=""><strong>v5.0.11</strong></a> — January 21</li>
<li class=""><a href="https://github.com/medplum/medplum/releases/tag/v5.0.12" target="_blank" rel="noopener noreferrer" class=""><strong>v5.0.12</strong></a> — January 23</li>
<li class=""><a href="https://github.com/medplum/medplum/releases/tag/v5.0.13" target="_blank" rel="noopener noreferrer" class=""><strong>v5.0.13</strong></a> — January 28</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="looking-ahead">Looking Ahead<a href="https://www.fhirdocs.afiax.africa/blog/january-2026-update#looking-ahead" class="hash-link" aria-label="Direct link to Looking Ahead" title="Direct link to Looking Ahead" translate="no">​</a></h2>
<p>January's scheduling work sets the stage for the self-scheduling and resource scheduling features planned for 2026. The Provider app's Spaces and streaming capabilities are moving us closer to a production-ready provider experience. On the infrastructure side, the Redis failover handling and database connection improvements directly support enterprise-scale deployments.</p>
<p>Join us on <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">Discord</a> to share feedback or follow along on <a href="https://github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>]]></content>
        <author>
            <name>Reshma Khilnani</name>
            <uri>https://github.com/reshmakh</uri>
        </author>
        <category label="monthly-update" term="monthly-update"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Medplum 2026 Roadmap]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/2026-roadmap</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap"/>
        <updated>2026-01-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[As we kick off 2026, we're excited to share Medplum's vision for the year ahead. Our open-source healthcare development platform has experienced substantial growth throughout 2025:]]></summary>
        <content type="html"><![CDATA[<p>As we kick off 2026, we're excited to share Medplum's vision for the year ahead. Our open-source healthcare development platform has experienced substantial growth throughout 2025:</p>
<p>As of December 2025:</p>
<ul>
<li class="">500,000+ Docker downloads (up 2x from 2024)</li>
<li class="">161 GitHub contributors (up 40% from 2024)</li>
<li class="">2,100 GitHub stars</li>
</ul>
<p>As informed by our community and customers, we are focusing on the following initiatives in 2026.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="compliance-h1-2026">Compliance (H1 2026)<a href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap#compliance-h1-2026" class="hash-link" aria-label="Direct link to Compliance (H1 2026)" title="Direct link to Compliance (H1 2026)" translate="no">​</a></h3>
<p>Medplum is pursuing <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance/hitrust">HITRUST Certification</a> for our hosted environment. We are also certifying changes related to <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance/hti-4">HTI-4</a> to enable both providers and payers to comply with the mandate, with key milestones aligned to the January 2027 enforcement date.</p>
<p>These compliance primitives support hospital and health system connectivity and interoperability. The HTI-4 mandates are also important because they cover prior authorization for medications, professional billing, and facilities billing.</p>
<p><strong>Related Reading:</strong> 📋 <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance">Compliance Overview</a>, 🛡️ <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance/hitrust">HITRUST</a>, 🔒 <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance/soc2">SOC2</a>, 🏥 <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance/hipaa">HIPAA</a>, ✅ <a class="" href="https://www.fhirdocs.afiax.africa/docs/compliance/onc">ONC Certification</a>, 🔗 <a class="" href="https://www.fhirdocs.afiax.africa/blog/technical-guide-to-tefca">TEFCA Overview</a></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="enterprise-scale--infrastructure">Enterprise Scale &amp; Infrastructure<a href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap#enterprise-scale--infrastructure" class="hash-link" aria-label="Direct link to Enterprise Scale &amp; Infrastructure" title="Direct link to Enterprise Scale &amp; Infrastructure" translate="no">​</a></h3>
<p>Platform traffic on Medplum is growing quickly, and we are investing in several initiatives to achieve scale. We are implementing sharding and archiving capabilities to handle larger datasets efficiently. Data warehouse integration via Kafka will support high volume connections. We are also enhancing cross-cloud support for GCP, Azure, and AWS deployments.</p>
<p><strong>Related Reading:</strong> 🏠 <a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting">Self-Hosting Overview</a>, 🗂️ <a href="https://github.com/medplum/medplum/discussions/6026" target="_blank" rel="noopener noreferrer" class="">Sharding Discussion</a>, ☁️ <a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/install-on-aws">Install on AWS</a>, 🌐 <a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/install-on-gcp">Install on GCP</a>, 🔷 <a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/install-on-azure">Install on Azure</a>, 📊 <a class="" href="https://www.fhirdocs.afiax.africa/docs/analytics">Analytics</a>, 📈 <a class="" href="https://www.fhirdocs.afiax.africa/docs/self-hosting/aws-athena-guide">AWS Athena Guide</a>, 🎬 <a href="https://youtu.be/0ewuLinTDYQ" target="_blank" rel="noopener noreferrer" class="">PlumCon Scaling to Millions of Patients</a></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="scheduling">Scheduling<a href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap#scheduling" class="hash-link" aria-label="Direct link to Scheduling" title="Direct link to Scheduling" translate="no">​</a></h3>
<p>Scheduling is key to healthcare workflows, and we are investing heavily in making it great for a wide variety of use cases. This includes self-scheduling, advanced availability management, facilities scheduling, and resource scheduling.</p>
<p><strong>Related Reading:</strong> 📅 <a class="" href="https://www.fhirdocs.afiax.africa/docs/scheduling">Scheduling Overview</a>, ⏰ <a class="" href="https://www.fhirdocs.afiax.africa/docs/scheduling/defining-availability">Defining Availability</a>, 🗓️ <a class="" href="https://www.fhirdocs.afiax.africa/products/scheduling">Scheduling Product</a>, 🤖 <a class="" href="https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai">Scheduling Agents for Healthcare Operations</a></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="provider-application">Provider Application<a href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap#provider-application" class="hash-link" aria-label="Direct link to Provider Application" title="Direct link to Provider Application" translate="no">​</a></h3>
<p>Medplum has a provider experience that is ONC certified as a base EHR. We will make investments this year to expand the available workflows and integrations. We are also improving the onboarding experience for new practices to get up and running quickly.</p>
<p><strong>Related Reading:</strong> 👨‍⚕️ <a class="" href="https://www.fhirdocs.afiax.africa/docs/provider">Provider Overview</a>, ⚙️ <a class="" href="https://www.fhirdocs.afiax.africa/docs/provider/getting-started">Provider Setup</a>, 📝 <a class="" href="https://www.fhirdocs.afiax.africa/docs/charting">Charting</a></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="integrations--plugins">Integrations &amp; Plugins<a href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap#integrations--plugins" class="hash-link" aria-label="Direct link to Integrations &amp; Plugins" title="Direct link to Integrations &amp; Plugins" translate="no">​</a></h3>
<p>We are building a plugin ecosystem to give you access to a wide variety of tools that work with your workflow. We are also enhancing the prescribing experience with improved safety features and HTI-4 compliance.</p>
<p><strong>Related Reading:</strong> 🤖 <a class="" href="https://www.fhirdocs.afiax.africa/docs/bots">Bots Overview</a>, 📚 <a class="" href="https://www.fhirdocs.afiax.africa/docs/bots/bot-basics">Bot Basics</a>, 💊 <a class="" href="https://www.fhirdocs.afiax.africa/docs/medications/e-prescibe">ePrescribe</a></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="revenue-cycle--billing">Revenue Cycle &amp; Billing<a href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap#revenue-cycle--billing" class="hash-link" aria-label="Direct link to Revenue Cycle &amp; Billing" title="Direct link to Revenue Cycle &amp; Billing" translate="no">​</a></h3>
<p>We are enabling developers to build high fidelity revenue cycle management solutions. We are also streamlining prior authorization workflows to reduce administrative burden in accordance with the upcoming regulations in HTI-4.</p>
<p><strong>Related Reading:</strong> 💰 <a class="" href="https://www.fhirdocs.afiax.africa/docs/billing">Billing Overview</a>, 🏦 <a class="" href="https://www.fhirdocs.afiax.africa/docs/billing/patient-insurance">Payer and Coverage Context</a>, ✅ <a class="" href="https://www.fhirdocs.afiax.africa/docs/billing/insurance-eligibility-checks">Eligibility and Benefit Checks</a>, 📄 <a class="" href="https://www.fhirdocs.afiax.africa/docs/billing/creating-cms1500">Afiax Billing Settlement Exports</a></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="ai">AI<a href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap#ai" class="hash-link" aria-label="Direct link to AI" title="Direct link to AI" translate="no">​</a></h3>
<p>Medplum continues to be a destination for builders who are making incredible AI applications. We will make continued investments to our AI infrastructure such as MCP, SSE, websockets, and composable model configurations that will power the next generation of models, copilots, scribes, and more.</p>
<p><strong>Related Reading:</strong> 🧠 <a class="" href="https://www.fhirdocs.afiax.africa/docs/ai">AI Overview</a>, 🔌 <a class="" href="https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp">MCP Support</a>, 🩻 <a class="" href="https://www.fhirdocs.afiax.africa/blog/radai-case-study">Rad AI Case Study</a>, 👶 <a class="" href="https://www.fhirdocs.afiax.africa/blog/summer-case-study">Summer Health Case Study</a>, 📡 <a class="" href="https://www.fhirdocs.afiax.africa/docs/fhircast">FHIRcast</a>, ⚡ <a class="" href="https://www.fhirdocs.afiax.africa/docs/bots/consuming-webhooks">Async Bots and SSE</a></p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="key-themes-for-2026">Key Themes for 2026<a href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap#key-themes-for-2026" class="hash-link" aria-label="Direct link to Key Themes for 2026" title="Direct link to Key Themes for 2026" translate="no">​</a></h3>
<p>To summarize, our 2026 priorities center around three key themes:</p>
<ol>
<li class=""><strong>Regulatory Readiness</strong> - HITRUST certification and HTI-4 compliance to meet upcoming mandates</li>
<li class=""><strong>Scale &amp; Performance</strong> - Infrastructure investments to support enterprise-grade deployments</li>
<li class=""><strong>Developer Experience</strong> - Enhanced scheduling, billing, AI tooling, and plugins to accelerate development</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="join-the-movement">Join the Movement<a href="https://www.fhirdocs.afiax.africa/blog/2026-roadmap#join-the-movement" class="hash-link" aria-label="Direct link to Join the Movement" title="Direct link to Join the Movement" translate="no">​</a></h3>
<p>2026 will be a transformative year for healthcare technology, and Medplum is leading the charge. Whether you're a developer, healthcare provider, or innovator, there's never been a better time to join our growing community.</p>
<p>Stay tuned for more updates, and join us on <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">Discord</a> to be part of the conversation. We share quarterly progress updates and actively incorporate community feedback into our prioritization process. Your input directly shapes where we invest next.</p>]]></content>
        <author>
            <name>Cody Ebberson</name>
            <uri>https://github.com/codyebberson</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Medplum Year in Review 2025]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/2025-year-in-review-medplum</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/2025-year-in-review-medplum"/>
        <updated>2025-12-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[2025 in Review]]></summary>
        <content type="html"><![CDATA[<p><img decoding="async" loading="lazy" alt="2025 in Review" src="https://www.fhirdocs.afiax.africa/assets/images/2025-in-review-6d8ddeed047fb6dccdc8cc3d39ee8a11.png" width="2400" height="3936" class="img__Ss2"></p>
<p>An incredible year of growth, innovation, and community. From v5 release to expanding our developer ecosystem, 2025 marked several milestones for Medplum's open-source healthcare platform.</p>
<p>As we close out 2025, the Medplum team would love to thank our community and customers for joining us on this journey.</p>
<p>We wanted to highlight a few memorable moments and reflect on all that happened during the year. It was a lot of fun, and huge thank you to the team who pushed so hard to make all these things happen.</p>
<p>✅ Released <strong><a class="" href="https://www.fhirdocs.afiax.africa/blog/v5-release">Medplum v5</a></strong>, our most significant platform modernization to date, featuring full FHIR terminology validation, GraphQL Patch support, and comprehensive dependency upgrades to Node.js 22/24, PostgreSQL 14/18, and React 19</p>
<p>✅ Launched our <strong>new brand identity</strong>, reflecting our evolution as a leading open-source healthcare infrastructure platform.  See the details <a href="https://www.medplum.com/brand" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<p>✅ Hosted our first annual developer conference <strong><a class="" href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials">PlumCon 2025</a></strong> in San Francisco, bringing together healthcare innovators from around the world</p>
<p>✅ Delivered <strong>many new features and integrations</strong>, including enhanced AI capabilities with <a class="" href="https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp">MCP server support</a>, <a class="" href="https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations">custom FHIR operations</a>, <a class="" href="https://www.fhirdocs.afiax.africa/blog/ihe-ira-radiology-reporting">IHE IRA radiology reporting certification</a>, and expanded integrations with health information exchange, medications, and revenue cycle.</p>
<p>✅ A special thank you to those who contributed this year - we now have <strong>157 talented contributors</strong> from around the world building the future of healthcare together</p>
<p>✅ Incredible ecosystem growth: <strong>1,462 pull requests</strong>, <strong>55 releases</strong>, <strong>551 issues resolved</strong>, <strong>2.1K GitHub stars</strong>, and <strong>500K+ Docker downloads</strong> powering healthcare applications globally</p>
<p>✅ Added many wonderful customers, and several have made videos of their implementations. See <a href="https://www.medplum.com/case-studies" target="_blank" rel="noopener noreferrer" class="">case studies</a> and <a class="" href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#demo-showcase">PlumCon recap</a> for videos.</p>
<p>✅ Organized <strong><a class="" href="https://www.fhirdocs.afiax.africa/blog/events-calendar">several events</a></strong> throughout this year, including <a class="" href="https://www.fhirdocs.afiax.africa/blog/fhir-ai-for-life-sciences">FHIR + AI for Life Sciences</a>, <a class="" href="https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai">Scheduling Agents for Healthcare Operations</a>, and <a href="https://youtu.be/QvC093fAGGU" target="_blank" rel="noopener noreferrer" class="">Visualizing Patient Flow</a>, building our community of healthcare developers</p>
<p>Thank you, dear reader, for being part of our community. See you <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">on Discord</a>.</p>]]></content>
        <author>
            <name>Reshma Khilnani</name>
            <uri>https://github.com/reshmakh</uri>
        </author>
        <category label="integration" term="integration"/>
        <category label="fhir-datastore" term="fhir-datastore"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Terminology Service Updates in Medplum v5]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/v5-terminology</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/v5-terminology"/>
        <updated>2025-11-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[As part of the Medplum v5 release, we've been hard at work delivering several key improvements to our]]></summary>
        <content type="html"><![CDATA[<p>As part of the <a class="" href="https://www.fhirdocs.afiax.africa/blog/v5-release">Medplum v5 release</a>, we've been hard at work delivering several key improvements to our
<a href="https://hl7.org/fhir/R4/terminology-service.html" target="_blank" rel="noopener noreferrer" class="">FHIR Terminology Services</a>, which power Medplum's rich features for handling coded values:</p>
<ul>
<li class=""><a href="https://github.com/medplum/medplum/pull/7151" target="_blank" rel="noopener noreferrer" class="">Supporting synonyms</a> in <code>ValueSet/$expand</code>, allowing users to find codes by a number of different search terms</li>
<li class=""><a href="https://github.com/medplum/medplum/pull/7579" target="_blank" rel="noopener noreferrer" class="">Scaling our implementation</a> of the <code>ConceptMap/$translate</code> operation to handle maps with over a million entries</li>
<li class="">Updating our library of UMLS code systems with their <a href="https://www.nlm.nih.gov/research/umls/knowledge_sources/metathesaurus/release/notes.html" target="_blank" rel="noopener noreferrer" class="">latest release</a>, including several new code
systems around medications and supplements and a mapping between related code systems and RxNorm</li>
<li class="">A collection of <a href="https://github.com/medplum/medplum/pull/7010" target="_blank" rel="noopener noreferrer" class="">performance enhancements</a> that <a href="https://github.com/medplum/medplum/pull/7570" target="_blank" rel="noopener noreferrer" class="">speed up ValueSet expansion</a> and
<a href="https://github.com/medplum/medplum/pull/7571" target="_blank" rel="noopener noreferrer" class="">code validation</a> by a significant margin</li>
<li class="">(In beta) The option to <a href="https://github.com/medplum/medplum/pull/7666" target="_blank" rel="noopener noreferrer" class="">validate all required terminology bindings</a> in resources on write</li>
</ul>
<p>Below we'll discuss each of these changes in more detail and give examples of the features available in
Medplum's Terminology Services today.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="coding-synonyms">Coding Synonyms<a href="https://www.fhirdocs.afiax.africa/blog/v5-terminology#coding-synonyms" class="hash-link" aria-label="Direct link to Coding Synonyms" title="Direct link to Coding Synonyms" translate="no">​</a></h2>
<p>Many codes are known by multiple different related names or terms, and users may use different search terms in different
contexts when trying to find the right code for a clinical concept. For example, consider a provider populating
information about a patient allergy, who wants to fill in the <a href="https://hl7.org/fhir/R4/allergyintolerance-definitions.html#AllergyIntolerance.reaction.manifestation" target="_blank" rel="noopener noreferrer" class=""><code>AllergyIntolerance.reaction.manifestation</code> field</a>
with the SNOMED CT® code for hives using the <a href="https://hl7.org/fhir/R4/valueset-clinical-findings.html" target="_blank" rel="noopener noreferrer" class="">Clinical Findings ValueSet</a>. The relevant code in
SNOMED is <code>247472004</code>, but its display string is "Wheal (finding)" — not "hives"! If the user doesn't know the more
technical term, finding the correct code would be difficult.</p>
<p>Fortunately, most code systems record multiple names (synonyms) for their codes. These are stored as metadata properties
on the coding, which can be seen by <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/codesystem-lookup">looking up the code</a>:</p>
<div class="language-json codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-json codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Parameters"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"name"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SNOMED CT (US Edition)"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"display"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Wheal (finding)"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"property"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Hives"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"property"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Urticarial rash"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"property"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Welt"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"property"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Weal"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"property"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Nettle rash"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Medplum now supports searching against these synonyms in addition to the primary display string when searching with the
<code>filter</code> parameter of the <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/valueset-expand"><code>ValueSet/$expand</code> operation</a>. Specifically, any coding properties with a
special <a href="https://hl7.org/fhir/R4/codesystem-definitions.html#CodeSystem.property.uri" target="_blank" rel="noopener noreferrer" class=""><code>uri</code> value</a> of <code>http://hl7.org/fhir/concept-properties#synonym</code> will be indexed for search as a
synonym for the given code. The <code>SY</code> property shown above is defined in the corresponding <code>CodeSystem</code> resource:</p>
<div class="language-json codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-json codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"code"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"string"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"description"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Designated synonym"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Properties with this `uri` will have their values included when searching for codes</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"uri"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://hl7.org/fhir/concept-properties#synonym"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>You can see the feature working as intended below, using Medplum's <a href="https://storybook.medplum.com/?path=/story/medplum-codeableconceptinput--basic" target="_blank" rel="noopener noreferrer" class=""><code>&lt;CodeableConceptInput&gt;</code> React component</a>:</p>
<p><img decoding="async" loading="lazy" alt="A user types &amp;quot;hives&amp;quot; into a search field, and the corresponding SNOMED code is displayed" src="https://www.fhirdocs.afiax.africa/assets/images/hives-synonym-34d2fa076706ddb778416f1619ca017f.gif" width="1854" height="894" class="img__Ss2"></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="scalable-concept-mapping">Scalable Concept Mapping<a href="https://www.fhirdocs.afiax.africa/blog/v5-terminology#scalable-concept-mapping" class="hash-link" aria-label="Direct link to Scalable Concept Mapping" title="Direct link to Scalable Concept Mapping" translate="no">​</a></h2>
<p>Some of the largest code systems in common clinical use contain hundreds of thousands of different codes, and mappings
between them also operate on that scale. Our existing implementation of the <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/conceptmap-translate"><code>ConceptMap/$translate</code></a>
operation relied on the data present inside the <code>ConceptMap</code> JSON, which limited the number of mappings that could
be supported to the amount that would fit in a single resource.</p>
<p>To enable large mappings between complex code systems, we rebuilt our system for handling <code>ConceptMap</code> resources from
the ground up. Existing mappings contained in the resource JSON were indexed into an optimized lookup table, and we
added a new <code>ConceptMap/$import</code> endpoint similar to the <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/codesystem-import">one for CodeSystems</a> to facilitate loading
maps with a million entries or more into the system.</p>
<p>For example, we can query a large map of drugs from many different code systems to get their corresponding RxNorm code:</p>
<div class="language-bash codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-bash codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">$ curl -H "Authorization: Bearer $ACCESS_TOKEN" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  'https://api.medplum.com/fhir/R4/ConceptMap/$translate?url=$RXNORM&amp;system=http://snomed.info/sct&amp;code=9500005'</span><br></span></code></pre></div></div>
<div class="language-json codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-json codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"resourceType"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Parameters"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"parameter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"result"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueBoolean"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"match"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"part"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"equivalence"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"equivalent"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"concept"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"valueCoding"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"system"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"http://www.nlm.nih.gov/research/umls/rxnorm"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"code"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8123"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Our Postgres database is able to serve translations like this robustly, with a typical request executing in just
10 – 50 ms on our server! The ability to convert codes efficiently from one system to another is expected to be a
foundational capability for supporting cross-coding and partner integrations at scale in the future.</p>
<p>This development paves the way for us to support complex mappings between large, commonly-used code systems. Next on our
roadmap for this feature is to ingest the entire <a href="https://www.nlm.nih.gov/research/umls/mapping_projects/snomedct_to_icd10cm.html" target="_blank" rel="noopener noreferrer" class="">SNOMED to ICD-10</a> mapping and make it available to
customers for testing. This map is both large (~250,000 entries) and complex, containing dependency requirements and
descriptive notes that ensure codes are mapped correctly in context.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="updated-umls-library-with-2025aa-release">Updated UMLS Library with 2025AA Release<a href="https://www.fhirdocs.afiax.africa/blog/v5-terminology#updated-umls-library-with-2025aa-release" class="hash-link" aria-label="Direct link to Updated UMLS Library with 2025AA Release" title="Direct link to Updated UMLS Library with 2025AA Release" translate="no">​</a></h2>
<p>Medplum maintains a library of full code systems imported from the semiannual <a href="https://www.nlm.nih.gov/research/umls/knowledge_sources/metathesaurus/release/notes.html" target="_blank" rel="noopener noreferrer" class="">UMLS releases</a>, which
includes several widely-used systems like SNOMED CT, ICD-10, and LOINC. We've created an updated version of the library
from the latest release (2025AA), containing over 10,000 new codes and several new code systems:</p>
<ul>
<li class=""><a href="http://www.fdbhealth.com/fdb-medknowledge/" target="_blank" rel="noopener noreferrer" class="">FDB MedKnowledge</a></li>
<li class=""><a href="https://www.elsevier.com/solutions/drug-database" target="_blank" rel="noopener noreferrer" class="">Gold Standard Drug Database</a></li>
<li class=""><a href="http://www.fda.gov/ForIndustry/DataStandards/StructuredProductLabeling/default.htm" target="_blank" rel="noopener noreferrer" class="">FDA Structured Product Labels</a> for drugs and active substances</li>
<li class=""><a href="https://www2a.cdc.gov/vaccines/iis/iisstandards/vaccines.asp?rpt=mvx" target="_blank" rel="noopener noreferrer" class="">Manufacturers of Vaccines</a></li>
<li class=""><a href="https://www.nlm.nih.gov/mesh/" target="_blank" rel="noopener noreferrer" class="">Medical Subject Headings (MeSH)</a></li>
</ul>
<p>In tandem with the updates to scale <code>ConceptMap/$translate</code> described above, the mapping of several
<a href="https://www.nlm.nih.gov/research/umls/rxnorm/docs/techdoc.html#s3_1" target="_blank" rel="noopener noreferrer" class="">medication terminologies to RxNorm</a> was extracted from the UMLS data set. This ConceptMap,
containing about a quarter million mappings, was used as the foundation of our testing for the changes to <code>ConceptMap</code>.
The following code systems are currently mapped in whole or part to RxNorm via this resource:</p>
<ul>
<li class="">CVX (vaccines)</li>
<li class="">Gold Standard (drugs)</li>
<li class="">MeSH (drugs and substances subset)</li>
<li class="">FDA Structured Product Labels (drugs)</li>
<li class="">FDB MedKnowledge (drugs)</li>
<li class="">SNOMED CT (drugs subset)</li>
</ul>
<p>Contact <a href="mailto:support@medplum.com" target="_blank" rel="noopener noreferrer" class="">support@medplum.com</a> for access to the updated 2025AA release resources, in either
our hosted cluster or your own self-hosted install.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="valueset-performance-improvements">ValueSet Performance Improvements<a href="https://www.fhirdocs.afiax.africa/blog/v5-terminology#valueset-performance-improvements" class="hash-link" aria-label="Direct link to ValueSet Performance Improvements" title="Direct link to ValueSet Performance Improvements" translate="no">​</a></h2>
<p>Expanding a ValueSet to find matching codes is the most common terminology operation on Medplum: every time a user
uses an autocomplete to fill in a coded value, the relevant ValueSet definition is being queried and filtered to provide
them with a list of matching options. However, the database queries to power the autocomplete expansion can and often
do contain complicated recursive joins in combination with text filters to find all the correct codes. While working on
some of the other features listed here, we noticed a few ways to improve the relevant SQL queries. We were able to
significantly boost performance across multiple terminology operations by combining a few different optimizations:</p>
<ol>
<li class="">Improving index usage for text filters</li>
<li class="">Updating indexes on coding properties</li>
<li class="">Preloading property IDs to eliminate a JOIN</li>
</ol>
<p>By replacing conditions of the form <code>LOWER(display) LIKE '%filtertext%'</code> with the equivalent <code>display ILIKE '%filtertext%'</code>,
we enabled better use of existing indexes in our lookup tables and made text search in <code>ValueSet/$expand</code> more efficient.</p>
<p>Since many terminology queries also involve property metadata (for example, to determine whether one code is a child of
another), optimizing that part of our database queries had the potential to impact multiple different operations including
code validation. With a combination of minor changes to our query structure, and updates to our lookup table indexes,
we were able to make these queries up to 20x faster!</p>
<p>The effect these changes had was dramatic: the median latency for our <code>ValueSet/$expand</code> operation improved by 95%, as
shown below (endpoint latency in milliseconds):</p>
<p><strong>Before</strong></p>
<p><img decoding="async" loading="lazy" alt="Graph of endpoint latency with values around 450 ms" src="https://www.fhirdocs.afiax.africa/assets/images/vs-expand-before-dc6fd8ee12e69bf12f0883afefc0d0dc.png" width="1636" height="822" class="img__Ss2"></p>
<p><strong>After</strong></p>
<p><img decoding="async" loading="lazy" alt="Graph of endpoint latency with values under 50 ms" src="https://www.fhirdocs.afiax.africa/assets/images/vs-expand-after-288cc484d905600a31d45e4c02fd882b.png" width="1596" height="816" class="img__Ss2"></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="terminology-validation">Terminology Validation<a href="https://www.fhirdocs.afiax.africa/blog/v5-terminology#terminology-validation" class="hash-link" aria-label="Direct link to Terminology Validation" title="Direct link to Terminology Validation" translate="no">​</a></h2>
<p>Last but not least, we've finally unlocked a long-requested feature: validating all terminology requirements for
FHIR resources on write. Most resources contain some coded values, and the FHIR specification or a custom resource
profile can require that those values are drawn from a specific allowed set. Medplum server now includes the option to
check that any <code>required</code> <a href="https://hl7.org/fhir/R4/terminologies.html#binding" target="_blank" rel="noopener noreferrer" class="">terminology bindings</a> are satisfied in resources being written to the
server. Since this involves potentially tens of <a class="" href="https://www.fhirdocs.afiax.africa/docs/api/fhir/operations/valueset-validate-code">validation queries</a> to the terminology service per
resource, all the performance work we did over the past few months was instrumental in making it possible.</p>
<p>By enabling the <code>validate-terminology</code> feature for your Project, you can opt into the new validation process. It
provides assurance that your data is fully compliant with the FHIR specification, and maximizes the interoperability of
data stored in Medplum. This does come with a small performance cost to perform the validation, but we will be
continuing to monitor and optimize this functionality in the coming months.</p>
<p>If you're interested in helping us test out terminology validation in your development or staging Project, contact
<a href="mailto:support@medplum.com" target="_blank" rel="noopener noreferrer" class="">support@medplum.com</a> to have the feature enabled. If you operate a self-hosted cluster,
you will need to upgrade to Medplum v5 before the feature will be available.</p>]]></content>
        <author>
            <name>Matt Willer</name>
            <uri>https://github.com/mattwiller</uri>
        </author>
        <category label="fhir-datastore" term="fhir-datastore"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Scheduling Agents for Healthcare Operations: A Deep Dive with Unity AI]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai"/>
        <updated>2025-11-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Slideshow: View Presentation]]></summary>
        <content type="html"><![CDATA[<div class="responsive-iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/pbiJRr1GxDo" title="Scheduling Agents for Healthcare Operations: A Deep Dive with Unity AI" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe></div>
<p><em>Slideshow: <a href="https://drive.google.com/file/d/1t4h8IthpimQlayRz6j5lyOuuMpYFHT0b/view?usp=sharing" target="_blank" rel="noopener noreferrer" class="">View Presentation</a></em></p>
<p>This is a transcript summary of the October 2025 webinar with Medplum and Unity AI.  Medplum CEO Reshma Khilnani interviews Unity AI CTO <a href="https://www.unityai.co/about/our-team" target="_blank" rel="noopener noreferrer" class="">Cody Hall</a>.</p>
<p><strong>Reshma:</strong> We recently hosted a webinar exploring the intersection of AI, healthcare operations, and open-source infrastructure. I was joined by Cody Hall, CTO and Co-Founder of Unity AI, to discuss how his team is solving one of healthcare's <strong>most persistent bottlenecks</strong>: scheduling, using AI Agents.</p>
<p><strong>Reshma:</strong> At Medplum, we often talk about the "terrible choice" healthcare developers face: invest heavily to build from scratch or fight with rigid, off-the-shelf software. Unity AI demonstrates <strong>a third path</strong>—building exceptional products on top of pre-built primitives. Here is a recap of how Unity AI is using Medplum and <code>FHIR</code> to coordinate scarce resources.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-core-problem-coordination-and-scarcity">The Core Problem: Coordination and Scarcity<a href="https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai#the-core-problem-coordination-and-scarcity" class="hash-link" aria-label="Direct link to The Core Problem: Coordination and Scarcity" title="Direct link to The Core Problem: Coordination and Scarcity" translate="no">​</a></h2>
<p><strong>Cody:</strong> Healthcare operations are fundamentally about <strong>the coordination of scarce resources</strong>—staff, equipment time, and physical space. While clinical algorithms for treatment are well-established, the logistics of getting the right patient to the right place at the right time remains a massive challenge.</p>
<div class="responsive-iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/pbiJRr1GxDo?start=740" title="Complex Scheduling Solutions" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe></div>
<p><strong>Cody:</strong> Currently, this coordination is driven by <strong>human-to-human negotiation</strong>. A scheduler might make ten phone calls to confirm a single appointment. If a patient doesn't pick up, that scheduler rarely has the time to immediately find a backfill. The result is unused capacity, lost revenue for the clinic, and, most importantly, delayed care for patients.</p>
<p><strong>Cody:</strong> Our thesis is that voice agents represent a solution to this communication constraint. Unlike humans, AI agents are <strong>infinitely scalable</strong>. They can react instantly to cancellations, reach more people simultaneously, and continuously work to fill schedule gaps.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-role-of-data-standardization-fhir">The Role of Data Standardization (FHIR)<a href="https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai#the-role-of-data-standardization-fhir" class="hash-link" aria-label="Direct link to The Role of Data Standardization (FHIR)" title="Direct link to The Role of Data Standardization (FHIR)" translate="no">​</a></h2>
<div class="responsive-iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/pbiJRr1GxDo?start=430" title="Data Standardization in Healthcare" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe></div>
<p><strong>Cody:</strong> Automation requires <strong>a high-fidelity representation of reality</strong>. Dr. Herbert Simon once said that decision-makers can "satisfice" by finding optimum solutions for a simplified world or satisfactory solutions for a more realistic world. <code>FHIR</code> allows us to find solutions for the realistic world because it lets us model complex relationships without oversimplifying.</p>
<p><strong>Cody:</strong> A practical example of this is the <code>RelatedPerson</code> resource in <code>FHIR</code>. In a pediatric context, the patient is rarely the person coordinating the appointment. For example, if a parent is scheduling dental cleanings for two children, do you treat this as two separate tasks and call the parent twice? Or do you query the <code>RelatedPerson</code> resource, identify that one contact manages both appointments, and <strong>consolidate the communication</strong>?</p>
<p><strong>Reshma:</strong> This is a really subtle but important point. At Medplum, we see this constantly with pediatrics and elder care on the platform. Noting down the <code>RelatedPerson</code> is critical for caregiver access. It is excellent to see an agent that actually <strong>respects this data model</strong> to reduce friction for the family.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="architecture-systems-of-action">Architecture: Systems of Action<a href="https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai#architecture-systems-of-action" class="hash-link" aria-label="Direct link to Architecture: Systems of Action" title="Direct link to Architecture: Systems of Action" translate="no">​</a></h2>
<div class="responsive-iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/pbiJRr1GxDo?start=900" title="Technical Architecture &amp; Tools" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe></div>
<p><strong>Cody:</strong> We use Medplum not just as a data store, but as a foundation for <strong>a "system of action."</strong> We model a confirmation request as a <code>FHIR</code> <code>Bundle</code> containing the <code>Appointment</code>, <code>Patient</code>, and <code>Organization</code>.</p>
<p><strong>Cody:</strong> Once that bundle hits our API, a subscription in Medplum triggers our application. We use a durable workflow engine to spin up a voice agent. That agent calls the patient, verifies identity (like checking Date of Birth), and confirms the slot. The agent then <strong>updates the <code>Task</code> and <code>Appointment</code> status in Medplum in real-time</strong>.</p>
<p><strong>Cody:</strong> Because Medplum handles the identity management and event-driven architecture, we can <strong>focus entirely on the logic of the scheduling agents</strong> rather than building boilerplate infrastructure.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-future-the-distributed-ehr">The Future: The Distributed EHR<a href="https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai#the-future-the-distributed-ehr" class="hash-link" aria-label="Direct link to The Future: The Distributed EHR" title="Direct link to The Future: The Distributed EHR" translate="no">​</a></h2>
<div class="responsive-iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/pbiJRr1GxDo?start=1150" title="Future of EHRs &amp; Scheduling" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe></div>
<p><strong>Cody:</strong> Historically, EHRs were monolithic systems like Magic MUMPS. If you needed a specific feature, you hoped your vendor built it. Today, we are moving toward composability. I see a future of <strong>"Distributed EHRs,"</strong> where Medplum acts as a headless backend allowing specialized vertical applications—like Unity AI for scheduling—to sit on top of a shared data layer.</p>
<p><strong>Reshma:</strong> We agree completely. We believe customization is required to be successful, and monolithic systems often fail to yield to specific workflows like infusion or complex radiology. The composability of this architecture allows for <strong>"best-of-breed" solutions</strong> to work together seamlessly through standard APIs.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="community-qa-highlights">Community Q&amp;A Highlights<a href="https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai#community-qa-highlights" class="hash-link" aria-label="Direct link to Community Q&amp;A Highlights" title="Direct link to Community Q&amp;A Highlights" translate="no">​</a></h2>
<div class="responsive-iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/pbiJRr1GxDo?start=1920" title="Q&amp;A" session="" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe></div>
<p><strong>Cody:</strong> During the Q&amp;A, we discussed how referrals are handled. In our system, referrals are modeled as a <code>ServiceRequest</code>. We pick up that request and generate the downstream communication workflows to ensure the patient is scheduled, <strong>closing the loop between providers</strong>.</p>
<p><strong>Reshma:</strong> We also discussed the role of Bots. In Medplum, <strong>Bots effectively act as server-side functions</strong>. Whether verifying insurance with a partner like Stedi or triggering a custom workflow, Bots provide the logic layer that connects static data to active processes.</p>
<p><strong>Cody:</strong> Finally, regarding data storage, the consensus is to <strong>keep data in <code>FHIR</code> whenever possible</strong>. While there is always a temptation to use a separate SQL database for app-specific config, keeping data in <code>FHIR</code> ensures interoperability and allows for powerful graph queries via <code>GraphQL</code> across the entire patient context.</p>
<hr>
<p><em>To learn more about Unity AI, visit <a href="https://unityai.com/" target="_blank" rel="noopener noreferrer" class="">UnityAI.com</a>.</em></p>]]></content>
        <author>
            <name>Cody Hall</name>
            <uri>https://github.com/codyhall</uri>
        </author>
        <category label="community" term="community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Medplum v5 is Released]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/v5-release</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/v5-release"/>
        <updated>2025-10-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We are pleased to announce the Release of Medplum v5, the next major version of the open source healthcare developer platform.]]></summary>
        <content type="html"><![CDATA[<p>We are pleased to announce the <strong>Release of Medplum v5</strong>, the next major version of the open source healthcare developer platform.</p>
<p>As outlined in our <a class="" href="https://www.fhirdocs.afiax.africa/blog/preparing-for-v5">preparatory post in May</a>, Medplum v5 represents a comprehensive and necessary modernization of our core stack. This release ensures our platform maintains the highest standards of <strong>performance, security, and developer experience</strong> by aligning with the latest stable versions of our critical runtime and tooling dependencies.</p>
<p>As with all major releases, our goal is to provide a <strong>stable, predictable, and future-proof</strong> platform for building healthcare solutions.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="core-platform-modernization">Core Platform Modernization<a href="https://www.fhirdocs.afiax.africa/blog/v5-release#core-platform-modernization" class="hash-link" aria-label="Direct link to Core Platform Modernization" title="Direct link to Core Platform Modernization" translate="no">​</a></h2>
<p>The bulk of the work in v5 involved essential dependency upgrades and technical debt reduction.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="runtime-and-infrastructure">Runtime and Infrastructure<a href="https://www.fhirdocs.afiax.africa/blog/v5-release#runtime-and-infrastructure" class="hash-link" aria-label="Direct link to Runtime and Infrastructure" title="Direct link to Runtime and Infrastructure" translate="no">​</a></h3>
<p>Medplum v5 now requires and is rigorously tested against modern runtime environments:</p>
<ul>
<li class=""><strong>Node.js</strong>: We have deprecated Node 20 and now continuously test on <strong>Node 22 and 24</strong>. This upgrade enables access to the latest JavaScript features and performance improvements, including Node 22's Maglev compiler.</li>
<li class=""><strong>PostgreSQL</strong>: We have ended support for Postgres 13 and now continuously test on <strong>Postgres 14 and 18</strong>. Users benefit from major database performance features, such as Postgres 18's asynchronous I/O subsystem.</li>
<li class=""><strong>Redis</strong>: Support for Redis 6 has been dropped; we now continuously test on <strong>Redis 7</strong>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="new-capabilities">New Capabilities<a href="https://www.fhirdocs.afiax.africa/blog/v5-release#new-capabilities" class="hash-link" aria-label="Direct link to New Capabilities" title="Direct link to New Capabilities" translate="no">​</a></h2>
<p>We are excited to release several major new features in Medplum v5:</p>
<ol>
<li class=""><strong>Full FHIR Terminology Validation</strong>. Medplum now includes comprehensive, built-in terminology support covering major code systems like <strong>SNOMED, ICD, CPT, and others</strong>. Crucially, this functionality also includes <strong>hierarchy support</strong> (e.g., "descendant of"). This advanced validation logic contributes directly to better <strong>data hygiene</strong>, improves <strong>data quality</strong>, and increases confidence in the integrity of the data managed by the Medplum platform.</li>
<li class=""><strong>FHIR GraphQL Patch support</strong>. The Medplum GraphQL API now supports <strong>FHIR Patch operations</strong>, enabling more efficient and flexible updates to FHIR resources via GraphQL mutations. This enhancement allows developers to perform partial updates, reducing payload sizes and improving performance for applications that require frequent resource modifications.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="frontend-and-developer-tooling">Frontend and Developer Tooling<a href="https://www.fhirdocs.afiax.africa/blog/v5-release#frontend-and-developer-tooling" class="hash-link" aria-label="Direct link to Frontend and Developer Tooling" title="Direct link to Frontend and Developer Tooling" translate="no">​</a></h3>
<p>We have streamlined the frontend stack to improve build times, component quality, and overall developer experience:</p>
<ul>
<li class=""><strong>React</strong>: We've dropped support for React 18 and <strong>now require React 19</strong>, which simplifies our component maintenance moving forward.</li>
<li class=""><strong>UI Components</strong>: Upgraded all usage from <strong>Mantine v7 to v8</strong>, which features improved date handling and enhanced TypeScript support.</li>
<li class=""><strong>Core Frameworks</strong>: Successfully upgraded <strong>Express from v4 to v5</strong> and <strong>Storybook from v8 to v9</strong>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="strategic-update-esm-by-default">Strategic Update: ESM by Default<a href="https://www.fhirdocs.afiax.africa/blog/v5-release#strategic-update-esm-by-default" class="hash-link" aria-label="Direct link to Strategic Update: ESM by Default" title="Direct link to Strategic Update: ESM by Default" translate="no">​</a></h2>
<p>A key architectural shift in v5 is the move to <strong>ES Modules (ESM) by default</strong>.</p>
<p>This aligns Medplum with the modern JavaScript module standard, offering benefits like improved tree-shaking and better future compatibility. For a smooth transition, we will <strong>dual-publish certain SDK packages as CJS+ESM</strong>. We strongly recommend that all custom applications migrate to ESM for optimal compatibility and performance moving forward.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="planning-your-migration-breaking-changes">Planning Your Migration (Breaking Changes)<a href="https://www.fhirdocs.afiax.africa/blog/v5-release#planning-your-migration-breaking-changes" class="hash-link" aria-label="Direct link to Planning Your Migration (Breaking Changes)" title="Direct link to Planning Your Migration (Breaking Changes)" translate="no">​</a></h2>
<p>Medplum v5 includes a few minor breaking changes, primarily involving the deprecation of long-standing features and updates to API signatures for better consistency and modern patterns.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="api-and-sdk-changes">API and SDK Changes<a href="https://www.fhirdocs.afiax.africa/blog/v5-release#api-and-sdk-changes" class="hash-link" aria-label="Direct link to API and SDK Changes" title="Direct link to API and SDK Changes" translate="no">​</a></h3>
<table><thead><tr><th>Old Feature/Component</th><th>New Feature/Component</th><th>Note</th></tr></thead><tbody><tr><td>Non-standard usage of <code>?param:in=...</code> and <code>?param:not-in=...</code></td><td><strong>Strict FHIR compliance</strong></td><td>Invalid usage of the <code>:in</code> and <code>:not-in</code> search modifiers now <strong>throws an error</strong>. For simple inclusion checks, <strong>remove the modifier</strong>: <code>Patient?_id=uuid1,uuid2</code>.</td></tr><tr><td><code>PasswordChangeRequest</code> resource</td><td><code>UserSecurityRequest</code> resource</td><td><code>PasswordChangeRequest</code> was deprecated for over a year; <code>UserSecurityRequest</code> is a superset of its functionality.</td></tr><tr><td><code>Hl7Server.start</code> and <code>Hl7Server.stop</code> methods</td><td>Same methods, now <strong>async</strong></td><td>These methods must now be used with <code>await</code> or promise chains.</td></tr><tr><td><code>ProjectSecret</code> type definition</td><td><code>ProjectSetting</code> type</td><td>Use the <code>ProjectSetting</code> type instead.</td></tr><tr><td><code>MemoizedSearchControl</code> React component</td><td><code>SearchControl</code> React component</td><td>Use the standard component directly.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="infrastructure-changes">Infrastructure Changes<a href="https://www.fhirdocs.afiax.africa/blog/v5-release#infrastructure-changes" class="hash-link" aria-label="Direct link to Infrastructure Changes" title="Direct link to Infrastructure Changes" translate="no">​</a></h3>
<ul>
<li class=""><strong>AWS Container Insights</strong>: Updated from v1 to <strong>Container Insights v2</strong>.</li>
<li class=""><strong>CloudWatch Logs for Audit Events</strong>: Audit logging now utilizes <strong>AWS FireLens log routing</strong> for improved log management.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-value-of-upgrading">The Value of Upgrading<a href="https://www.fhirdocs.afiax.africa/blog/v5-release#the-value-of-upgrading" class="hash-link" aria-label="Direct link to The Value of Upgrading" title="Direct link to The Value of Upgrading" translate="no">​</a></h2>
<p>While a major version upgrade requires planning, Medplum v5 delivers concrete benefits that justify the effort:</p>
<ul>
<li class=""><strong>Performance</strong>: Immediate and substantial performance gains across the stack, from the database and runtime to frontend tooling.</li>
<li class=""><strong>Security</strong>: Access to the latest security features and patches across all dependencies.</li>
<li class=""><strong>Future-Proofing</strong>: Setting your healthcare solutions on a stable, supported platform that is aligned with industry best practices.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="next-steps-for-self-hosted-customers">Next Steps for Self-Hosted Customers<a href="https://www.fhirdocs.afiax.africa/blog/v5-release#next-steps-for-self-hosted-customers" class="hash-link" aria-label="Direct link to Next Steps for Self-Hosted Customers" title="Direct link to Next Steps for Self-Hosted Customers" translate="no">​</a></h2>
<p>We encourage self-hosted customers to begin planning their upgrade immediately.</p>
<ul>
<li class="">Consult our detailed <strong>migration guides</strong> on the documentation site.</li>
<li class="">Schedule <strong>database and runtime environment upgrades</strong> with your DevOps team.</li>
<li class="">Review your custom application codebase for compatibility with newer dependencies and the breaking changes listed above.</li>
</ul>
<p>For technical questions or feedback, please join the conversation on <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">Discord</a> or submit issues on <a href="https://github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">GitHub</a>.</p>
<p>Medplum v5 is ready to power your next generation of healthcare applications.</p>]]></content>
        <author>
            <name>Cody Ebberson</name>
            <uri>https://github.com/codyebberson</uri>
        </author>
        <category label="release" term="release"/>
        <category label="self-host" term="self-host"/>
        <category label="fhir-datastore" term="fhir-datastore"/>
        <category label="integration" term="integration"/>
        <category label="compliance" term="compliance"/>
        <category label="auth" term="auth"/>
        <category label="community" term="community"/>
        <category label="performance" term="performance"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[HealthChain: A New Open Source Integration with Epic]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/healthchain</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/healthchain"/>
        <updated>2025-09-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We're excited to share a new open-source project from the community that addresses a common developer challenge: integrating with legacy healthcare systems. HealthChain, an open-source Python framework, makes it easier to connect AI/ML pipelines to healthcare systems.]]></summary>
        <content type="html"><![CDATA[<p>We're excited to share a new open-source project from the community that addresses a common developer challenge: integrating with legacy healthcare systems. <a href="https://dotimplement.github.io/HealthChain/" target="_blank" rel="noopener noreferrer" class="">HealthChain</a>, an open-source Python framework, makes it easier to connect AI/ML pipelines to healthcare systems.</p>
<p>This project is a perfect example of how the open-source community is tackling real-world problems. It was created by <a href="https://jenniferjiangkells.com/" target="_blank" rel="noopener noreferrer" class="">Jennifer Jiang-Kells</a>, an honorary researcher at the <a href="https://www.uclhospitals.brc.nihr.ac.uk/" target="_blank" rel="noopener noreferrer" class="">University College London Hospitals</a> (UCLH) NHS Foundation Trust, highlighting its roots in a premier healthcare institution.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="connecting-epic-to-medplum">Connecting Epic to Medplum<a href="https://www.fhirdocs.afiax.africa/blog/healthchain#connecting-epic-to-medplum" class="hash-link" aria-label="Direct link to Connecting Epic to Medplum" title="Direct link to Connecting Epic to Medplum" translate="no">​</a></h3>
<p>One of HealthChain's most useful examples is a "Note Reader" service that integrates <strong>Epic NoteReader</strong> with Medplum. This demo shows how to process clinical notes, extract data like billing codes, and map them to the FHIR format. This addresses a key pain point for developers who need to modernize data workflows without replacing their existing Epic infrastructure.</p>
<p>By connecting Epic NoteReader to a modern FHIR server like Medplum, this project demonstrates a practical, open-source solution for developers. It's a powerful tool for bridging the gap between legacy CDA systems and modern healthcare platforms.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="get-started">Get Started<a href="https://www.fhirdocs.afiax.africa/blog/healthchain#get-started" class="hash-link" aria-label="Direct link to Get Started" title="Direct link to Get Started" translate="no">​</a></h3>
<p>We encourage you to explore the project and see what's possible.</p>
<ul>
<li class="">HealthChain: <a href="https://dotimplement.github.io/HealthChain/" target="_blank" rel="noopener noreferrer" class="">https://dotimplement.github.io/HealthChain/</a></li>
<li class="">Clinical Coding Demo: <a href="https://dotimplement.github.io/HealthChain/cookbook/clinical_coding/" target="_blank" rel="noopener noreferrer" class="">https://dotimplement.github.io/HealthChain/cookbook/clinical_coding/</a></li>
</ul>]]></content>
        <author>
            <name>Cody Ebberson</name>
            <uri>https://github.com/codyebberson</uri>
        </author>
        <category label="fhir-datastore" term="fhir-datastore"/>
        <category label="security" term="security"/>
        <category label="auth" term="auth"/>
        <category label="community" term="community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[FHIR + AI for Life Sciences]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/fhir-ai-for-life-sciences</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/fhir-ai-for-life-sciences"/>
        <updated>2025-09-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello everyone,]]></summary>
        <content type="html"><![CDATA[<p>Hello everyone,</p>
<p>Thank you so much for joining us today for our FHIR and AI for Life Sciences webinar. It was great to see many familiar and new faces from the broader healthcare community.</p>
<p>We wanted to share the recording for anyone who missed it or who would like to check it out again!</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/akAtxHFPrX8" title="FHIR + AI for Life Sciences Webinar" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>
<p>Below are a number of the resources which we shared during the webinar for you to peruse!</p>
<p>Medplum:</p>
<ul>
<li class=""><a class="" href="https://www.fhirdocs.afiax.africa/docs">docs</a>, also <a href="https://cal.com/medplum/30min" target="_blank" rel="noopener noreferrer" class="">book demo</a> if you'd like a walk through</li>
<li class=""><a class="" href="https://www.fhirdocs.afiax.africa/docs/ai/mcp">mcp server</a>
<ul>
<li class=""><a class="" href="https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp">mcp backstory from Medplum CTO</a></li>
<li class=""><a href="https://youtu.be/y3gD7TQ-SM8" target="_blank" rel="noopener noreferrer" class="">mcp demo on YouTube</a></li>
</ul>
</li>
<li class=""><a href="https://github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">github</a></li>
<li class=""><a class="" href="https://www.fhirdocs.afiax.africa/docs/provider">provider app docs</a>
<ul>
<li class=""><a href="https://provider.medplum.com/" target="_blank" rel="noopener noreferrer" class="">login to hosted</a> provider app (you'll need a <a class="" href="https://www.fhirdocs.afiax.africa/docs/tutorials/register">Medplum account</a>)</li>
<li class=""><a href="https://github.com/medplum/medplum-provider" target="_blank" rel="noopener noreferrer" class="">provider app source code</a></li>
<li class="">bonus video - <a href="https://youtu.be/ZbxVopl8McI" target="_blank" rel="noopener noreferrer" class="">vibecoding EHRs</a> based on provider app</li>
</ul>
</li>
</ul>
<p>phenoml:</p>
<ul>
<li class=""><a href="https://developer.pheno.ml/" target="_blank" rel="noopener noreferrer" class="">docs</a>
<ul>
<li class=""><a href="https://developer.pheno.ml/docs/medical-codes" target="_blank" rel="noopener noreferrer" class="">Construe</a> is the med RAG API we discussed!</li>
</ul>
</li>
<li class=""><a href="https://github.com/PhenoML/phenoml-demos" target="_blank" rel="noopener noreferrer" class="">agent demos</a> (patient support program, illustrative agents in apps + notebook)</li>
<li class=""><a href="https://github.com/PhenoML/medplum-provider-lang2fhir" target="_blank" rel="noopener noreferrer" class="">phenoml integrated medplum provider app</a></li>
</ul>
<p>If you'll be in San Francisco for JPM in January 2026 please stay tuned for in-person workshops we'll be holding!</p>
<p>Thank you so much!</p>
<p>Reshma &amp; Kerry</p>]]></content>
        <author>
            <name>Kerry Weinberg</name>
            <uri>https://github.com/kerbearasaurus</uri>
        </author>
        <category label="community" term="community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Medplum Events Calendar]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/events-calendar</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/events-calendar"/>
        <updated>2025-09-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Upcoming]]></summary>
        <content type="html"><![CDATA[<h3 class="anchor anchorTargetStickyNavbar_SAay" id="upcoming">Upcoming<a href="https://www.fhirdocs.afiax.africa/blog/events-calendar#upcoming" class="hash-link" aria-label="Direct link to Upcoming" title="Direct link to Upcoming" translate="no">​</a></h3>
<table><thead><tr><th>When</th><th>Topic</th><th>Location</th><th>Featuring</th></tr></thead><tbody><tr><td style="white-space:nowrap">Jan 12, 2026, 4:00 PM - 7:00 PM PT</td><td><strong>New Year, New Regs - In Depth on HTI-4 and HTI-5 with Brendan Keeler and Medplum</strong></td><td><a href="https://luma.com/mfpcuryu" target="_blank" rel="noopener noreferrer" class="">Medplum, SF</a></td><td align="center"><img src="https://github.com/healthbjk.png" alt="Brendan Keeler" width="50" height="50" style="border-radius:50%"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/healthbjk" target="_blank" rel="noopener noreferrer" class="">Brendan Keeler</a>, <a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a></p></td></tr><tr><td style="white-space:nowrap">Jan 15, 2025, 9:00 AM - 2:00 PM PT</td><td><strong>Interactive Workshop FHIR+AI for Life Sciences</strong></td><td><a href="https://luma.com/a8odmqrk" target="_blank" rel="noopener noreferrer" class="">Medplum, SF</a></td><td align="center"><img src="https://github.com/kerbearasaurus.png" alt="Kerry Weinberg" width="50" height="50" style="border-radius:50%"><img src="https://github.com/reshmakh.png" alt="Reshma Khilnani" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/kerbearasaurus" target="_blank" rel="noopener noreferrer" class="">Kerry Weinberg</a>, <a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Reshma Khilnani</a></p></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="past-events">Past Events<a href="https://www.fhirdocs.afiax.africa/blog/events-calendar#past-events" class="hash-link" aria-label="Direct link to Past Events" title="Direct link to Past Events" translate="no">​</a></h3>
<table><thead><tr><th>When</th><th>Topic</th><th>Location</th><th>Featuring</th></tr></thead><tbody><tr><td style="white-space:nowrap">Dec 4, 2025, 10:00 AM PT</td><td><strong>Visualizing Patient Flow: A Blueprint Reference App for Healthcare IT</strong></td><td><a href="https://luma.com/a3ye1r18" target="_blank" rel="noopener noreferrer" class="">Zoom</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><img src="https://github.com/vintasoftware.png" alt="Vinta" width="50" height="50" style="border-radius:50%"></td></tr><tr><td style="white-space:nowrap">Nov 18, 2025, 8:00 AM PT</td><td><strong>FHIR Made Fast: Delivering Production-Ready Healthcare Apps in 12 Weeks with Medplum</strong></td><td><a href="https://youtu.be/4M4tG-7-AmQ" target="_blank" rel="noopener noreferrer" class="">YouTube</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum</a>, TechMagic</p></td></tr><tr><td style="white-space:nowrap">Oct 30, 2025, 10:00 AM PT</td><td><strong><a class="" href="https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai">Scheduling Agents for Healthcare Operations</a></strong></td><td><a class="" href="https://www.fhirdocs.afiax.africa/blog/scheduling-agents-unity-ai">Blog Post</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><p>Cody Hall from Unity AI, <a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a></p></td></tr><tr><td style="white-space:nowrap">Oct 22, 2025, 5:00 PM PT</td><td><strong>AI x Open source : Community evening with Hatchet, Medplum and SigNoz</strong></td><td><a href="https://luma.com/2w9p5qzn" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><img src="https://github.com/SigNoz.png" alt="SigNoz" width="50" height="50" style="border-radius:50%"><img src="https://github.com/hatchet-dev.png" alt="Hatchet" width="50" height="50" style="border-radius:50%"></td></tr><tr><td style="white-space:nowrap">Oct 8, 2025, 4:30 PM PT</td><td><strong>Healthcare Devs Open Source Happy Hour - #SFTechWeek</strong></td><td><a href="https://partiful.com/e/GfA7v1EsKiRPtBJwbXbV" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><img src="https://github.com/awell-health.png" alt="Awell Health" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum</a>, <a href="https://github.com/awell-health" target="_blank" rel="noopener noreferrer" class="">Awell</a>, <a href="https://x.com/Villi" target="_blank" rel="noopener noreferrer" class="">Villi Itchev</a></p></td></tr><tr><td style="white-space:nowrap">October 2025</td><td><strong>Healthcare Devs Open Source Happy Hour - #SFTechWeek</strong></td><td><a href="https://partiful.com/e/GfA7v1EsKiRPtBJwbXbV" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum" width="50" height="50" style="border-radius:50%"><img src="https://github.com/awell-health.png" alt="Awell Health" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum</a>, <a href="https://github.com/awell-health" target="_blank" rel="noopener noreferrer" class="">Awell</a>, <a href="https://x.com/Villi" target="_blank" rel="noopener noreferrer" class="">Villi Itchev</a></p></td></tr><tr><td style="white-space:nowrap">September 2025</td><td><strong><a class="" href="https://www.fhirdocs.afiax.africa/blog/fhir-ai-for-life-sciences">FHIR + AI for Life Sciences</a></strong></td><td><a href="https://luma.com/eo757i34" target="_blank" rel="noopener noreferrer" class="">Zoom</a></td><td align="center"><img src="https://github.com/reshmakh.png" alt="Reshma Khilnani" width="50" height="50" style="border-radius:50%"><img src="https://github.com/kerbearasaurus.png" alt="Kerry Weinberg" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Reshma Khilnani</a>, <a href="https://github.com/kerbearasaurus" target="_blank" rel="noopener noreferrer" class="">Kerry Weinberg</a></p></td></tr><tr><td style="white-space:nowrap">September 2025</td><td><strong>Infrastructure Tools for the Care Economy</strong></td><td><a href="https://luma.com/wj6ik7nc" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/reshmakh.png" alt="Reshma Khilnani" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Reshma Khilnani</a>, Pivotal Ventures</p></td></tr><tr><td style="white-space:nowrap">August 2025</td><td><strong><a class="" href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials">PlumCon 2025</a></strong></td><td><a href="https://luma.com/larg66wc" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum Team" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a></p></td></tr><tr><td style="white-space:nowrap">June 2025</td><td><strong>San Francisco Health Tech Meetup</strong></td><td><a href="https://luma.com/rtpbd80h" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum Team" width="50" height="50" style="border-radius:50%"><img src="https://github.com/healthtechnerds.png" alt="Health Tech Nerds" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a>, <a href="https://github.com/healthtechnerds" target="_blank" rel="noopener noreferrer" class="">Health Tech Nerds</a></p></td></tr><tr><td style="white-space:nowrap">July 2025</td><td><strong>San Francisco Health Tech Meetup</strong></td><td><a href="https://luma.com/kz1159r8" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum Team" width="50" height="50" style="border-radius:50%"><img src="https://github.com/healthtechnerds.png" alt="Health Tech Nerds" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a>, <a href="https://github.com/healthtechnerds" target="_blank" rel="noopener noreferrer" class="">Health Tech Nerds</a></p></td></tr><tr><td style="white-space:nowrap">January 2025</td><td><strong><a class="" href="https://www.fhirdocs.afiax.africa/blog/life-sciences-devtools">Medplum &amp; Flexpa: Devtools for research, commercialization and more in life sciences</a></strong></td><td><a href="https://luma.com/bonej6ih" target="_blank" rel="noopener noreferrer" class="">San Francisco</a></td><td align="center"><img src="https://github.com/medplum.png" alt="Medplum Team" width="50" height="50" style="border-radius:50%"><img src="https://github.com/flexpa.png" alt="Flexpa" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/medplum" target="_blank" rel="noopener noreferrer" class="">Medplum Team</a>, <a href="https://github.com/flexpa" target="_blank" rel="noopener noreferrer" class="">Flexpa</a></p></td></tr></tbody></table>]]></content>
        <author>
            <name>Reshma Khilnani</name>
            <uri>https://github.com/reshmakh</uri>
        </author>
        <category label="community" term="community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Our Journey with the OpenSSF]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/openssf</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/openssf"/>
        <updated>2025-09-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[At Medplum, our mission is to provide the open source developer platform for healthcare. We believe that open source is the best way to build secure and interoperable healthcare applications. However, with the rising concern over software supply chain attacks, we understand that being "open source" isn't enough; we need to actively prove our commitment to security.]]></summary>
        <content type="html"><![CDATA[<p>At Medplum, our mission is to provide the open source developer platform for healthcare. We believe that open source is the best way to build secure and interoperable healthcare applications. However, with the rising concern over software supply chain attacks, we understand that being "open source" isn't enough; we need to actively prove our commitment to security.</p>
<p>That's why a few months ago, we decided to ramp up our participation in the <a href="https://openssf.org/" target="_blank" rel="noopener noreferrer" class="">Open Source Security Foundation (OpenSSF)</a>. We're excited to share the progress we've made in two of their key programs: the Best Practices Badge and the Scorecard.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="openssf-best-practices">OpenSSF Best Practices<a href="https://www.fhirdocs.afiax.africa/blog/openssf#openssf-best-practices" class="hash-link" aria-label="Direct link to OpenSSF Best Practices" title="Direct link to OpenSSF Best Practices" translate="no">​</a></h3>
<p>The OpenSSF Best Practices Badge program provides a framework for open source projects to demonstrate that they follow security-related best practices. It's a comprehensive and detailed self-assessment that covers a wide range of topics, from secure development processes to vulnerability reporting.</p>
<p>We're incredibly proud to announce that the Medplum repository has achieved <strong>full "gold" status</strong>, the highest level a project can receive. This wasn't a simple task; it involved meticulously reviewing our processes and code to ensure we met every single requirement. You can view our full report <a href="https://www.bestpractices.dev/en/projects/10900" target="_blank" rel="noopener noreferrer" class="">here</a>. This achievement validates our foundational commitment to building secure and reliable software.</p>
<a href="https://www.bestpractices.dev/en/projects/10900" target="_blank"><img src="https://www.fhirdocs.afiax.africa/img/compliance/openssf-best-practices-screenshot.webp" alt="OpenSSF Best Practices screenshot" width="500"></a>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="openssf-scorecard">OpenSSF Scorecard<a href="https://www.fhirdocs.afiax.africa/blog/openssf#openssf-scorecard" class="hash-link" aria-label="Direct link to OpenSSF Scorecard" title="Direct link to OpenSSF Scorecard" translate="no">​</a></h3>
<p>While the Best Practices Badge is a self-assessment, the OpenSSF Scorecard is where the rubber truly meets the road. This automated tool analyzes your repository and verifies that your project actually adheres to critical security practices. When we first ran the Scorecard on our repository, the results were humbling. The tests are rigorous, and they don't hold back.</p>
<p>Over the past few months, we've worked tirelessly to improve our Scorecard results. We are proud to say that Medplum is now consistently scoring 9.5+ out of 10. We see this not as an endpoint, but as a continuous journey to push for a higher and higher score, ensuring our users can trust the security of our platform. You can see our current Scorecard results <a href="https://scorecard.dev/viewer/?uri=github.com/medplum/medplum" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<a href="https://scorecard.dev/viewer/?uri=github.com/medplum/medplum" target="_blank"><img src="https://www.fhirdocs.afiax.africa/img/compliance/openssf-scorecard-screenshot.webp" alt="OpenSSF Scorecard screenshot" width="500"></a>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="bigger-picture-why-this-matters">Bigger Picture: Why This Matters<a href="https://www.fhirdocs.afiax.africa/blog/openssf#bigger-picture-why-this-matters" class="hash-link" aria-label="Direct link to Bigger Picture: Why This Matters" title="Direct link to Bigger Picture: Why This Matters" translate="no">​</a></h3>
<p>Our journey with the OpenSSF programs is not just about our project; it's about the state of open source security as a whole. A recent paper, <a href="https://arxiv.org/pdf/2508.03856" target="_blank" rel="noopener noreferrer" class="">“An Analysis of Supply Chain Security in Research Software,”</a> highlights just how challenging this space is. The paper examines the Scorecard scores of 3,248 research software repositories, and the findings are eye opening.</p>
<p>The study found that the mean aggregate Scorecard score was <strong>3.5</strong>, indicating a massive potential for improvement across the majority of scanned repositories.</p>
<a href="https://arxiv.org/pdf/2508.03856" target="_blank"><img src="https://www.fhirdocs.afiax.africa/img/compliance/openssf-histogram.webp" alt="OpenSSF Scorecard histogram" width="500"></a>
<p>While these stats are a bit sobering, they underscore why our achievements with the Best Practices Badge and the high Scorecard rating are so important. They are a clear signal to our users and the community that we take supply chain security seriously and have gone above and beyond to build a platform that you can trust.</p>
<p>We will continue to be active participants in the OpenSSF community and programs, constantly striving to improve our security posture and contribute to a more secure open source ecosystem for everyone.</p>]]></content>
        <author>
            <name>Cody Ebberson</name>
            <uri>https://github.com/codyebberson</uri>
        </author>
        <category label="fhir-datastore" term="fhir-datastore"/>
        <category label="security" term="security"/>
        <category label="auth" term="auth"/>
        <category label="community" term="community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[PlumCon 2025 - Materials & Agenda]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials"/>
        <updated>2025-09-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[On August 28, 2025 Medplum hosted our first annual developer conference PlumCon in San Francisco. Thank you to everyone who attended and made this inaugural event such a success!]]></summary>
        <content type="html"><![CDATA[<p>On August 28, 2025 Medplum hosted our first annual <em>developer conference</em> PlumCon in San Francisco. Thank you to everyone who attended and made this inaugural event such a success!</p>
<p>Below you'll find slideshows and videos from each presentation, organized by talk. Most sections includes the speakers presentation and slides.  We also have a <a href="https://youtube.com/playlist?list=PLPLQMmn1jgVktVYV7wOFyx0aOhh3vg66k&amp;si=LDk7kKuEAnPQUOmX" target="_blank" rel="noopener noreferrer" class="">YouTube Playlist</a> available.</p>
<p>We also want to thank everyone who donated demos and demo videos to this event - we are thankful for our community.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="presentation-materials">Presentation Materials<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#presentation-materials" class="hash-link" aria-label="Direct link to Presentation Materials" title="Direct link to Presentation Materials" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="keynote-medplum-past-present-and-future">Keynote: Medplum Past, Present and Future<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#keynote-medplum-past-present-and-future" class="hash-link" aria-label="Direct link to Keynote: Medplum Past, Present and Future" title="Direct link to Keynote: Medplum Past, Present and Future" translate="no">​</a></h3>
<p><strong>Speaker:</strong> <a href="https://github.com/codyebberson" target="_blank" rel="noopener noreferrer" class="">Cody Ebberson</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/codyebberson.png" alt="Cody Ebberson" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://drive.google.com/file/d/13ChwHbf9S19kGL-kpheFBuR1ccjYQx3V/view?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Download Presentation</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="how-to-be-a-healthtech-hero-and-ship-apps-10x-faster">How to be a Healthtech Hero and Ship Apps 10x Faster<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#how-to-be-a-healthtech-hero-and-ship-apps-10x-faster" class="hash-link" aria-label="Direct link to How to be a Healthtech Hero and Ship Apps 10x Faster" title="Direct link to How to be a Healthtech Hero and Ship Apps 10x Faster" translate="no">​</a></h3>
<p><strong>Speaker:</strong> <a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/rahul1.png" alt="Rahul Agarwal" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://docs.google.com/presentation/d/19GQjsTZcoOLUC1mVKmecvnTz5mFRfcW3QpoU2iATGrs/edit?usp=sharing" target="_blank" rel="noopener noreferrer" class="">How to be a Healthtech Hero and Ship Apps 10x Faster</a><br>
<strong>Video:</strong> <a href="https://www.youtube.com/watch?v=lHhK9dxgl2A" target="_blank" rel="noopener noreferrer" class="">Watch Recording</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="fireside-chat-ai-in-production-in-healthcare">Fireside Chat: AI in Production in Healthcare<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#fireside-chat-ai-in-production-in-healthcare" class="hash-link" aria-label="Direct link to Fireside Chat: AI in Production in Healthcare" title="Direct link to Fireside Chat: AI in Production in Healthcare" translate="no">​</a></h3>
<p><strong>Speakers:</strong> <a href="https://github.com/matthewwoo" target="_blank" rel="noopener noreferrer" class="">Matthew Woo</a>, <a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Reshma Khilnani</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/matthewwoo.png" alt="Matthew Woo" width="80" height="80" style="border-radius:50%"><img src="https://github.com/reshmakh.png" alt="Reshma Khilnani" width="80" height="80" style="border-radius:50%"><div><p>Fireside chat was not recorded, but see more info and case study below.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="scaling-to-millions-of-patients">Scaling to Millions of Patients<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#scaling-to-millions-of-patients" class="hash-link" aria-label="Direct link to Scaling to Millions of Patients" title="Direct link to Scaling to Millions of Patients" translate="no">​</a></h3>
<p><strong>Speakers:</strong> <a href="https://github.com/mattlong" target="_blank" rel="noopener noreferrer" class="">Matt Long</a>, <a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/mattlong.png" alt="Matt Long" width="80" height="80" style="border-radius:50%"><img src="https://github.com/mattwiller.png" alt="Matt Willer" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://docs.google.com/presentation/d/1Ngktqoi8e5prNEq441O_OhVEJmgCDsMwrOQFWK9VLTQ/edit?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Scaling to Millions of Patients</a><br>
<strong>Video:</strong> <a href="https://www.youtube.com/watch?v=0ewuLinTDYQ" target="_blank" rel="noopener noreferrer" class="">Watch Recording</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="realtime-applications-fhircast-websockets-and-hl7v2">Realtime Applications: FHIRcast, Websockets and HL7v2<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#realtime-applications-fhircast-websockets-and-hl7v2" class="hash-link" aria-label="Direct link to Realtime Applications: FHIRcast, Websockets and HL7v2" title="Direct link to Realtime Applications: FHIRcast, Websockets and HL7v2" translate="no">​</a></h3>
<p><strong>Speakers:</strong> <a href="https://github.com/ThatOneBro" target="_blank" rel="noopener noreferrer" class="">Derrick Farris</a>, <a href="https://github.com/maddyli" target="_blank" rel="noopener noreferrer" class="">Maddy Li</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/ThatOneBro.png" alt="Derrick Farris" width="80" height="80" style="border-radius:50%"><img src="https://github.com/maddyli.png" alt="Maddy Li" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://docs.google.com/presentation/d/1H1JjwD78NB3HFZ7n3sruDHPY82RK0rsJVrJC0GUVY_E/edit?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Real-time Medical Applications for Developers</a><br>
<strong>Video:</strong> <a href="https://www.youtube.com/watch?v=PliSbKE9UNI" target="_blank" rel="noopener noreferrer" class="">Watch Recording</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="vibecoding-ehrs">Vibecoding EHRs<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#vibecoding-ehrs" class="hash-link" aria-label="Direct link to Vibecoding EHRs" title="Direct link to Vibecoding EHRs" translate="no">​</a></h3>
<p><strong>Speakers:</strong> <a href="https://github.com/kevinwadeshaw" target="_blank" rel="noopener noreferrer" class="">Kevin Shaw</a>, <a href="https://github.com/techdavidy" target="_blank" rel="noopener noreferrer" class="">David Yanez</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/kevinwadeshaw.png" alt="Kevin Shaw" width="80" height="80" style="border-radius:50%"><img src="https://github.com/techdavidy.png" alt="David Yanez" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://docs.google.com/presentation/d/1T_ErFaDrJrPG0Otr0I-l7iog-4Vy3RFvGHJQaMOHWqk/edit?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Vibe Coding EHRs</a><br>
<strong>Video:</strong> <a href="https://www.youtube.com/watch?v=ZbxVopl8McI" target="_blank" rel="noopener noreferrer" class="">Watch Recording</a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="healthcare-integrations">Healthcare Integrations<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#healthcare-integrations" class="hash-link" aria-label="Direct link to Healthcare Integrations" title="Direct link to Healthcare Integrations" translate="no">​</a></h3>
<p><strong>Speakers:</strong> <a href="https://github.com/ianplunkett" target="_blank" rel="noopener noreferrer" class="">Ian Plunkett</a>, <a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a></p>
<div style="display:flex;align-items:center;gap:1rem;margin-bottom:1rem"><img src="https://github.com/ianplunkett.png" alt="Ian Plunkett" width="80" height="80" style="border-radius:50%"><img src="https://github.com/rahul1.png" alt="Rahul Agarwal" width="80" height="80" style="border-radius:50%"><div><p><strong>Slides:</strong> <a href="https://docs.google.com/presentation/d/11bWfSQ5Gj8keLEdoDDYhjuHK-9_Mz-5nnwaMXrEqmrg/edit?usp=sharing" target="_blank" rel="noopener noreferrer" class="">What We Worry About So You Don't Have To</a><br>
<strong>Video:</strong> <a href="https://www.youtube.com/watch?v=hsBtH35vKzo" target="_blank" rel="noopener noreferrer" class="">Watch Recording</a></p></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="demo-showcase">Demo Showcase<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#demo-showcase" class="hash-link" aria-label="Direct link to Demo Showcase" title="Direct link to Demo Showcase" translate="no">​</a></h2>
<p>The following demos were provided by the community. Thank you so much to all teams who contributed videos.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="seen-health">Seen Health<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#seen-health" class="hash-link" aria-label="Direct link to Seen Health" title="Direct link to Seen Health" translate="no">​</a></h3>
<p><a href="https://www.dhcs.ca.gov/services/ltc/Pages/programofall-inclusivecarefortheelderly.aspx" target="_blank" rel="noopener noreferrer" class="">PACE</a> specific EHR with realtime collaboration features and multi-player chart editing and workflow.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/M9bw4l1-RN8?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="summer-health">Summer Health<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#summer-health" class="hash-link" aria-label="Direct link to Summer Health" title="Direct link to Summer Health" translate="no">​</a></h3>
<p>24/7 Pediatric care via SMS, built their CareOS on Medplum. Read the <a class="" href="https://www.fhirdocs.afiax.africa/blog/summer-case-study">case study</a>.  A live demo was showcased in the Fireside Chat.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/H2fJVYG8LvQ?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="rad-ai-omni-reporting">Rad AI Omni Reporting<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#rad-ai-omni-reporting" class="hash-link" aria-label="Direct link to Rad AI Omni Reporting" title="Direct link to Rad AI Omni Reporting" translate="no">​</a></h3>
<p>Realtime application shown in the Realtime Apps presentation. <a class="" href="https://www.fhirdocs.afiax.africa/blog/radai-case-study">More details here</a>.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/N5ZocZhdPZ0?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="progress-notes">Progress Notes<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#progress-notes" class="hash-link" aria-label="Direct link to Progress Notes" title="Direct link to Progress Notes" translate="no">​</a></h3>
<p>This psychotherapy EHR and scribe was created by one person, Dr. Wong - who is a clinician!  Large portions were vibecoded, and this video was showcased in the Vibecoding EHRs session.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/MleerRYHviQ?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="payer-data-exchange">Payer Data Exchange<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#payer-data-exchange" class="hash-link" aria-label="Direct link to Payer Data Exchange" title="Direct link to Payer Data Exchange" translate="no">​</a></h3>
<p>This app was created by <a class="" href="https://www.fhirdocs.afiax.africa/blog/flexpa-case-study">Flexpa</a> and showcases payer FHIR API network.  It was featured during the Happy Hour.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/DsdLq6DGi-0?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="clinical-trials-ai-charting-app">Clinical Trials AI Charting App<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#clinical-trials-ai-charting-app" class="hash-link" aria-label="Direct link to Clinical Trials AI Charting App" title="Direct link to Clinical Trials AI Charting App" translate="no">​</a></h3>
<p>A very cool Clinical Trials charting app created by the team at <a href="https://www.pheno.ml/" target="_blank" rel="noopener noreferrer" class="">PhenoML</a> was showcased at the Happy Hour.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/QXv3axkLbTE?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="develo-pediatric-ehr">Develo Pediatric EHR<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#develo-pediatric-ehr" class="hash-link" aria-label="Direct link to Develo Pediatric EHR" title="Direct link to Develo Pediatric EHR" translate="no">​</a></h3>
<p>A comprehensive <a class="" href="https://www.fhirdocs.afiax.africa/blog/develo-case-study">pediatric EHR</a> system built with Medplum, showcasing specialized workflows for pediatric care was showcased at the Happy Hour.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/Jk5jSEiBYbQ?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="awell-clinical-ops-automation">Awell Clinical Ops Automation<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#awell-clinical-ops-automation" class="hash-link" aria-label="Direct link to Awell Clinical Ops Automation" title="Direct link to Awell Clinical Ops Automation" translate="no">​</a></h3>
<p>Clinical operations automation platform built with Medplum, streamlining healthcare workflows and improving operational efficiency.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/tjOZt4RzVic?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="vibrant-ai-enabled-ehr">Vibrant AI Enabled EHR<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#vibrant-ai-enabled-ehr" class="hash-link" aria-label="Direct link to Vibrant AI Enabled EHR" title="Direct link to Vibrant AI Enabled EHR" translate="no">​</a></h3>
<p>AI-powered EHR system built with Medplum, featuring intelligent automation and enhanced clinical decision support.</p>
<div class="responsive-iframe-wrapper"><iframe src="https://www.youtube.com/embed/aZudzbHNmIE?start=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="plumcon-2025-photos">PlumCon 2025 Photos<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025-materials#plumcon-2025-photos" class="hash-link" aria-label="Direct link to PlumCon 2025 Photos" title="Direct link to PlumCon 2025 Photos" translate="no">​</a></h2>
<p>Some photos from the conference.</p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 7" src="https://www.fhirdocs.afiax.africa/assets/images/plumcon-2025-7-6bf5e335134a75e228c1a8d5ef462a47.jpg" width="4080" height="3072" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 1" src="https://www.fhirdocs.afiax.africa/assets/images/plumcon-2025-1-950c3ed893e72a38f58018276ee8a1cb.jpg" width="5712" height="4284" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 2" src="https://www.fhirdocs.afiax.africa/assets/images/plumcon-2025-2-9ef2917afff9d9877863cfa260a01fbb.jpg" width="3464" height="4618" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 3" src="https://www.fhirdocs.afiax.africa/assets/images/plumcon-2025-3-a0b9435b180f575554c1050267caf3c5.jpg" width="4032" height="3024" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 4" src="https://www.fhirdocs.afiax.africa/assets/images/plumcon-2025-4-93476dc76c59097c25d4c7777ebc3bd1.jpg" width="5712" height="4284" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 5" src="https://www.fhirdocs.afiax.africa/assets/images/plumcon-2025-5-10572139136555353f498787baa3bd74.jpg" width="5712" height="4284" class="img__Ss2"></p>
<p><img decoding="async" loading="lazy" alt="Plumcon photo 6" src="https://www.fhirdocs.afiax.africa/assets/images/plumcon-2025-6-701982afad30f7bf8da8ab1201c42ff7.jpg" width="4032" height="3024" class="img__Ss2"></p>]]></content>
        <author>
            <name>Reshma Khilnani</name>
            <uri>https://github.com/reshmakh</uri>
        </author>
        <category label="community" term="community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Medplum Certifies IRA]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/ihe-ira-radiology-reporting</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/ihe-ira-radiology-reporting"/>
        <updated>2025-07-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Medplum has become one of the first platforms to achieve certification for the Hub role in the Integrated Reporting Applications (IRA) IHE Profile, marking a milestone in radiology workflow interoperability. This certification positions Medplum as a central orchestrator for real-time synchronization between radiology applications, addressing one of healthcare's most persistent challenges: fragmented diagnostic workflows.]]></summary>
        <content type="html"><![CDATA[<p>Medplum has become one of the first platforms to achieve certification for the <strong>Hub role</strong> in the Integrated Reporting Applications (IRA) IHE Profile, marking a milestone in radiology workflow interoperability. This certification positions Medplum as a central orchestrator for real-time synchronization between radiology applications, addressing one of healthcare's most persistent challenges: fragmented diagnostic workflows.</p>
<p>The IRA profile, published in October 2023 by Integrating the Healthcare Enterprise (IHE), represents a <strong>transformative approach</strong> to radiology interoperability. Built on <a class="" href="https://www.fhirdocs.afiax.africa/docs/fhircast">FHIRcast</a> 3.0.0 and FHIR R5 standards, IRA enables different applications—from PACS systems to AI tools—to share context and content seamlessly during diagnostic reporting. For Medplum, certification as a FHIRcast Hub means our platform can now coordinate complex radiology workflows where multiple applications must work together in harmony.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-radiology-workflow-challenge-ira-solves">The Radiology Workflow Challenge IRA Solves<a href="https://www.fhirdocs.afiax.africa/blog/ihe-ira-radiology-reporting#the-radiology-workflow-challenge-ira-solves" class="hash-link" aria-label="Direct link to The Radiology Workflow Challenge IRA Solves" title="Direct link to The Radiology Workflow Challenge IRA Solves" translate="no">​</a></h2>
<p>Today's radiologists navigate <strong>disconnected systems</strong> during their daily work. A typical workflow involves juggling between three to five applications simultaneously: PACS for image viewing, RIS for patient scheduling, dictation systems for reporting, and increasingly, AI tools for analysis/reporting. Each system operates in isolation, requiring manual synchronization that costs radiologists 1-2 minutes per patient—time that adds up to significant productivity losses across thousands of daily studies.</p>
<p>Manual data entry between systems introduces errors, while the <strong>cognitive burden</strong> of constant context switching contributes to radiologist burnout.</p>
<p>IRA addresses these challenges through <strong>intelligent application synchronization</strong>. When a radiologist opens a chest CT in their PACS system, IRA automatically synchronizes the reporting application, AI tools, and any other connected systems to the same patient and study. This seemingly simple capability eliminates thousands of manual clicks daily while dramatically reducing the risk of context-related errors.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="understanding-iras-technical-architecture">Understanding IRA's Technical Architecture<a href="https://www.fhirdocs.afiax.africa/blog/ihe-ira-radiology-reporting#understanding-iras-technical-architecture" class="hash-link" aria-label="Direct link to Understanding IRA's Technical Architecture" title="Direct link to Understanding IRA's Technical Architecture" translate="no">​</a></h2>
<p>At its core, IRA leverages <strong>FHIRcast</strong>, a modern publish-subscribe protocol designed for real-time healthcare application communication. As the certified Hub, Medplum serves as the central nervous system for radiology workflows, managing multiple concurrent sessions and ensuring all connected applications stay synchronized.</p>
<p>The profile defines <strong>five key actors</strong> in the radiology ecosystem. Image Display applications present studies for diagnostic review. Report Creators handle dictation and structured reporting. Content Creators generate clinical evidence like measurements and annotations. Evidence Creators perform advanced visualization and AI analysis. The Hub—Medplum's certified role—orchestrates communication between all these actors through standardized events.</p>
<!-- -->
<p>Four primary events drive the <strong>synchronization workflow</strong>. <code>DiagnosticReport-open</code> fires when a radiologist selects a study, establishing the anchor context for all connected applications. <code>DiagnosticReport-update</code> shares clinical content like measurements or AI findings across the ecosystem. <code>DiagnosticReport-select</code> indicates when specific content needs attention, enabling features like synchronized highlighting. <code>DiagnosticReport-close</code> cleanly terminates the session when reporting completes.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="how-fhircast-powers-real-time-synchronization">How FHIRcast Powers Real-Time Synchronization<a href="https://www.fhirdocs.afiax.africa/blog/ihe-ira-radiology-reporting#how-fhircast-powers-real-time-synchronization" class="hash-link" aria-label="Direct link to How FHIRcast Powers Real-Time Synchronization" title="Direct link to How FHIRcast Powers Real-Time Synchronization" translate="no">​</a></h2>
<p>FHIRcast provides the <strong>underlying communication infrastructure</strong> that makes IRA possible. Using WebSocket connections for real-time notifications and OAuth 2.0 for secure authentication, FHIRcast enables applications to subscribe to relevant workflow events and respond instantly to context changes.</p>
<p>The protocol distinguishes between <strong>driving applications</strong> that initiate context changes and subscribing applications that follow along. In a typical scenario, a PACS system acts as the driving application when a radiologist opens a study. The reporting system, AI tools, and advanced visualization applications subscribe to these events, automatically updating their context to match. This publish-subscribe model ensures all applications remain synchronized without requiring point-to-point integrations between each system.</p>
<p>Version control mechanisms using <code>context.versionId</code> and <code>context.priorVersionId</code> ensure events process in the <strong>correct sequence</strong>, even in distributed environments where network delays might otherwise cause synchronization issues. When synchronization errors occur, the protocol includes sophisticated error handling and recovery mechanisms, allowing applications to query the Hub for the latest context and self-correct.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="real-world-scenarios-enabled-by-ira">Real-World Scenarios Enabled by IRA<a href="https://www.fhirdocs.afiax.africa/blog/ihe-ira-radiology-reporting#real-world-scenarios-enabled-by-ira" class="hash-link" aria-label="Direct link to Real-World Scenarios Enabled by IRA" title="Direct link to Real-World Scenarios Enabled by IRA" translate="no">​</a></h2>
<p>The true power of IRA emerges in <strong>everyday radiology workflows</strong>. Consider a radiologist reviewing a complex oncology case requiring measurements across multiple imaging series. With IRA, measurements created in the PACS automatically appear in the reporting system as structured FHIR Observation resources. The radiologist can reference these measurements in their report without manual transcription, while the measurements remain linked to their precise anatomical locations for future reference.</p>
<p><strong>AI integration</strong> represents another transformative use case. When an AI algorithm detects a pulmonary nodule, it creates an ImagingSelection resource highlighting the specific region of concern. Through IRA's <code>DiagnosticReport-update</code> event, this finding immediately appears in both the PACS and reporting system. The radiologist sees the AI annotation overlaid on the image while simultaneously having access to quantitative measurements and confidence scores in their report template.</p>
<p>For interrupted workflows—a constant reality in busy radiology departments—IRA enables <strong>seamless suspend and resume</strong> capabilities. A radiologist called away for an urgent case can return later to find all applications automatically restored to the exact context where they left off. This session persistence eliminates the frustrating and error-prone process of manually reopening studies and relocating specific findings across multiple systems.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="medplums-unique-position-in-healthcare-interoperability">Medplum's Unique Position in Healthcare Interoperability<a href="https://www.fhirdocs.afiax.africa/blog/ihe-ira-radiology-reporting#medplums-unique-position-in-healthcare-interoperability" class="hash-link" aria-label="Direct link to Medplum's Unique Position in Healthcare Interoperability" title="Direct link to Medplum's Unique Position in Healthcare Interoperability" translate="no">​</a></h2>
<p>Medplum's achievement of IRA Hub certification represents a <strong>natural evolution</strong> of our FHIR-native platform strategy. As an open-source platform released under Apache 2.0 license, through open source Medplum makes integrations possible that weren't before. The Medplum architecture combines the flexibility developers need with the compliance healthcare requires, including HIPAA compliance, SOC 2 Type 2 certification, and ONC certification for patient API services.</p>
<p>The Hub certification adds a <strong>critical capability</strong> to Medplum's platform: the ability to orchestrate complex, multi-vendor radiology workflows. Unlike traditional integration approaches requiring custom interfaces between each application pair, Medplum's IRA Hub provides a standards-based switchboard that any compliant application can connect to. This dramatically reduces integration complexity while enabling true plug-and-play interoperability between best-of-breed radiology solutions.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-big-picture">The Big Picture<a href="https://www.fhirdocs.afiax.africa/blog/ihe-ira-radiology-reporting#the-big-picture" class="hash-link" aria-label="Direct link to The Big Picture" title="Direct link to The Big Picture" translate="no">​</a></h2>
<p>IRA represents more than incremental improvement—it's a <strong>fundamental reimagining</strong> of how radiology applications interact. As the profile matures from experimental status to production readiness over the next 2-3 years, we can expect transformative changes in radiology workflows.</p>
<p><strong>Radiology has always been a bellwether</strong> in healthcare IT, early to adopt digital systems, scribing technologies, and AI use cases. This type of real-time event context synchronization is emblematic of what scribes will need in the future as healthcare workflows become more complex and AI-driven.</p>
<p>Near-term developments will focus on <strong>stabilizing the underlying</strong> FHIRcast 3.0.0 specification and incorporating feedback from early implementations. As more vendors achieve certification, the network effects will accelerate adoption—each new IRA-compliant application increases the value proposition for all participants in the ecosystem.</p>
<p>The convergence of IRA with related IHE profiles promises <strong>even greater capabilities</strong>. The AI Workflow for Imaging (AIW-I) profile standardizes how AI algorithms integrate into diagnostic workflows. The AI Results (AIR) profile defines how AI findings are stored and communicated. Together with IRA, these profiles create a comprehensive framework for intelligent, AI-augmented radiology workflows where human expertise and machine analysis seamlessly combine.</p>
<p>Looking further ahead, IRA lays the groundwork for <strong>autonomous reporting systems</strong> where AI generates preliminary reports that save radiologists time and busy work. Real-time quality assurance could flag potential errors before reports are finalized. Predictive analytics might optimize workflow routing based on case complexity and radiologist expertise. These advances all depend on the real-time, standards-based interoperability that IRA enables.</p>
<p>For radiology departments struggling with fragmented workflows and disconnected systems, <strong>IRA offers a standards-based path</strong> forward. For vendors building next-generation radiology applications, Medplum's certified Hub provides the interoperability infrastructure needed to participate in modern, integrated workflows. For radiologists themselves, IRA promises workflows where technology enhances rather than hinders their ability to provide excellent patient care.</p>
<p>As healthcare continues its digital transformation, <strong>standards like IRA</strong> and platforms like Medplum that embrace them will prove essential. The future of radiology lies not in monolithic, single-vendor solutions, but in ecosystems of specialized, interoperable applications working in concert. With IRA Hub certification, Medplum has positioned itself at the center of this transformation, ready to enable the next generation of radiology workflows.</p>
<p><img decoding="async" loading="lazy" alt="IRA Certification" src="https://www.fhirdocs.afiax.africa/assets/images/ihe-ira-5fea2cf932cef8852f62eb1ad107753a.png" width="600" height="464" class="img__Ss2"></p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="related-reading">Related Reading<a href="https://www.fhirdocs.afiax.africa/blog/ihe-ira-radiology-reporting#related-reading" class="hash-link" aria-label="Direct link to Related Reading" title="Direct link to Related Reading" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://drive.google.com/file/d/13GSEGd5pXSn9M8gN8skKpwPRUIuLTz3U/view?usp=sharing" target="_blank" rel="noopener noreferrer" class="">Medplum IRA Seal as PDF</a></li>
<li class=""><a href="https://profiles.ihe.net/RAD/IRA/" target="_blank" rel="noopener noreferrer" class="">IHE Integrated Reporting Applications (IRA) Profile</a></li>
<li class=""><a href="https://fhircast.org/" target="_blank" rel="noopener noreferrer" class="">FHIRcast Specification</a></li>
<li class=""><a href="https://www.agfahealthcare.com/news/connectathon-2024/" target="_blank" rel="noopener noreferrer" class="">AGFA HealthCare IHE 2024 Connectathon Results</a></li>
<li class=""><a href="https://www.radai.com/blogs/the-evolution-of-radiology-reporting-embracing-fhircast-for-seamless-integration" target="_blank" rel="noopener noreferrer" class="">Rad AI Evolution of Radiology Reporting</a></li>
<li class=""><a href="https://pubs.rsna.org/doi/abs/10.1148/radiol.232653" target="_blank" rel="noopener noreferrer" class="">RSNA AI Integration in Radiology Workflows</a></li>
<li class=""><a href="https://infocentral.infoway-inforoute.ca/en/forum/223-integrating-the-healthcare-enterprise-ihe/5987-register-today-ihe-north-america-connectathon-week-2025" target="_blank" rel="noopener noreferrer" class="">IHE North America Connectathon 2025</a></li>
<li class=""><a href="https://media.market.us/radiology-information-systems-market-news/" target="_blank" rel="noopener noreferrer" class="">Radiology Information Systems Market Analysis</a></li>
<li class=""><a href="https://www.gehealthcare.com/products/interoperability/ihe" target="_blank" rel="noopener noreferrer" class="">GE Healthcare IHE Interoperability</a></li>
</ul>]]></content>
        <author>
            <name>Derrick Farris</name>
            <uri>https://github.com/ThatOneBro</uri>
        </author>
        <category label="fhir-datastore" term="fhir-datastore"/>
        <category label="integration" term="integration"/>
        <category label="auth" term="auth"/>
        <category label="community" term="community"/>
        <category label="ai" term="ai"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[PlumCon 2025 - Agenda]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/plumcon-2025</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025"/>
        <updated>2025-07-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[On August 28, 2025 Medplum is hosting our first annual developer conference PlumCon in San Francisco. The conference is by invitation, but please email us at hello@medplum.com if you are interested. Here is the agenda.]]></summary>
        <content type="html"><![CDATA[<p>On August 28, 2025 Medplum is hosting our first annual <em>developer conference</em> PlumCon in San Francisco. The conference is by invitation, but please email us at <a href="mailto:hello@medplum.com?subject=PlumCon%202025%20Invite" target="_blank" rel="noopener noreferrer" class="">hello@medplum.com</a> if you are interested. Here is the agenda.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="morning-session">Morning Session<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025#morning-session" class="hash-link" aria-label="Direct link to Morning Session" title="Direct link to Morning Session" translate="no">​</a></h3>
<table><tbody><tr><td style="white-space:nowrap">9:00 AM</td><td><strong>Breakfast</strong></td><td></td></tr><tr><td style="white-space:nowrap">9:30 AM</td><td><strong>Keynote: Medplum Past, Present and Future</strong>  </td><td align="center"><img src="https://github.com/codyebberson.png" alt="Cody Ebberson" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/codyebberson" target="_blank" rel="noopener noreferrer" class="">Cody Ebberson</a></p></td></tr><tr><td style="white-space:nowrap">10:15 AM</td><td><strong>Implementation Speedrun: 5 Pro Tips to Ship Healthcare Apps 10x Faster</strong></td><td align="center"><img src="https://github.com/rahul1.png" alt="Rahul Agarwal" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a></p></td></tr><tr><td style="white-space:nowrap">10:30 AM</td><td><strong>Coffee Break</strong></td><td></td></tr><tr><td style="white-space:nowrap">10:45 AM</td><td><strong>Fireside Chat: AI in Production in Healthcare</strong></td><td align="center"><img src="https://github.com/matthewwoo.png" alt="Matthew Woo" width="50" height="50" style="border-radius:50%"><img src="https://github.com/reshmakh.png" alt="Reshma Khilnani" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/matthewwoo" target="_blank" rel="noopener noreferrer" class="">Matthew Woo</a>, <a href="https://github.com/reshmakh" target="_blank" rel="noopener noreferrer" class="">Reshma Khilnani</a></p></td></tr><tr><td style="white-space:nowrap">11:30 AM</td><td><strong>Scaling to Millions of Patients</strong></td><td align="center"><img src="https://github.com/mattlong.png" alt="Matt Long" width="50" height="50" style="border-radius:50%"><img src="https://github.com/mattwiller.png" alt="Matt Willer" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/mattlong" target="_blank" rel="noopener noreferrer" class="">Matt Long</a>, <a href="https://github.com/mattwiller" target="_blank" rel="noopener noreferrer" class="">Matt Willer</a></p></td></tr><tr><td style="white-space:nowrap">12:00 PM</td><td><strong>Lunch Break</strong></td><td></td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="afternoon-session">Afternoon Session<a href="https://www.fhirdocs.afiax.africa/blog/plumcon-2025#afternoon-session" class="hash-link" aria-label="Direct link to Afternoon Session" title="Direct link to Afternoon Session" translate="no">​</a></h3>
<table><tbody><tr><td style="white-space:nowrap">1:00 PM</td><td><strong>Realtime Applications: FHIRcast, Websockets and HL7v2</strong></td><td align="center"><img src="https://github.com/ThatOneBro.png" alt="Derrick Farris" width="50" height="50" style="border-radius:50%"><img src="https://github.com/maddyli.png" alt="Maddy Li" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/ThatOneBro" target="_blank" rel="noopener noreferrer" class="">Derrick Farris</a>, <a href="https://github.com/maddyli" target="_blank" rel="noopener noreferrer" class="">Maddy Li</a></p></td></tr><tr><td style="white-space:nowrap">1:40 PM</td><td><strong>Vibecoding EHRs</strong></td><td align="center"><img src="https://github.com/kevinwadeshaw.png" alt="Kevin Shaw" width="50" height="50" style="border-radius:50%"><img src="https://github.com/techdavidy.png" alt="David Yanez" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/kevinwadeshaw" target="_blank" rel="noopener noreferrer" class="">Kevin Shaw</a>, <a href="https://github.com/techdavidy" target="_blank" rel="noopener noreferrer" class="">David Yanez</a></p></td></tr><tr><td style="white-space:nowrap">2:00 PM</td><td><strong>Stretch Break</strong></td><td></td></tr><tr><td style="white-space:nowrap">2:20 PM</td><td><strong>Orders, Medications and Transactions</strong></td><td align="center"><img src="https://github.com/ianplunkett.png" alt="Ian Plunkett" width="50" height="50" style="border-radius:50%"><img src="https://github.com/rahul1.png" alt="Rahul Agarwal" width="50" height="50" style="border-radius:50%"><p><a href="https://github.com/ianplunkett" target="_blank" rel="noopener noreferrer" class="">Ian Plunkett</a>, <a href="https://github.com/rahul1" target="_blank" rel="noopener noreferrer" class="">Rahul Agarwal</a></p></td></tr><tr><td style="white-space:nowrap">3:30 PM</td><td><strong>Happy Hour and Demos</strong></td><td></td></tr></tbody></table>]]></content>
        <author>
            <name>Reshma Khilnani</name>
            <uri>https://github.com/reshmakh</uri>
        </author>
        <category label="community" term="community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Medplum Supports Custom FHIR Operations]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations"/>
        <updated>2025-07-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Healthcare APIs need flexibility. While FHIR's standard CRUD operations (create, read, update, delete) handle most use cases, real-world healthcare workflows often require custom logic that goes beyond basic data manipulation. That's why we're excited to introduce custom FHIR operations in Medplum.]]></summary>
        <content type="html"><![CDATA[<p>Healthcare APIs need flexibility. While FHIR's standard CRUD operations (create, read, update, delete) handle most use cases, real-world healthcare workflows often require custom logic that goes beyond basic data manipulation. That's why we're excited to introduce custom FHIR operations in Medplum.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="what-are-fhir-operations">What Are FHIR Operations?<a href="https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations#what-are-fhir-operations" class="hash-link" aria-label="Direct link to What Are FHIR Operations?" title="Direct link to What Are FHIR Operations?" translate="no">​</a></h2>
<p>FHIR operations are the "dollar sign things" – endpoints like <code>$validate</code>, <code>$expand</code>, or <code>$match</code> that perform specialized functions beyond standard CRUD operations. These are technically called "operations" in FHIR terminology, distinct from the basic "interactions" used for everyday data management.</p>
<p>Until now, Medplum supported built-in FHIR operations like <code>$validate</code> and custom logic through our Bot framework using <code>$execute</code>. But there was a gap: customers wanted more natural, domain-specific endpoints that felt like proper FHIR operations.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="why-custom-operations-matter">Why Custom Operations Matter<a href="https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations#why-custom-operations-matter" class="hash-link" aria-label="Direct link to Why Custom Operations Matter" title="Direct link to Why Custom Operations Matter" translate="no">​</a></h2>
<p>Consider these scenarios:</p>
<ul>
<li class="">A pharmacy system that needs a <code>MedicationRequest/$submit</code> operation</li>
<li class="">A quality assurance workflow requiring <code>Patient/$quality-check</code></li>
<li class="">Custom patient matching logic via <code>Patient/$match</code></li>
<li class="">Integration workflows that transform data before processing</li>
</ul>
<p>Previously, these would all use the generic <code>Bot/{id}/$execute</code> syntax. Custom operations provide a more elegant, FHIR-native approach with endpoints that clearly communicate their purpose.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="how-it-works">How It Works<a href="https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations#how-it-works" class="hash-link" aria-label="Direct link to How It Works" title="Direct link to How It Works" translate="no">​</a></h2>
<p>Custom FHIR operations build on Medplum's existing Bot infrastructure, providing three key benefits:</p>
<ol>
<li class=""><strong>Natural API Design</strong>: Instead of <code>Bot/dose-calculator/$execute</code>, you can now use <code>MedicationRequest/$calculate-dose</code></li>
<li class=""><strong>FHIR Standards Compliance</strong>: Operations are defined using standard FHIR OperationDefinition resources</li>
<li class=""><strong>Existing Security Model</strong>: Custom operations inherit all the access controls and permissions from the underlying Bot framework</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="getting-started">Getting Started<a href="https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>Setting up a custom operation involves three steps:</p>
<ol>
<li class="">Create and deploy your Bot with the custom logic</li>
<li class="">Create an OperationDefinition resource that defines the operation's interface</li>
<li class="">Link them together using the operation-definition-implementation extension</li>
</ol>
<p>The OperationDefinition specifies the operation code (like "quality-check"), input/output parameters, and includes a reference to your Bot implementation.</p>
<p>Once configured, you can call your custom operation using standard FHIR syntax:</p>
<div class="language-text codeBlockContainer_ZGJx theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_kX1v"><pre tabindex="0" class="prism-code language-text codeBlock_TAPP thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_AdAo"><span class="token-line" style="color:#393A34"><span class="token plain">POST /fhir/R4/Patient/$quality-check</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="security-and-access-control">Security and Access Control<a href="https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations#security-and-access-control" class="hash-link" aria-label="Direct link to Security and Access Control" title="Direct link to Security and Access Control" translate="no">​</a></h2>
<p>Custom operations follow Medplum's principle of "syntactic sugar on the existing Bot execute framework." They inherit all existing security controls:</p>
<ul>
<li class="">Bots must have appropriate project membership</li>
<li class="">Standard FHIR access control applies</li>
<li class="">Access policies are recommended for all Bot implementations</li>
<li class="">The same permission model that governs <code>$execute</code> applies to custom operations</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="implementation-philosophy">Implementation Philosophy<a href="https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations#implementation-philosophy" class="hash-link" aria-label="Direct link to Implementation Philosophy" title="Direct link to Implementation Philosophy" translate="no">​</a></h2>
<p>We've designed custom operations following Postel's Law: "be liberal in what you accept and conservative in what you send." The system is flexible with inputs (your Bot receives the raw POST body) but strict with outputs (responses are properly formatted according to the OperationDefinition).</p>
<p>This approach prioritizes developer experience while maintaining FHIR compliance for API consumers.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="looking-forward">Looking Forward<a href="https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations#looking-forward" class="hash-link" aria-label="Direct link to Looking Forward" title="Direct link to Looking Forward" translate="no">​</a></h2>
<p>This initial implementation focuses on Bot-backed operations, but the framework is extensible. Future versions could support external web service implementations or other execution models.</p>
<p>We're also considering whether customers should be able to override built-in operations – a powerful capability that opens interesting possibilities while requiring careful consideration of the implications.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="ready-to-try-it">Ready to Try It?<a href="https://www.fhirdocs.afiax.africa/blog/custom-fhir-operations#ready-to-try-it" class="hash-link" aria-label="Direct link to Ready to Try It?" title="Direct link to Ready to Try It?" translate="no">​</a></h2>
<p>Custom FHIR operations are available now in Medplum. Check out <a class="" href="https://www.fhirdocs.afiax.africa/docs/bots/custom-fhir-operations">our documentation</a> for detailed setup instructions, examples, and best practices.</p>
<p>This feature represents our commitment to providing healthcare developers with powerful, standards-compliant tools that adapt to real-world workflows. We can't wait to see what custom operations you build.</p>]]></content>
        <author>
            <name>Cody Ebberson</name>
            <uri>https://github.com/codyebberson</uri>
        </author>
        <category label="fhir-datastore" term="fhir-datastore"/>
        <category label="integration" term="integration"/>
        <category label="auth" term="auth"/>
        <category label="community" term="community"/>
        <category label="ai" term="ai"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Medplum Support for Anthropic's Model Context Protocol (MCP)]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp"/>
        <updated>2025-06-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Medplum is the platform of choice for technical leaders in healthcare, and that has given us a unique perspective into the transformative power of AI in healthcare - we get asked about it every single day.]]></summary>
        <content type="html"><![CDATA[<p>Medplum is the platform of choice for technical leaders in healthcare, and that has given us a unique perspective into the transformative power of AI in healthcare - we get asked about it every single day.</p>
<p>We know that technical leaders feel the pressure to define and execute on an AI strategy, and to demonstrate tangible progress to teams and stakeholders, that's expected in times of rapid technical advances.</p>
<p>That's why we're thrilled to announce our beta support for Anthropic's <strong>Model Context Protocol (MCP)</strong>, marking a significant leap forward in how large language models (LLMs) can securely and intelligently interact with healthcare infrastructure and systems of record.</p>
<div class="responsive-iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/y3gD7TQ-SM8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe></div>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="what-is-the-model-context-protocol-mcp">What is the Model Context Protocol (MCP)?<a href="https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp#what-is-the-model-context-protocol-mcp" class="hash-link" aria-label="Direct link to What is the Model Context Protocol (MCP)?" title="Direct link to What is the Model Context Protocol (MCP)?" translate="no">​</a></h2>
<p>Think of the Model Context Protocol (MCP) as the <strong>universal adapter for AI applications</strong>. Developed by Anthropic, MCP is an open standard designed to standardize how AI models, particularly LLMs, connect with and utilize external tools, systems, and data sources.</p>
<p><strong>MCP provides a structured way for LLMs to understand and interact with the outside world</strong>, moving beyond simple text generation to actual, actionable engagement with your existing infrastructure.</p>
<p>For healthcare, this is a game-changer due to the rigors of the workflow. Imagine LLMs not just summarizing information, but intelligently querying patient data (securely and appropriately), managing workflows, or even orchestrating integrations with medical devices. That's the promise of MCP.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="medplums-next-step-empowering-intelligent-healthcare-applications-with-mcp">Medplum's Next Step: Empowering Intelligent Healthcare Applications with MCP<a href="https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp#medplums-next-step-empowering-intelligent-healthcare-applications-with-mcp" class="hash-link" aria-label="Direct link to Medplum's Next Step: Empowering Intelligent Healthcare Applications with MCP" title="Direct link to Medplum's Next Step: Empowering Intelligent Healthcare Applications with MCP" translate="no">​</a></h2>
<p>Our initial support for MCP leverages the official TypeScript SDK, with a focus on cloud-native interactions via SSE (Server-Sent Events) and Streamable HTTP. While the MCP team is pushing for Streamable HTTP, we're currently supporting both to ensure compatibility with major LLM vendors.</p>
<p>The real power we're unlocking comes from our custom <code>fhir-request</code> tool, exposed through our MCP API. This tool allows an LLM to invoke almost any function within the Medplum API, because nearly everything in Medplum is exposed as <strong>FHIR resources and operations</strong>.</p>
<p>Here's a glimpse of what you can do:</p>
<p><strong>Intelligent Data Retrieval</strong>: Imagine an LLM securely searching for synthetic patient data, reading specific observations, or getting conditions lists.<br>
<strong>Automated Workflows</strong>: LLMs can initiate and manage healthcare processes, like creating a new task, scheduling an appointment, or marking a task as completed.<br>
<strong>Complex Operations</strong>: Beyond standard FHIR resources, our fhir-request tool enables LLMs to trigger Medplum's powerful integrations and FHIR operations, such as submitting a Claim via $submit.</p>
<p>We're particularly optimistic about this pattern because <strong>LLMs already have a strong understanding of FHIR</strong>, allowing them to adapt to our API naturally and with surprising accuracy.</p>
<p>This capability is enhanced when combined with <a class="" href="https://www.fhirdocs.afiax.africa/docs/bots">Medplum Bots</a>. These are JavaScript/TypeScript snippets that run in response to triggers – imagine an LLM orchestrating a workflow that a Medplum Bot then executes, like deploying another Bot or executing a complex operation (<code>/Bot/{id}/$deploy</code>, <code>/Bot/{id}/$execute</code>).</p>
<p>And for those deeply embedded in existing healthcare infrastructure, our <a class="" href="https://www.fhirdocs.afiax.africa/docs/agent">Medplum Agent</a> takes this even further. The Agent provides on-premise connectivity to EHRs, LIS, RIS, PACS, and other devices. With MCP, an LLM could intelligently construct an HL7 v2 message and push it directly to an on-premise destination via <code>/Agent/{id}/$push</code> – that's truly sending data from the LLM chat to the front lines of healthcare delivery!</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="why-this-matters-staying-ahead-in-ai">Why This Matters: Staying Ahead in AI<a href="https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp#why-this-matters-staying-ahead-in-ai" class="hash-link" aria-label="Direct link to Why This Matters: Staying Ahead in AI" title="Direct link to Why This Matters: Staying Ahead in AI" translate="no">​</a></h2>
<p>For healthcare technical leaders, the message is clear: AI is no longer a distant future; it requires action today. The pressure to innovate and integrate AI into your healthcare strategy is real. Medplum's support for MCP offers a unique opportunity to:</p>
<p><strong>Experiment Safely and Intelligently</strong>: Get hands-on with cutting-edge AI integration without starting from scratch.<br>
<strong>Demonstrate Rapid Progress</strong>: Show your teams and leadership how AI can tangibly interact with healthcare data and workflows, even with experimental, de-identified data.<br>
<strong>Build Future-Proof Architectures</strong>: By embracing open standards like MCP, you're positioning your organization to seamlessly adopt the next generation of AI capabilities.<br>
<strong>Attract Top Talent</strong>: Signal that your organization is at the bleeding edge, embracing new technologies and solving complex problems.</p>
<p>We know you're looking for ways to leverage AI now to drive innovation and efficiency. Medplum, with MCP, provides a powerful pathway to explore these possibilities.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="responsible-innovation-experimental-technology-ahead">Responsible Innovation: Experimental Technology Ahead<a href="https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp#responsible-innovation-experimental-technology-ahead" class="hash-link" aria-label="Direct link to Responsible Innovation: Experimental Technology Ahead" title="Direct link to Responsible Innovation: Experimental Technology Ahead" translate="no">​</a></h2>
<p>We are a healthcare company first and foremost, and that means prioritizing patient safety and data security above all else. Most major LLM vendors do not yet support HIPAA Business Associate Agreements (BAAs), and the landscape around production-grade, HIPAA-compliant AI integrations is still evolving rapidly.</p>
<p>Therefore, it is absolutely critical to understand that Medplum's current MCP implementation is a preview release and is experimental technology.</p>
<ul>
<li class="">Do not use this for protected health information (PHI).</li>
<li class="">Use only with synthetic, de-identified, or test data.</li>
<li class="">No guarantees are made about uptime or suitability for production workloads.</li>
<li class="">Proceed with caution and exercise your best judgment.</li>
</ul>
<p>Our commitment is to be a forward-leaning "high tech" player in healthcare. This means we make investments to get out in front of new technology trends, enabling you to explore future possibilities today. We're excited to offer this capability, but always with emphasis on responsible and ethical use.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="join-medplums-mcp-beta-today">Join Medplum's MCP Beta Today<a href="https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp#join-medplums-mcp-beta-today" class="hash-link" aria-label="Direct link to Join Medplum's MCP Beta Today" title="Direct link to Join Medplum's MCP Beta Today" translate="no">​</a></h2>
<p>The current MCP implementation is available to all Medplum users. We encourage you to dive in and experiment!</p>
<p><strong>Existing Medplum users</strong>: Jump into your <a href="https://app.medplum.com/" target="_blank" rel="noopener noreferrer" class="">Medplum project</a> and start exploring our MCP capabilities. Look for the "beta" label and the associated disclaimers.</p>
<p><strong>New to Medplum?</strong> The first step is to <a class="" href="https://www.fhirdocs.afiax.africa/docs/tutorials/register">sign up for an account</a> and go through our standard "Getting Started" flow. Once you're up and running, you'll have access to our MCP features.</p>
<p>We believe this initial support for MCP will spark incredible innovation. We can't wait to see what you build!</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="how-to-set-it-up">How to Set it Up<a href="https://www.fhirdocs.afiax.africa/blog/unlocking-healthcare-ai-medplum-support-mcp#how-to-set-it-up" class="hash-link" aria-label="Direct link to How to Set it Up" title="Direct link to How to Set it Up" translate="no">​</a></h2>
<ul>
<li class="">Open <a href="https://claude.ai/" target="_blank" rel="noopener noreferrer" class="">Claude</a> and log in, you'll need to be on a paid plan to add integrations</li>
<li class="">Navigate to the <a href="https://claude.ai/settings/profile" target="_blank" rel="noopener noreferrer" class="">settings page</a> in the bottom left and then click on "Add Integration" on the Organization Integrations page.</li>
<li class="">In the diaglog that opens input "Medplum" for the <strong>Integration Name</strong>, and "<a href="https://api.medplum.com/mcp/stream" target="_blank" rel="noopener noreferrer" class="">https://api.medplum.com/mcp/stream</a>" for the <strong>Integration URL</strong> and click Add</li>
<li class="">Back on the Organization integrations page, you'll see a button to <strong>Connect</strong>, click on it and it will redirect you to Medplum where you should authenticate</li>
<li class="">You'll be redirected to the Integrations page where</li>
<li class="">Create a <a href="https://claude.ai/new" target="_blank" rel="noopener noreferrer" class="">New Chat</a> in Claude and paste the following</li>
</ul>
<blockquote>
<p>can you please confirm you have access to the "fhir-request" MCP tool?</p>
</blockquote>
<p>LLMs can cometimes cache sessions, so if you find yourself unable to connect you can disconnect and reconnect in a new chat in order to get back to a good state.</p>
<p>Feedback welcome at <a href="mailto:support@medplum.com" target="_blank" rel="noopener noreferrer" class="">support@medplum.com</a> or join our <a href="https://discord.gg/medplum" target="_blank" rel="noopener noreferrer" class="">Discord</a></p>]]></content>
        <author>
            <name>Cody Ebberson</name>
            <uri>https://github.com/codyebberson</uri>
        </author>
        <category label="self-host" term="self-host"/>
        <category label="fhir-datastore" term="fhir-datastore"/>
        <category label="integration" term="integration"/>
        <category label="compliance" term="compliance"/>
        <category label="auth" term="auth"/>
        <category label="community" term="community"/>
        <category label="ai" term="ai"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Our Guide to Security Reports]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/security-reports</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/security-reports"/>
        <updated>2025-06-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[As a founder, you wear a lot of hats. One of mine is handling the security reports that land in our inbox.]]></summary>
        <content type="html"><![CDATA[<p>As a founder, you wear a lot of hats. One of mine is handling the security reports that land in our inbox.</p>
<p>Thanks to a strong security posture, including regular third-party pen tests, genuine vulnerability reports are rare. However, like any online business, we see a steady stream of security <em>inquiries</em>. These tend to fall into two distinct camps: the valuable, good-faith reports from legitimate researchers... and the noise.</p>
<p>The "noise" is what security expert Troy Hunt perfectly named <strong><a href="https://www.troyhunt.com/beg-bounties/" target="_blank" rel="noopener noreferrer" class="">"Beg Bounties."</a></strong> These are the low-effort, templated emails fishing for a payout for a non-issue.</p>
<p>We decided early on to be direct, transparent, and respectful of everyone's time—ours and the researcher's. So, when someone emails us about a potential vulnerability, here's the kind of response they can expect from us:</p>
<blockquote>
<p><strong>Subject: Re: Inquiry Regarding Security Issue</strong></p>
<p>Thanks for your interest in the security of the Medplum platform. We take all potential vulnerabilities seriously.</p>
<p>Our process is to first receive the full details of the potential issue, including steps to reproduce it. Once received, our team will validate the report.</p>
<p>To set clear expectations, we absolutely offer fair compensation for novel, verifiable vulnerabilities with a demonstrable security impact.</p>
<p>We do not, however, provide compensation for common out-of-scope reports, including:</p>
<ul>
<li class="">Suboptimal HTTP security header configurations</li>
<li class="">Missing best practices on DNS records (SPF/DKIM/DMARC)</li>
<li class="">Scanner output without a proven, practical exploit</li>
</ul>
<p>This approach allows us to focus on genuine, impactful security research. We look forward to receiving the details of your finding.</p>
<p>Best regards,</p>
<p>The Medplum Team</p>
</blockquote>
<p>That's it. It's a simple, firm, and fair template. Here's why it works for us:</p>
<ol>
<li class=""><strong>It puts process first.</strong> The conversation about money is on hold until we see a real vulnerability.</li>
<li class=""><strong>It filters out the noise.</strong> It clearly states what we don't pay for, saving everyone a lot of back-and-forth.</li>
<li class=""><strong>It encourages real research.</strong> It confirms we <em>do</em> pay for legitimate findings with a real-world impact.</li>
</ol>
<p>This email is our day-to-day tactic, but it's based on our official strategy, which is documented for anyone to see in our <strong><a href="https://github.com/medplum/medplum/blob/main/SECURITY.md" target="_blank" rel="noopener noreferrer" class="">Responsible Disclosure Policy on GitHub</a></strong>. It goes into more detail and includes a Safe Harbor clause to assure good-faith researchers they're protected.</p>
<p>The bottom line is simple: We take security seriously, and we take real security researchers seriously. If you have a legitimate, high-impact vulnerability, we genuinely want to hear from you and will be happy to compensate you for your work.</p>]]></content>
        <author>
            <name>Cody Ebberson</name>
            <uri>https://github.com/codyebberson</uri>
        </author>
        <category label="security" term="security"/>
        <category label="compliance" term="compliance"/>
        <category label="auth" term="auth"/>
        <category label="community" term="community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[EHRs, UDHPs, and Health Tech's Next Phase]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/ehr-vs-udhp</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/ehr-vs-udhp"/>
        <updated>2025-05-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Healthcare technology relies on established systems like Electronic Health Records (EHRs) and is now incorporating concepts like Unified Digital Health Platforms (UDHPs). Understanding this evolution is key to navigating the industry's direction.]]></summary>
        <content type="html"><![CDATA[<p>Healthcare technology relies on established systems like Electronic Health Records (EHRs) and is now incorporating concepts like Unified Digital Health Platforms (UDHPs). Understanding this evolution is key to navigating the industry's direction.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="ehrs-the-foundation-and-its-boundaries">EHRs: The Foundation and Its Boundaries<a href="https://www.fhirdocs.afiax.africa/blog/ehr-vs-udhp#ehrs-the-foundation-and-its-boundaries" class="hash-link" aria-label="Direct link to EHRs: The Foundation and Its Boundaries" title="Direct link to EHRs: The Foundation and Its Boundaries" translate="no">​</a></h3>
<p>EHRs were pivotal in digitizing patient records and streamlining billing. While foundational, many traditional EHRs present limitations in flexible data sharing, adaptability to varied workflows, and support for modern, rapid development cycles. These boundaries are less a critique of their original design and more an acknowledgment of today's expanded healthcare needs.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="udhps-expanding-the-horizon">UDHPs: Expanding the Horizon<a href="https://www.fhirdocs.afiax.africa/blog/ehr-vs-udhp#udhps-expanding-the-horizon" class="hash-link" aria-label="Direct link to UDHPs: Expanding the Horizon" title="Direct link to UDHPs: Expanding the Horizon" translate="no">​</a></h3>
<p>Unified Digital Health Platforms (UDHPs) represent a move to address these limitations. Unlike monolithic EHRs, a UDHP is envisioned as an ecosystem platform fostering interoperability (often via FHIR®), enabling seamless data flow, and providing robust APIs to spur innovation. The interest in UDHPs centers on their potential to create more connected and responsive healthcare experiences by extending capabilities rather than solely storing records.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="realizing-the-udhp-vision-implementation-matters">Realizing the UDHP Vision: Implementation Matters<a href="https://www.fhirdocs.afiax.africa/blog/ehr-vs-udhp#realizing-the-udhp-vision-implementation-matters" class="hash-link" aria-label="Direct link to Realizing the UDHP Vision: Implementation Matters" title="Direct link to Realizing the UDHP Vision: Implementation Matters" translate="no">​</a></h3>
<p>The UDHP concept is promising, but its practical realization depends heavily on the implementation approach. Healthcare's inherent diversity—unique organizational workflows, existing tech stacks, and specific patient needs—means a one-size-fits-all UDHP solution often falls short. The "last-mile" challenge of tailoring the platform to these specific needs is critical.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="medplums-approach-a-developer-first-udhp-foundation">Medplum's Approach: A Developer-First UDHP Foundation<a href="https://www.fhirdocs.afiax.africa/blog/ehr-vs-udhp#medplums-approach-a-developer-first-udhp-foundation" class="hash-link" aria-label="Direct link to Medplum's Approach: A Developer-First UDHP Foundation" title="Direct link to Medplum's Approach: A Developer-First UDHP Foundation" translate="no">​</a></h3>
<p>At Medplum, we believe a developer-first strategy is essential to effectively harness the UDHP model. Our open-source, FHIR-native platform functions as a "headless EHR," providing the core, secure, and compliant infrastructure. This empowers healthcare organizations and innovators to:</p>
<ul>
<li class=""><strong>Build with Precision:</strong> Develop applications and workflows tailored to their exact requirements.</li>
<li class=""><strong>Ensure Data Interoperability:</strong> Leverage a FHIR-native data store for standardized and accessible information.</li>
<li class=""><strong>Automate Effectively:</strong> Utilize an extensible framework to create custom automation for clinical and administrative processes.</li>
</ul>
<p>This approach allows organizations to construct their own UDHP-powered solutions on a flexible foundation, ensuring the platform meets their unique needs and addresses integration challenges effectively.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="building-a-connected-future">Building a Connected Future<a href="https://www.fhirdocs.afiax.africa/blog/ehr-vs-udhp#building-a-connected-future" class="hash-link" aria-label="Direct link to Building a Connected Future" title="Direct link to Building a Connected Future" translate="no">​</a></h3>
<p>The shift towards a UDHP model signifies a positive evolution, emphasizing greater connectivity and flexibility. Medplum is committed to supporting this evolution by providing robust, open tools for the builders who are shaping the future of healthcare technology.</p>]]></content>
        <author>
            <name>Cody Ebberson</name>
            <uri>https://github.com/codyebberson</uri>
        </author>
        <category label="self-host" term="self-host"/>
        <category label="fhir-datastore" term="fhir-datastore"/>
        <category label="integration" term="integration"/>
        <category label="compliance" term="compliance"/>
        <category label="auth" term="auth"/>
        <category label="community" term="community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[So You’re Thinking About Forking]]></title>
        <id>https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking</id>
        <link href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking"/>
        <updated>2025-05-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Forking can look like the fastest path to control, but it often becomes a long‑term maintenance tax. Here’s a pragmatic checklist to decide—and alternatives that usually win.]]></summary>
        <content type="html"><![CDATA[<p>Forking can look like the fastest path to control, but it often becomes a long‑term maintenance tax. Here’s a pragmatic checklist to decide—and alternatives that usually win.</p>
<blockquote>
<p><strong>TL;DR</strong> Forking feels like freedom; more often it is technical debt in disguise. Before you spin up a divergent codebase, walk through the checklist below and consider proven collaboration patterns that deliver 90 % of the control with 10 % of the cost.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="the-temptation-tofork">The Temptation to&nbsp;Fork<a href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking#the-temptation-tofork" class="hash-link" aria-label="Direct link to The Temptation to&nbsp;Fork" title="Direct link to The Temptation to&nbsp;Fork" translate="no">​</a></h2>
<p>Every open‑source maintainer eventually receives the same message: <em>“We love your project, but we need feature&nbsp;X immediately—so we’re considering a fork.”</em>&nbsp;The allure is clear:</p>
<ul>
<li class=""><strong>Unblocked roadmap</strong> No need to wait for upstream review cycles.</li>
<li class=""><strong>Rapid experimentation</strong> Freedom to rewrite modules, tweak schemas, or cut corners.</li>
<li class=""><strong>Perceived leverage</strong> A fork can feel like an insurance policy against future licence or direction changes.</li>
</ul>
<p>Yet the freedom is rarely free.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="what-a-fork-reallymeans">What a Fork Really&nbsp;Means<a href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking#what-a-fork-reallymeans" class="hash-link" aria-label="Direct link to What a Fork Really&nbsp;Means" title="Direct link to What a Fork Really&nbsp;Means" translate="no">​</a></h2>
<table><thead><tr><th>Hidden Cost</th><th>Why It Hurts Over&nbsp;Time</th></tr></thead><tbody><tr><td><strong>Merge fatigue</strong></td><td>Every upstream security patch, performance fix, or new feature now requires repeated cherry‑picks and conflict resolution.</td></tr><tr><td><strong>Security surface</strong></td><td>Divergent codepaths double the CVE tracking burden and slow incident response.</td></tr><tr><td><strong>Community isolation</strong></td><td>Third‑party plugins, docs, and Stack&nbsp;Overflow answers increasingly apply to the <em>mainline</em>, not your fork.</td></tr><tr><td><strong>Talent attraction</strong></td><td>Engineers prefer contributing to widely‑used projects; recruiting for a niche fork is tougher.</td></tr></tbody></table>
<p>At Medplum, we have seen partners launch forks with convinced leadership support—only to merge back within months after realising the hidden cost curve.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="when-a-fork-is-justified">When a Fork <em>Is</em> Justified<a href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking#when-a-fork-is-justified" class="hash-link" aria-label="Direct link to when-a-fork-is-justified" title="Direct link to when-a-fork-is-justified" translate="no">​</a></h2>
<p>There <strong>are</strong> legitimate scenarios:</p>
<ol>
<li class=""><strong>Project abandonment</strong> No active maintainers, unmerged PRs, stale security issues.</li>
<li class=""><strong>License retreat</strong> Upstream changes from permissive to restrictive terms.</li>
<li class=""><strong>Irreconcilable governance clash</strong> The core team rejects a domain‑specific regulatory requirement that your business legally must meet.</li>
</ol>
<p>If none of the above apply, pause before you type <code>git clone</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="alternatives-that-usuallywin">Alternatives That Usually&nbsp;Win<a href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking#alternatives-that-usuallywin" class="hash-link" aria-label="Direct link to Alternatives That Usually&nbsp;Win" title="Direct link to Alternatives That Usually&nbsp;Win" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="contribute-upstream">Contribute Upstream<a href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking#contribute-upstream" class="hash-link" aria-label="Direct link to Contribute Upstream" title="Direct link to Contribute Upstream" translate="no">​</a></h3>
<p>Large features land faster than you think when paired with a well‑structured proposal, passing tests, and open communication. For context, Medplum has merged &gt;1 000 community PRs, including entire modules such as the upcoming Kafka subscription channel.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="maintain-a-thin-extensionlayer">Maintain a Thin Extension&nbsp;Layer<a href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking#maintain-a-thin-extensionlayer" class="hash-link" aria-label="Direct link to Maintain a Thin Extension&nbsp;Layer" title="Direct link to Maintain a Thin Extension&nbsp;Layer" translate="no">​</a></h3>
<p>Build your business logic in a&nbsp;<strong>backend‑for‑frontend (BFF)</strong> or dedicated microservice, leaving the core FHIR server untouched. You keep velocity while upstream remains a drop‑in upgrade.</p>
<h3 class="anchor anchorTargetStickyNavbar_SAay" id="sponsor-roadmapwork">Sponsor Roadmap&nbsp;Work<a href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking#sponsor-roadmapwork" class="hash-link" aria-label="Direct link to Sponsor Roadmap&nbsp;Work" title="Direct link to Sponsor Roadmap&nbsp;Work" translate="no">​</a></h3>
<p>If a feature is strategic but non‑differentiating—think sharding, compliance, or new spec versions—directly funding upstream development is often faster and cheaper than hiring a fork&nbsp;team.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="case-study-four-years-of-medplumevolution">Case Study: Four Years of Medplum&nbsp;Evolution<a href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking#case-study-four-years-of-medplumevolution" class="hash-link" aria-label="Direct link to Case Study: Four Years of Medplum&nbsp;Evolution" title="Direct link to Case Study: Four Years of Medplum&nbsp;Evolution" translate="no">​</a></h2>
<ul>
<li class=""><strong>250+ releases</strong> Semantic‑versioned, backwards‑compatible upgrades every two weeks.</li>
<li class=""><strong>New capabilities</strong> Subscriptions, bots, Azure/GCP execution targets, sharding, DoseSpot integration.</li>
<li class=""><strong>Regulatory alignment</strong> HIPAA, US&nbsp;Core, USCDI updates shipped continuously.</li>
</ul>
<p>A downstream fork would have needed to replicate every one of these changes—or risk falling behind on performance and compliance.</p>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="a-30minute-fork-decisionchecklist">A 30‑Minute Fork Decision&nbsp;Checklist<a href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking#a-30minute-fork-decisionchecklist" class="hash-link" aria-label="Direct link to A 30‑Minute Fork Decision&nbsp;Checklist" title="Direct link to A 30‑Minute Fork Decision&nbsp;Checklist" translate="no">​</a></h2>
<ol>
<li class=""><strong>List blockers</strong> Write down the features or constraints driving the fork discussion.</li>
<li class=""><strong>Search the tracker</strong> Is someone already working on your need? Comment and collaborate.</li>
<li class=""><strong>Draft a proposal PR</strong> Even a&nbsp;work‑in‑progress branch sparks upstream feedback.</li>
<li class=""><strong>Estimate ownership cost</strong> How many engineer‑months per year will merges, CI, and CVE triage consume? Multiply by three.</li>
<li class=""><strong>Schedule an architecture chat</strong> Most maintainers (Medplum included) are happy to roadmap with partners—often unlocking an upstream path.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_SAay" id="conclusion--nextsteps">Conclusion &amp; Next&nbsp;Steps<a href="https://www.fhirdocs.afiax.africa/blog/so-youre-thinking-about-forking#conclusion--nextsteps" class="hash-link" aria-label="Direct link to Conclusion &amp; Next&nbsp;Steps" title="Direct link to Conclusion &amp; Next&nbsp;Steps" translate="no">​</a></h2>
<p>Forking should be the <em>exception</em>, not the default. The open‑source ecosystem thrives when contributors pull in the same direction, sharing maintenance and innovation. Before you commit to life on a fork:</p>
<ul>
<li class="">Open an issue outlining your blockers.</li>
<li class="">Gauge maintainer responsiveness on a small PR.</li>
<li class="">Consider a thin extension or sponsored roadmap work.</li>
</ul>
<p><strong>Our door is always open.</strong> If you’re weighing a fork—or just need architectural advice—reach out in the Medplum&nbsp;Slack, book office hours, or send us a pull&nbsp;request.</p>
<blockquote>
<p><em>Move fast—but merge faster.</em></p>
</blockquote>]]></content>
        <author>
            <name>Cody Ebberson</name>
            <uri>https://github.com/codyebberson</uri>
        </author>
        <category label="self-host" term="self-host"/>
        <category label="fhir-datastore" term="fhir-datastore"/>
        <category label="integration" term="integration"/>
        <category label="compliance" term="compliance"/>
        <category label="auth" term="auth"/>
        <category label="community" term="community"/>
    </entry>
</feed>