<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://docs.firearrow.io/changelog/</id>
    <title>Fire Arrow Documentation Blog</title>
    <updated>2026-06-02T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://docs.firearrow.io/changelog/"/>
    <subtitle>Fire Arrow Documentation Blog</subtitle>
    <icon>https://docs.firearrow.io/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.11.0]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/"/>
        <updated>2026-06-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.11.0 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.11.0 has been released.</p>
<ul>
<li class="">(breaking) Token generation, binary upload, and CarePlan materialize operations no longer return distinct HTTP codes for unknown or deleted resource IDs</li>
<li class="">(security) CareTeam-scoped access no longer includes patients outside the practitioner's actual teams</li>
<li class="">(feature) New CarePlan <code>$materialize</code> and <code>$dematerialize</code> operations to start and stop task materialization without Subscription write access</li>
<li class="">(bugfix) Token generation honors every matching <code>practitioner-role-code</code> rule, not only the first one in configuration</li>
<li class="">(maintenance) HAPI FHIR 8.10.0 platform upgrade (HAPI CLI database migration required) and dependency updates including Spring Security 6.5.10 (CVE-2026-22732)</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="consistent-403-responses-on-protected-operations">Consistent <code>403</code> Responses on Protected Operations<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#consistent-403-responses-on-protected-operations" class="hash-link" aria-label="Direct link to consistent-403-responses-on-protected-operations" title="Direct link to consistent-403-responses-on-protected-operations" translate="no">​</a></h2>
<p>Before running certain operations, the server checks that the caller is allowed to access the target resource — the same kind of check that applies when issuing an API token for a specific <code>Patient</code>, uploading a binary for a resource, or changing a <code>CarePlan</code> through <code>$materialize</code> or <code>$dematerialize</code>.</p>
<p>Until now, those checks could answer differently depending on whether the ID existed. A token request for a non-existent <code>Patient/{id}</code> often returned HTTP <code>400</code> with <code>"Resource not found"</code>, while the same request for a patient the caller was not permitted to use returned HTTP <code>403 Forbidden</code>. A deleted resource could return HTTP <code>410 Gone</code>. Clients that tried many IDs could infer which ones existed from the status code alone.</p>
<p>Starting with 1.11.0, an unknown or deleted target returns the same HTTP <code>403</code> as a genuine permission denial, with one message shape:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Access denied: insufficient permissions for &lt;operation&gt; on &lt;ResourceType&gt;/&lt;id&gt;</span><br></div></code></pre></div></div>
<p>The response no longer reveals whether the ID exists or has been deleted.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-change">Breaking Change<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#breaking-change" class="hash-link" aria-label="Direct link to Breaking Change" title="Direct link to Breaking Change" translate="no">​</a></h3>
<p><strong>Do not use HTTP status codes or response text on these operations to tell whether a resource ID exists or has been deleted.</strong> Treat every <code>403</code> as “not allowed,” and do not branch on <code>400</code>, <code>410</code>, or <code>"not found"</code>.</p>
<table><thead><tr><th>What you call</th><th>Examples</th></tr></thead><tbody><tr><td>API token generation</td><td><code>Patient/$generate-durable-token</code>, <code>Patient/$generate-one-time-token</code> (and other identity resource types)</td></tr><tr><td>Binary upload</td><td>Upload paths that authorize against a specific resource instance</td></tr><tr><td>CarePlan scheduling</td><td><code>CarePlan/{id}/$materialize</code>, <code>CarePlan/{id}/$dematerialize</code></td></tr></tbody></table>
<p>If an onboarding flow used token generation to probe whether a patient ID exists (for example, before showing a QR code), use a separate confirmation step instead of interpreting the operation response.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="careteam-scoped-access-could-include-the-wrong-patients">CareTeam-Scoped Access Could Include the Wrong Patients<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#careteam-scoped-access-could-include-the-wrong-patients" class="hash-link" aria-label="Direct link to CareTeam-Scoped Access Could Include the Wrong Patients" title="Direct link to CareTeam-Scoped Access Could Include the Wrong Patients" translate="no">​</a></h2>
<p>Deployments that use the <strong>CareTeam</strong> validator on practitioner (or related) roles intend a simple rule: a user may only see data for patients on CareTeams they belong to — the specialist sees their shared caseload, not the whole hospital population.</p>
<p>Under certain conditions the server could apply that rule too loosely. After looking up CareTeams for the practitioner, it treated every active team returned by the search as valid, <strong>even when the practitioner was not listed on that team's <code>participant</code> list</strong>. That most often surfaced when search indexing was misconfigured or out of date (for example <code>advanced_lucene_indexing: true</code> with an incomplete index, where participant filters on <code>CareTeam?participant=…</code> could be ignored and the query effectively returned all active teams). The authorization bug itself was independent of indexing: <strong>any</strong> over-broad team list could widen access the same way.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-downstream-applications-could-show">What downstream applications could show<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#what-downstream-applications-could-show" class="hash-link" aria-label="Direct link to What downstream applications could show" title="Direct link to What downstream applications could show" translate="no">​</a></h3>
<p>A practitioner session that should see three shared patients might instead receive authorization for <strong>every patient linked to any active CareTeam on the server</strong>, including:</p>
<ul>
<li class=""><strong><code>Patient</code> search and list screens</strong> — rosters, typeahead, and "my patients" views populated with records outside the intended caseload.</li>
<li class=""><strong>Reads and writes on clinical data</strong> — <code>Observation</code>, <code>Condition</code>, <code>MedicationRequest</code>, <code>CarePlan</code>, <code>Task</code>, and other resources for patients the user was not actually assigned to, as long as those rules used the CareTeam validator.</li>
<li class=""><strong>Token and onboarding flows</strong> — <code>$generate-durable-token</code> or <code>$generate-one-time-token</code> under a CareTeam-scoped rule could be issued for patients the practitioner should never have been able to act on.</li>
</ul>
<p>Roles that relied on <strong>LegitimateInterest</strong> or compartment validators alone were not affected by this particular issue; it applied where access was explicitly scoped through <strong>CareTeam</strong> membership.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="risk">Risk<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#risk" class="hash-link" aria-label="Direct link to Risk" title="Direct link to Risk" translate="no">​</a></h3>
<p>This is unauthorized access to protected health information: users could open, export, or act on the wrong person's record in apps that trust the FHIR API's authorization decisions. That creates confidentiality breaches (including regulatory exposure where PHI must stay within the care relationship), and clinical-safety risk if workflows display another patient's medications, results, or care plans to the wrong user.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="fix-in-1110">Fix in 1.11.0<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#fix-in-1110" class="hash-link" aria-label="Direct link to Fix in 1.11.0" title="Direct link to Fix in 1.11.0" translate="no">​</a></h3>
<p>The server now checks each candidate CareTeam and grants access to its <code>subject</code> patient <strong>only if</strong> the practitioner (or their role or organization, per existing matching rules) appears on that team's <code>participant</code> list. Teams returned by a faulty search no longer add patients to the accessible set. Practitioners who were already correctly limited see no change.</p>
<p>If you use advanced Lucene indexing, keep the index complete and current; a healthy index avoids noisy searches, but <strong>1.11.0 enforces membership even when search results are wrong</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="careplan-materialize-and-dematerialize">CarePlan <code>$materialize</code> and <code>$dematerialize</code><a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#careplan-materialize-and-dematerialize" class="hash-link" aria-label="Direct link to careplan-materialize-and-dematerialize" title="Direct link to careplan-materialize-and-dematerialize" translate="no">​</a></h2>
<p>Starting and stopping CarePlan task materialization previously relied on <code>$subscribe-due-events</code> and <code>$unsubscribe-due-events</code>, which create or disable <code>Subscription</code> resources. Clients without <code>Subscription</code> write permission could not use that path, and stopping materialization depended on finding subscriptions visible in the caller's scope — which was not always predictable.</p>
<p>1.11.0 adds two CarePlan operations (available when CarePlan events are enabled in server configuration):</p>
<table><thead><tr><th>Operation</th><th>Effect</th></tr></thead><tbody><tr><td><code>POST /CarePlan/{id}/$materialize</code></td><td>Opts the CarePlan into server-side task materialization by adding the scheduling tag (<code>https://firearrow.io/fhir/careplan-scheduling</code> / <code>scheduled</code>). Does <strong>not</strong> create a <code>Subscription</code>.</td></tr><tr><td><code>POST /CarePlan/{id}/$dematerialize</code></td><td>Removes the scheduling tag only. Does <strong>not</strong> delete existing Tasks or turn off Subscriptions already in place.</td></tr></tbody></table>
<p>Authorization uses a new <code>operation: "materialize"</code> rule on <code>CarePlan</code> (wildcards such as <code>resource: "*"</code> are rejected at startup, as for token-generation rules). The caller must also be allowed to <strong>read</strong> and <strong>update</strong> that CarePlan — token-style checks run against the specific instance. Granting <code>materialize</code> without a CarePlan <code>read</code> rule still results in <code>403 Forbidden</code>, because the server reads the CarePlan before applying the tag.</p>
<p>Example configuration:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">fire-arrow</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">authorization</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">validation-rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div 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 key atrule" style="color:#00a4db">client-role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Device</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CarePlan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> read</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">validator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Allowed</span><br></div><div 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 key atrule" style="color:#00a4db">client-role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Device</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CarePlan</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> materialize</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">validator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Allowed</span><br></div></code></pre></div></div>
<p><code>$subscribe-due-events</code> and <code>$unsubscribe-due-events</code> remain for webhook and polling setups. Use the new operations when a client only needs to turn materialization on or off without managing Subscriptions.</p>
<p>A successful call returns <code>Parameters</code> with <code>status=success</code>. Calling <code>$materialize</code> again on an already opted-in CarePlan does not trigger duplicate scheduling work.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="token-generation-denied-when-another-roles-rule-was-listed-first">Token generation denied when another role's rule was listed first<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#token-generation-denied-when-another-roles-rule-was-listed-first" class="hash-link" aria-label="Direct link to Token generation denied when another role's rule was listed first" title="Direct link to Token generation denied when another role's rule was listed first" translate="no">​</a></h3>
<p>Configuration can define several token-generation rules for one client role, each scoped with <code>practitioner-role-code</code> (for example, separate entries for physiotherapists and orthopedists). Search and read rules already combine every entry that applies to the caller; token generation should behave the same way.</p>
<p>Previously, token generation stopped after the first matching line in the file. If an orthopedist rule appeared above a physiotherapist rule, a physiotherapist was denied on <code>$generate-one-time-token</code> and <code>$generate-durable-token</code> even when a later line would have allowed them.</p>
<p>1.11.0 evaluates <strong>all</strong> matching token-generation rules before allowing or denying the request. Order in the YAML file no longer matters. Deployments with only one rule per role see no change.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dependency-upgrades">Dependency Upgrades<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#dependency-upgrades" class="hash-link" aria-label="Direct link to Dependency Upgrades" title="Direct link to Dependency Upgrades" translate="no">​</a></h2>
<p>1.11.0 includes a routine platform refresh (FHIR server core <strong>8.8.1 → 8.10.0</strong>) and patch updates across the server and administration UI. <strong>Spring Security 6.5.10</strong> addresses <a href="https://www.cve.org/CVERecord?id=CVE-2026-22732" target="_blank" rel="noopener noreferrer" class="">CVE-2026-22732</a>.</p>
<p>If you override binary storage settings manually, note the renamed threshold property <code>binary_storage_minimum_binary_size</code> (replacing <code>inline_resource_storage_below_size</code>). A new optional JPA setting <code>allow_database_validation_override</code> is available for advanced database validation scenarios.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="database-migration-required">Database migration required<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#database-migration-required" class="hash-link" aria-label="Direct link to Database migration required" title="Direct link to Database migration required" translate="no">​</a></h3>
<p>Upgrading the embedded HAPI FHIR platform from 8.8.1 to 8.10.0 includes <strong>new HAPI JPA schema migrations</strong>. Per the <a href="https://hapifhir.io/hapi-fhir/docs/server_jpa/upgrading.html" target="_blank" rel="noopener noreferrer" class="">HAPI FHIR upgrade guide</a>, you must run the HAPI CLI <strong><code>migrate-database</code></strong> command against your PostgreSQL database <strong>before</strong> starting 1.11.0 on the new image — do not rely on the server process to apply HAPI schema changes on first boot.</p>
<p>Recommended sequence:</p>
<ol>
<li class=""><strong>Back up</strong> the database.</li>
<li class=""><strong>Stop</strong> the running server instance.</li>
<li class="">Run <strong><code>hapi-fhir-cli migrate-database</code></strong> with a CLI build matching <strong>8.10.0</strong>, your JDBC URL, and dialect <code>POSTGRES_9_4</code> (see <a href="https://hapifhir.io/hapi-fhir/docs/tools/hapi_fhir_cli.html" target="_blank" rel="noopener noreferrer" class="">CLI migrate-database docs</a>).</li>
<li class=""><strong>Start</strong> Fire Arrow Server 1.11.0.</li>
</ol>
<p>Fire Arrow–specific tables (<code>V1_*</code> Flyway scripts under <code>db/migration</code>) are unchanged in this release and continue to apply automatically on startup when Flyway is enabled. This step is only for the shared HAPI FHIR JPA schema tracked in <code>FLY_HFJ_MIGRATION</code>.</p>
<p>Deployments using the Azure PostgreSQL migration helper can run <code>scripts/azure-postgres-migration.sh</code> (set <code>--hapi-cli-version</code> to <strong>8.10.0</strong> so the CLI matches the server).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="other-upgrade-actions">Other upgrade actions<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-11-0/#other-upgrade-actions" class="hash-link" aria-label="Direct link to Other upgrade actions" title="Direct link to Other upgrade actions" translate="no">​</a></h3>
<p>Beyond the HAPI database migration and the authorization breaking change above, no further action is required unless you relied on distinct HTTP status codes to probe resource existence.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.10.0]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-10-0/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-10-0/"/>
        <updated>2026-05-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.10.0 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.10.0 has been released.</p>
<ul>
<li class="">(feature) <code>$generate-durable-token</code> and <code>$generate-one-time-token</code> are now governed by all validators, not just <code>Allowed</code></li>
<li class="">(breaking) Token-generation rules using the wildcard <code>resource: "*"</code> are rejected at startup</li>
<li class="">(security) Update Next.js to 16.2.6 (CVE-2026-23870, CVE-2026-44573, CVE-2026-44575, CVE-2026-44579, CVE-2026-44580, CVE-2026-44581, CVE-2026-44576, CVE-2026-44582, CVE-2026-45109)</li>
<li class="">(feature) New <code>_synchronous</code> mode for <code>CarePlan/$subscribe-due-events</code> returns materialized Task IDs in the response</li>
<li class="">(bugfix) Questionnaire media viewer recovers automatically when pre-signed URLs expire</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="validator-support-for-token-generation-operations">Validator Support for Token-Generation Operations<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-10-0/#validator-support-for-token-generation-operations" class="hash-link" aria-label="Direct link to Validator Support for Token-Generation Operations" title="Direct link to Validator Support for Token-Generation Operations" translate="no">​</a></h2>
<p>The <code>$generate-durable-token</code> and <code>$generate-one-time-token</code> operations issue API tokens that act on behalf of an identity resource (<code>Patient</code>, <code>Practitioner</code>, <code>Device</code>, <code>RelatedPerson</code>). Until now, token-generation rules only worked under the <code>Allowed</code> validator. Operators who wanted to mint tokens under a narrower scope — for example, only for patients in a practitioner's compartment, or only for the patients a care team is responsible for — could not express that with a single rule. The common workaround was to keep the <code>generate-*-token</code> rule under <code>Allowed</code> and pair it with a separate <code>operation: update</code> rule under the appropriate validator, because the underlying authorization framework only considered the <code>update</code> rule's scope when checking who a token could be issued for.</p>
<p>Starting with 1.10.0, every validator that the server supports can be used on a token-generation rule. Tokens can now be issued under any available scope directly from the <code>generate-*-token</code> rule. For example, restricting practitioners to mint durable tokens only for patients in their compartment is now a single rule:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">fire-arrow</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">authorization</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">validation-rules</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div 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 key atrule" style="color:#00a4db">client-role</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Practitioner</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Patient</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> generate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">durable</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">token</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">validator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> PractitionerCompartment</span><br></div></code></pre></div></div>
<p>Token-generation rules are now <strong>self-contained</strong>: the chosen validator decides both whether the operation may be invoked and which target instance the caller is allowed to issue a token for. A separate <code>update</code> rule is no longer required for token generation to work.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="action-required-remove-redundant-update-rules">Action Required: Remove Redundant <code>update</code> Rules<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-10-0/#action-required-remove-redundant-update-rules" class="hash-link" aria-label="Direct link to action-required-remove-redundant-update-rules" title="Direct link to action-required-remove-redundant-update-rules" translate="no">​</a></h3>
<p>If your authorization configuration carries an <code>operation: update</code> rule that was added <strong>solely to enable token generation</strong> under a non-<code>Allowed</code> validator, <strong>you should remove it after upgrading</strong>. That rule grants the client full write access to every instance the validator's scope reaches — far more permission than token generation needs. Removing it tightens the client's permissions to exactly what the new model requires, with no loss of functionality.</p>
<p>Keep the <code>update</code> rule if the client also performs regular <code>PUT</code> requests for reasons unrelated to token generation. In that case it continues to authorize those updates independently.</p>
<p>The full migration note is documented at the top of the <a class="" href="https://docs.firearrow.io/docs/server/authentication/api-tokens/#authorization-requirements">API Tokens authorization section</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-change">Breaking Change<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-10-0/#breaking-change" class="hash-link" aria-label="Direct link to Breaking Change" title="Direct link to Breaking Change" translate="no">​</a></h3>
<p>As part of this work, the wildcard form <code>resource: "*"</code> is no longer accepted on token-generation rules. Token-generation only ever applies to the four identity resource types, and the wildcard previously expanded to a server-wide write grant covering every resource type — far broader than what the operation requires.</p>
<p>Deployments that currently have a rule of this shape:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> generate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">durable</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">token</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"*"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">validator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Allowed</span><br></div></code></pre></div></div>
<p><strong>must update their configuration before upgrading</strong>. Replace the wildcard with explicit per-resource-type rules for the identity types tokens should be issuable for:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> generate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">durable</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">token</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Patient</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">validator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Allowed</span><br></div><div 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 key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> generate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">durable</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">token</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Practitioner</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">validator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Allowed</span><br></div><div 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 key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> generate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">durable</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">token</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Device</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">validator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Allowed</span><br></div><div 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 key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> generate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">durable</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">token</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resource</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RelatedPerson</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">validator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Allowed</span><br></div></code></pre></div></div>
<p>The server logs the offending rule and refuses to start when a wildcard is encountered. Deployments that already enumerate resource types are unaffected.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-10-0/#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nextjs-updated-to-1626">Next.js updated to 16.2.6<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-10-0/#nextjs-updated-to-1626" class="hash-link" aria-label="Direct link to Next.js updated to 16.2.6" title="Direct link to Next.js updated to 16.2.6" translate="no">​</a></h3>
<p>The administration web UI's Next.js dependency has been updated from 16.2.3 to 16.2.6 to address a cluster of advisories disclosed across the 16.2.4, 16.2.5, and 16.2.6 patch releases. The most operationally relevant ones for Fire Arrow Server deployments are:</p>
<table><thead><tr><th>CVE</th><th>Severity</th><th>Summary</th></tr></thead><tbody><tr><td><a href="https://github.com/facebook/react/security/advisories/GHSA-rv78-f8rc-xrxh" target="_blank" rel="noopener noreferrer" class="">CVE-2026-23870</a></td><td>High (7.5)</td><td>Specially crafted requests to App Router Server Function endpoints can trigger excessive CPU usage and denial of service.</td></tr><tr><td><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-44573" target="_blank" rel="noopener noreferrer" class="">CVE-2026-44573</a></td><td>High (7.5)</td><td>Middleware/proxy authorization bypass on Pages Router applications using <code>i18n</code>, via locale-less <code>/_next/data/&lt;buildId&gt;/&lt;page&gt;.json</code> requests.</td></tr><tr><td><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-44575" target="_blank" rel="noopener noreferrer" class="">CVE-2026-44575</a> / <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-45109" target="_blank" rel="noopener noreferrer" class="">CVE-2026-45109</a></td><td>High (7.5)</td><td>Middleware/proxy authorization bypass on App Router applications via segment-prefetch (<code>.rsc</code>) routes; the follow-up CVE addresses the case of <code>middleware.ts</code> running under Turbopack.</td></tr><tr><td><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-44579" target="_blank" rel="noopener noreferrer" class="">CVE-2026-44579</a></td><td>High (7.5)</td><td>Connection-exhaustion denial of service on applications using Cache Components / Partial Prerendering, via crafted <code>Next-Resume</code> headers.</td></tr><tr><td><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-44580" target="_blank" rel="noopener noreferrer" class="">CVE-2026-44580</a></td><td>Medium (6.1)</td><td>Cross-site scripting in <code>beforeInteractive</code> scripts when untrusted input is embedded.</td></tr><tr><td><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-44581" target="_blank" rel="noopener noreferrer" class="">CVE-2026-44581</a></td><td>Medium (4.7)</td><td>Stored cross-site scripting via malformed CSP nonce values reflected into rendered HTML.</td></tr><tr><td><a href="https://nvd.nist.gov/vuln/detail/CVE-2026-44576" target="_blank" rel="noopener noreferrer" class="">CVE-2026-44576</a> / <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-44582" target="_blank" rel="noopener noreferrer" class="">CVE-2026-44582</a></td><td>Medium / Low</td><td>Cache-poisoning of React Server Component responses behind shared caches that do not partition response variants correctly.</td></tr></tbody></table>
<p>No application-side configuration change is required to pick up the fixes; the upgraded admin UI is bundled with the server image.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="synchronous-mode-for-subscribe-due-events">Synchronous Mode for <code>$subscribe-due-events</code><a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-10-0/#synchronous-mode-for-subscribe-due-events" class="hash-link" aria-label="Direct link to synchronous-mode-for-subscribe-due-events" title="Direct link to synchronous-mode-for-subscribe-due-events" translate="no">​</a></h2>
<p>The <code>CarePlan/$subscribe-due-events</code> operation activates a Subscription that triggers Task materialization for due CarePlan activities. Until now, the operation returned as soon as the Subscription was committed — Task materialization itself ran asynchronously and the materialized Tasks only became queryable a few seconds later. Orchestrators that wanted to act on the first due Task immediately (for example, dispatching it to a downstream system) had to poll the FHIR API until the Tasks appeared, which added wall-clock latency and wasted FHIR searches on each cold call.</p>
<p>Starting with 1.10.0, <code>$subscribe-due-events</code> accepts a new optional <code>_synchronous</code> parameter. When set to <code>true</code>, the operation blocks the HTTP response until immediate Task materialization has completed and returns the materialized Task IDs in the response <code>Parameters</code>:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div 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></div><div 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></div><div 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">"subscriptionId"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueId"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Subscription/123"</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></div><div 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">"effectiveEnd"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueInstant"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2026-06-01T00:00:00Z"</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></div><div 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">"action"</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">"created"</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></div><div 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></div><div 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">"task"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div 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></div><div 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">"taskId"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"valueId"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Task/456"</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></div><div 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">"status"</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">"ready"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div 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></div><div 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></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The synchronous wait is bounded at 10 seconds. If materialization does not complete inside that window, the operation still returns <code>200 OK</code> with <code>synchronousTimedOut=true</code> in the response and the caller can fall back to the usual notification path — the asynchronous materialization continues to run regardless of the synchronous outcome.</p>
<p>Default behaviour is unchanged. With <code>_synchronous</code> absent or <code>false</code>, the response shape is identical to previous releases and no extra processing runs.</p>
<p>The new parameter is documented in <a class="" href="https://docs.firearrow.io/docs/server/careplan-events/#waiting-for-initial-materialization-_synchronous">CarePlan Events › Waiting for Initial Materialization</a> and in the <a class="" href="https://docs.firearrow.io/docs/server/fhir-rest/custom-operations/#subscribe-due-events---subscribe-to-careplan-events"><code>$subscribe-due-events</code> reference</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-10-0/#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="questionnaire-media-viewer-breaking-after-sas-url-expiry">Questionnaire media viewer breaking after SAS URL expiry<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-10-0/#questionnaire-media-viewer-breaking-after-sas-url-expiry" class="hash-link" aria-label="Direct link to Questionnaire media viewer breaking after SAS URL expiry" title="Direct link to Questionnaire media viewer breaking after SAS URL expiry" translate="no">​</a></h3>
<p>Questionnaire items can carry inline media (images and videos) as <code>Attachment</code> references. The server returns those attachments with a freshly pre-signed download URL on every Questionnaire READ — the URL is short-lived by design (around two minutes in default configurations), and clients are expected to re-read the parent Questionnaire if the URL goes stale.</p>
<p>In the administration UI's questionnaire-builder preview pane, and in the patient-dashboard's QuestionnaireResponse viewer, that recovery did not run. As soon as the pre-signed URL expired the embedded image or video silently broke and showed only a generic load-error indicator, requiring the operator to manually refresh the page. The QuestionnaireResponse viewer additionally had no error handling at all, so an expired URL produced a broken media element with no visible error message.</p>
<p>In 1.10.0 both viewers correctly detect the expired URL, re-read the parent Questionnaire to obtain a freshly signed URL, and recover the media in place. The pre-signed URL lifetime configured on the server (<code>presigned-url.expiration-seconds</code>) is unchanged.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.9.1]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-9-1/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-9-1/"/>
        <updated>2026-05-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.9.1 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.9.1 has been released.</p>
<ul>
<li class="">(bugfix) Fix pre-signed attachment URLs not being recognized after client round-trip</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-9-1/#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pre-signed-attachment-urls-not-recognized-after-client-round-trip">Pre-signed attachment URLs not recognized after client round-trip<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-9-1/#pre-signed-attachment-urls-not-recognized-after-client-round-trip" class="hash-link" aria-label="Direct link to Pre-signed attachment URLs not recognized after client round-trip" title="Direct link to Pre-signed attachment URLs not recognized after client round-trip" translate="no">​</a></h3>
<p>When a client stored an attachment with a pre-signed download URL back to the server (for example, an <code>Attachment.url</code> received from an earlier read), the server is supposed to recognize that URL as its own and replace it with the internal storage reference. This ensures the download link is always freshly signed when the resource is read again, rather than retaining a time-limited token that will eventually expire.</p>
<p>Due to how Azure Storage encodes blob paths, the URL returned to clients could contain percent-encoded path separators (e.g. <code>%2F</code> instead of <code>/</code>). The server did not account for this encoding when trying to match the URL, causing it to silently skip the rewrite. The expired pre-signed URL was then persisted as-is in <code>Attachment.url</code>, permanently breaking any out-of-band download — for example, media fetched by WhatsApp or other messaging platforms that retrieve attachments independently.</p>
<p>1.9.1 correctly handles percent-encoded paths, so pre-signed URLs are now reliably recognized regardless of how the client returns them.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.8.2]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-8-2/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-2/"/>
        <updated>2026-04-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.8.2 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.8.2 has been released.</p>
<ul>
<li class="">(feature) Support <code>_total</code> search parameter in GraphQL</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="_total-parameter-in-graphql"><code>_total</code> Parameter in GraphQL<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-2/#_total-parameter-in-graphql" class="hash-link" aria-label="Direct link to _total-parameter-in-graphql" title="Direct link to _total-parameter-in-graphql" translate="no">​</a></h2>
<p>The FHIR <code>_total</code> search parameter was previously only honoured on the REST API. For GraphQL searches using stored (async) pagination, the <code>count</code> field — corresponding to <code>Bundle.total</code> — could be <code>null</code> on early pages because the total is only known once the asynchronous search task has loaded all results. Clients that needed a reliable total on the first page had to either poll until the search completed or switch to <code>Cache-Control: no-store</code>, which disables caching entirely.</p>
<p>Starting with 1.8.2, <code>_total</code> can be passed as an argument on any <code>*Connection</code> query:</p>
<table><thead><tr><th>Value</th><th>Effect</th></tr></thead><tbody><tr><td><code>accurate</code></td><td>Forces a <code>SELECT COUNT(*)</code> alongside the main query. The total is persisted and available on every page.</td></tr><tr><td><code>estimated</code></td><td>Requests an estimated count (HAPI default behavior, implementation-dependent).</td></tr><tr><td><code>none</code></td><td>Explicitly suppresses count computation.</td></tr><tr><td><em>(omitted)</em></td><td>Default behavior — count may be <code>null</code> until the async search completes.</td></tr></tbody></table>
<p>Example:</p>
<div class="language-graphql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-graphql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property-query">PatientConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token attr-name" style="color:#00a4db">_count</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token attr-name" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Smith"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token attr-name" style="color:#00a4db">_total</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"accurate"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">count</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">next</span><span class="token plain"> </span><span class="token object">edges</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token object">resource</span><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">id</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p><code>_total</code> is excluded from encoded cursors, so it only needs to be specified on the initial query — subsequent pages retrieved via <code>_cursor</code> inherit the computed total automatically.</p>
<p>Note that <code>_total</code> has no effect on multi-alternative authorization searches where deduplication across alternatives makes the total unreliable; <code>count</code> stays <code>null</code> in that case regardless.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.8.1]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-8-1/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-1/"/>
        <updated>2026-04-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.8.1 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.8.1 has been released.</p>
<ul>
<li class="">(feature) Display SampledData observations in charts with dynamic aggregation</li>
<li class="">(bugfix) Fix <code>urn:uuid:</code> bundle references blocking logical identifier fallback in authorization</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sampleddata-observation-charts">SampledData Observation Charts<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-1/#sampleddata-observation-charts" class="hash-link" aria-label="Direct link to SampledData Observation Charts" title="Direct link to SampledData Observation Charts" translate="no">​</a></h2>
<p>Observations that carry continuous time-series data in <code>valueSampledData</code> — such as heart rate, respiratory rate, or temperature recorded by wearables — were previously ignored by the observation charts. Starting with 1.8.1, <code>valueSampledData</code> is fully supported alongside <code>valueQuantity</code>.</p>
<p>Individual samples are expanded into discrete data points and dynamically aggregated based on the selected time range. At wider zoom levels the chart groups samples into time buckets and displays the mean value as a line with a shaded min/max range band, giving a clear overview without losing the ability to drill into the raw signal by zooming in.</p>
<p>This release also adds support for the LOINC code <code>93831-6</code> (sleep duration).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-1/#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="bundle-references-with-urnuuid-preventing-logical-identifier-resolution">Bundle references with <code>urn:uuid:</code> preventing logical identifier resolution<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-1/#bundle-references-with-urnuuid-preventing-logical-identifier-resolution" class="hash-link" aria-label="Direct link to bundle-references-with-urnuuid-preventing-logical-identifier-resolution" title="Direct link to bundle-references-with-urnuuid-preventing-logical-identifier-resolution" translate="no">​</a></h3>
<p>When a FHIR bundle used a <code>urn:uuid:</code> placeholder in <code>Reference.reference</code> alongside a business identifier in <code>Reference.identifier</code>, the authorization layer did not fall through to logical identifier resolution. Because <code>urn:uuid:</code> is a bundle-internal placeholder that the FHIR server resolves after authorization runs, it cannot be treated as a resolvable literal reference — but the authorization tester previously returned empty instead of checking <code>Reference.identifier</code>.</p>
<p>1.8.1 recognises the <code>urn:uuid:</code> scheme and correctly falls through to logical identifier resolution, matching the FHIR R4 spec intent that logical identifiers are a valid fallback when the literal reference is not directly resolvable.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.8.0]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-8-0/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-0/"/>
        <updated>2026-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.8.0 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.8.0 has been released.</p>
<ul>
<li class="">(security) Close search-parameter side-channel for property-filtered fields</li>
<li class="">(feature) Resolve FHIR R4 conditional and logical Patient references in authorization</li>
<li class="">(bugfix) Fix inherited roles being dropped when a child organization has a direct role</li>
<li class="">(bugfix) Fix HFQL rejecting every request with <code>403 Forbidden</code> when no explicit search/read rules are configured</li>
<li class="">(maintenance) Dependency upgrades across server, UI, and tooling</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="blocked-search-parameters-and-includes">Blocked Search Parameters and Includes<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-0/#blocked-search-parameters-and-includes" class="hash-link" aria-label="Direct link to Blocked Search Parameters and Includes" title="Direct link to Blocked Search Parameters and Includes" translate="no">​</a></h2>
<p>Property filters redact fields from outgoing FHIR resources — for example, stripping <code>Patient.name</code> so that a practitioner with legitimate interest can list patients without seeing personally identifying information. Until now, the underlying data remained fully indexed, which opened a side-channel: a client could issue a targeted search (<code>Patient?name=Smith</code>) and infer the redacted value from the search result, or use <code>_include</code>/<code>_revinclude</code> to traverse references that had been filtered out of the primary response.</p>
<p>Starting with 1.8.0, validation rules accept two new optional fields that close this channel:</p>
<ul>
<li class=""><strong><code>blocked-search-params</code></strong> — a list of FHIR search parameter names that are rejected with <code>403 Forbidden</code> when used in a search, a <code>_sort</code>, or a <code>_filter</code> expression.</li>
<li class=""><strong><code>blocked-includes</code></strong> — a list of <code>_include</code> / <code>_revinclude</code> directives in <code>ResourceType:searchparam</code> form that are rejected when used.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="identifier-based-patient-references-in-authorization">Identifier-Based Patient References in Authorization<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-0/#identifier-based-patient-references-in-authorization" class="hash-link" aria-label="Direct link to Identifier-Based Patient References in Authorization" title="Direct link to Identifier-Based Patient References in Authorization" translate="no">​</a></h2>
<p>When the authorization layer needs to decide whether an incoming resource belongs to a patient the caller is allowed to access, it previously resolved only literal <code>Patient/{id}</code> references on the subject reference. Import bundles that identified patients by their business identifier — using the conditional or logical reference forms permitted by FHIR R4 — were therefore rejected with <code>403 Forbidden</code>, even when the caller had legitimate interest in those patients.</p>
<p>Version 1.8.0 accepts all three forms defined by FHIR R4 in the order the spec prescribes:</p>
<ol>
<li class=""><strong>Literal</strong> — <code>Reference.reference = "Patient/123"</code> (<a href="https://hl7.org/fhir/R4/references.html#literal" target="_blank" rel="noopener noreferrer" class="">§2.3.0.2</a>)</li>
<li class=""><strong>Conditional</strong> — <code>Reference.reference = "Patient?identifier=sys|val"</code> (<a href="https://hl7.org/fhir/R4/http.html#trules" target="_blank" rel="noopener noreferrer" class="">§3.1.0.11.2</a>)</li>
<li class=""><strong>Logical</strong> — <code>Reference.identifier</code> (<a href="https://hl7.org/fhir/R4/references.html#logical" target="_blank" rel="noopener noreferrer" class="">§2.3.0.3</a>)</li>
</ol>
<p>Ambiguous identifiers (more than one Patient sharing the same business identifier) deliberately do not resolve, so a duplicate identifier can never silently authorize. The set of rules and identities that grant access is unchanged — only the resolution of <em>which</em> Patient a reference points to has been extended.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-0/#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="role-inheritance-dropping-parent-roles-on-child-organizations">Role inheritance dropping parent roles on child organizations<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-0/#role-inheritance-dropping-parent-roles-on-child-organizations" class="hash-link" aria-label="Direct link to Role inheritance dropping parent roles on child organizations" title="Direct link to Role inheritance dropping parent roles on child organizations" translate="no">​</a></h3>
<p>When role inheritance was enabled, parent roles were silently dropped whenever a child organization already had a direct role of its own. An elevated role declared at the root (e.g. <code>ICT</code>) disappeared as soon as a different role (e.g. <code>Nurse</code>) existed anywhere below it, and the inherited role was unavailable on every descendant beyond that point.</p>
<p>The fix correctly accumulates parent and direct roles together at each descendant within the configured depth, so the union of all inherited and directly-assigned roles is now visible to the authorization layer.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hfql-rejected-with-403-forbidden-whenever-no-explicit-searchread-rule-matched">HFQL rejected with <code>403 Forbidden</code> whenever no explicit search/read rule matched<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-0/#hfql-rejected-with-403-forbidden-whenever-no-explicit-searchread-rule-matched" class="hash-link" aria-label="Direct link to hfql-rejected-with-403-forbidden-whenever-no-explicit-searchread-rule-matched" title="Direct link to hfql-rejected-with-403-forbidden-whenever-no-explicit-searchread-rule-matched" translate="no">​</a></h3>
<p>HFQL authorization required at least one explicit search or read rule to be configured for the calling client role. In deployments where access is controlled purely via <code>default-validator</code> (no explicit rules), or for unauthenticated requests, every <code>$hfql-execute</code> query was rejected with <code>403 Forbidden</code> regardless of what the default validator would have decided.</p>
<p>In 1.8.0 the configured default validator is honoured for HFQL just as it is for ordinary searches. When no explicit rule matches the queried resource type:</p>
<ul>
<li class=""><strong><code>Allowed</code></strong> — the query returns the data its <code>FROM</code> clause selects.</li>
<li class=""><strong><code>Forbidden</code></strong> — the query succeeds with zero rows rather than being rejected.</li>
<li class=""><strong>Other validators</strong> (e.g. <code>LegitimateInterest</code>) — the matching explicit rules determine which rows the client sees, with the same compartment narrowing applied as for normal searches.</li>
</ul>
<p>Unauthenticated requests and requests from clients without explicit rules now return HTTP 200 with an empty result under a restrictive default validator, return data under a permissive default validator, and return the narrowed subset the client is authorized for when explicit rules are in place.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dependency-upgrades">Dependency Upgrades<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-8-0/#dependency-upgrades" class="hash-link" aria-label="Direct link to Dependency Upgrades" title="Direct link to Dependency Upgrades" translate="no">​</a></h2>
<p>1.8.0 includes a broad maintenance pass across the server, administration UI, and tooling.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.7.0]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-7-0/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-7-0/"/>
        <updated>2026-04-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.7.0 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.7.0 has been released.</p>
<ul>
<li class="">(breaking) Task scheduling data now written to <code>Task.restriction.period</code> instead of <code>Task.executionPeriod</code></li>
<li class="">(security) Update Next.js to 16.2.3 (CVE-2026-23869)</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="task-scheduling-data-in-restrictionperiod">Task Scheduling Data in <code>restriction.period</code><a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-7-0/#task-scheduling-data-in-restrictionperiod" class="hash-link" aria-label="Direct link to task-scheduling-data-in-restrictionperiod" title="Direct link to task-scheduling-data-in-restrictionperiod" translate="no">​</a></h2>
<p>This release changes where the server persists planned scheduling data on materialized Tasks. Previously, the due date was written to <code>executionPeriod.start</code> and the deadline to <code>executionPeriod.end</code>. This overloaded fields that the FHIR R4 spec defines as actual execution times, and caused incorrect dependency propagation when <code>ActivityCompletionService</code> interpreted <code>executionPeriod.end</code> as the client-written completion time.</p>
<p>Starting with 1.7.0, server-managed scheduling data is written to <code>Task.restriction.period</code>:</p>
<ul>
<li class=""><code>restriction.period.start</code> — the due date</li>
<li class=""><code>restriction.period.end</code> — the deadline</li>
</ul>
<p><code>Task.executionPeriod</code> is now exclusively client-written (actual start and end of execution). When resolving completion times for dependency propagation, the server uses a four-step fallback chain: <code>executionPeriod.end</code> → <code>restriction.period.end</code> → <code>executionPeriod.start</code> → <code>restriction.period.start</code>.</p>
<p>The <code>due-timestamp-field</code> configuration toggle has been removed. Two new configuration options — <code>auto-propagate-period-start</code> and <code>auto-propagate-period-end</code> (both off by default) — allow headless clients that cannot write back execution periods to have the server propagate scheduling data automatically.</p>
<p>The <code>fa-careplan-due-tasks</code> SearchParameter has been updated to index <code>Task.restriction.period.start</code> (version bumped to 2.0.0, which triggers automatic reindexing on startup).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="breaking-change">Breaking Change<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-7-0/#breaking-change" class="hash-link" aria-label="Direct link to Breaking Change" title="Direct link to Breaking Change" translate="no">​</a></h3>
<p>Existing materialized Tasks still have due dates stored in <code>executionPeriod</code>. <strong>Affected deployments must regenerate their CarePlans after upgrading</strong> to ensure all Tasks use the new field mapping.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="security">Security<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-7-0/#security" class="hash-link" aria-label="Direct link to Security" title="Direct link to Security" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nextjs-updated-to-1623-cve-2026-23869">Next.js updated to 16.2.3 (CVE-2026-23869)<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-7-0/#nextjs-updated-to-1623-cve-2026-23869" class="hash-link" aria-label="Direct link to Next.js updated to 16.2.3 (CVE-2026-23869)" title="Direct link to Next.js updated to 16.2.3 (CVE-2026-23869)" translate="no">​</a></h3>
<p>The administration web UI's Next.js dependency has been updated from 16.2.1 to 16.2.3 to address <a href="https://github.com/facebook/react/security/advisories/GHSA-479c-33wc-g2pg" target="_blank" rel="noopener noreferrer" class="">CVE-2026-23869</a>. A specially crafted HTTP request to an App Router Server Function endpoint could trigger excessive CPU usage, resulting in denial of service.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.6.1]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-6-1/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-6-1/"/>
        <updated>2026-04-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.6.1 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.6.1 has been released.</p>
<ul>
<li class="">(feature) Automatically ensure canonical URLs exist for definition resources in plans</li>
<li class="">(bugfix) Reverse pre-signed Azure Blob URLs back to <code>firearrow://</code> on resource updates</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="canonical-urls-for-definition-resources">Canonical URLs for Definition Resources<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-6-1/#canonical-urls-for-definition-resources" class="hash-link" aria-label="Direct link to Canonical URLs for Definition Resources" title="Direct link to Canonical URLs for Definition Resources" translate="no">​</a></h2>
<p>When building a PlanDefinition in the administration UI, definition resources such as ActivityDefinition or Questionnaire must be referenced by their canonical URL. Previously, if a selected resource did not have a canonical URL set, the reference was silently broken.</p>
<p>Starting with this release, the ResourceReferenceSelector detects when a chosen resource lacks a canonical URL and automatically generates one from the FHIR base URL, writing it back to the resource before inserting the reference. If the resource already has a canonical URL, it is used as-is. When a business version is present, it is appended with the <code>|</code> separator (e.g. <code>http://example.com/ActivityDefinition/ad-1|2.0</code>).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-6-1/#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pre-signed-azure-blob-urls-overwriting-firearrow-urls-on-round-trip">Pre-signed Azure Blob URLs overwriting <code>firearrow://</code> URLs on round-trip<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-6-1/#pre-signed-azure-blob-urls-overwriting-firearrow-urls-on-round-trip" class="hash-link" aria-label="Direct link to pre-signed-azure-blob-urls-overwriting-firearrow-urls-on-round-trip" title="Direct link to pre-signed-azure-blob-urls-overwriting-firearrow-urls-on-round-trip" translate="no">​</a></h3>
<p>When binary storage is enabled, Fire Arrow rewrites <code>firearrow://</code> attachment URLs to pre-signed Azure Blob URLs in outgoing responses so that clients can fetch media directly. If a client then saved the resource back — for example through the administration UI — the pre-signed URL replaced the canonical <code>firearrow://</code> URL in the database. This caused two problems:</p>
<ol>
<li class="">The stored pre-signed URL eventually expired, permanently breaking media access.</li>
<li class="">The blob cleanup interceptor saw the original <code>firearrow://</code> URL as removed and deleted the underlying blob.</li>
</ol>
<p>A new <code>BinaryUrlReverseRewriteInterceptor</code> now runs before resource storage, scanning all <code>Attachment</code> elements for recognised pre-signed Azure Blob URLs and converting them back to their <code>firearrow://</code> form. URLs that do not match the configured blob container are left untouched.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.5.0]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-5-0/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-5-0/"/>
        <updated>2026-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.5.0 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.5.0 has been released.</p>
<ul>
<li class="">(feature) Add licensing system</li>
<li class="">(bugfix) Fix CarePlan task scheduling drift after DST transitions</li>
<li class="">(bugfix) Fix delivery tracking for message channel subscriptions</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-150">Why 1.5.0?<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-5-0/#why-150" class="hash-link" aria-label="Direct link to Why 1.5.0?" title="Direct link to Why 1.5.0?" translate="no">​</a></h2>
<p>This release jumps from 1.0.0 directly to 1.5.0 to signal a significant operational change: the introduction of a licensing system. While the release contains no breaking API changes, <strong>Fire Arrow Server can no longer start without a valid license file from this version onwards.</strong> We chose the version bump to make this requirement clearly visible to anyone upgrading, rather than burying it in a patch release.</p>
<p>Existing deployments upgrading from 1.0.0 will need to obtain a license before moving to 1.5.0. Reach out to <a href="https://evoleen.com/" target="_blank" rel="noopener noreferrer" class="">Evoleen</a> to get your license file.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="licensing-system">Licensing System<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-5-0/#licensing-system" class="hash-link" aria-label="Direct link to Licensing System" title="Direct link to Licensing System" translate="no">​</a></h2>
<p>Fire Arrow Server now requires a license to start and continue running.</p>
<p>The license is configured via the <code>fire-arrow.license.*</code> properties and can be supplied as a file path or inline value.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-5-0/#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="careplan-task-scheduling-drift-after-dst-transitions">CarePlan task scheduling drift after DST transitions<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-5-0/#careplan-task-scheduling-drift-after-dst-transitions" class="hash-link" aria-label="Direct link to CarePlan task scheduling drift after DST transitions" title="Direct link to CarePlan task scheduling drift after DST transitions" translate="no">​</a></h3>
<p>When a CarePlan was created, the UTC offset from <code>period.start</code> (e.g. <code>+01:00</code> for CET in winter) was used as a fixed timezone for all task scheduling. After a DST transition, tasks that should have been scheduled at 08:00 local time would instead appear at 09:00 because the offset no longer matched the wall-clock time.</p>
<p>The fix ensures that when a proper IANA timezone (e.g. <code>Europe/Berlin</code>) is available on the CarePlan or Patient resource, it takes precedence over fixed offsets extracted from datetime values. This means task schedules now correctly follow DST transitions. Deployments using only fixed-offset timezones like <code>UTC</code> are unaffected.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="delivery-tracking-for-message-channel-subscriptions">Delivery tracking for message channel subscriptions<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-5-0/#delivery-tracking-for-message-channel-subscriptions" class="hash-link" aria-label="Direct link to Delivery tracking for message channel subscriptions" title="Direct link to Delivery tracking for message channel subscriptions" translate="no">​</a></h3>
<p>The subscription success tracker was bound to a rest-hook-specific delivery hook, which meant that message channel subscriptions (such as the Azure Storage Queue delivery) never recorded a successful delivery. After seven days without a recorded success, the subscription sweep job would disable these subscriptions, which in turn broke CarePlan lifecycle re-materialization.</p>
<p>The fix now works for all channel types, and also prevents redundant delivery to the internal message broker after a successful Azure Queue send.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.5.1]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-5-1/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-5-1/"/>
        <updated>2026-03-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.5.1 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.5.1 has been released.</p>
<ul>
<li class="">(feature) Show total number of search results instead of page size in the GraphQL <code>count</code> field</li>
<li class="">(bugfix) Fix crash in development license handler preventing release versions from starting</li>
</ul>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="total-search-count-in-graphql">Total Search Count in GraphQL<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-5-1/#total-search-count-in-graphql" class="hash-link" aria-label="Direct link to Total Search Count in GraphQL" title="Direct link to Total Search Count in GraphQL" translate="no">​</a></h2>
<p>The <code>count</code> field on GraphQL <code>*Connection</code> types previously reflected the page size rather than the total number of matching resources. Starting with this release, <code>count</code> returns the actual total from the FHIR <code>Bundle.total</code>, giving clients an accurate result count for building pagination UIs.</p>
<p>For <code>Cache-Control: no-store</code> queries, the first page requests an accurate total from the database and carries it forward in cursor metadata so subsequent pages can report the same value without re-counting. When the true total cannot be determined — for example, during aggregated authorization searches with multiple alternatives — <code>count</code> returns <code>null</code> rather than an incorrect number.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug Fixes<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-5-1/#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="license-handler-crash-with-packaged-deployments">License handler crash with packaged deployments<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-5-1/#license-handler-crash-with-packaged-deployments" class="hash-link" aria-label="Direct link to License handler crash with packaged deployments" title="Direct link to License handler crash with packaged deployments" translate="no">​</a></h3>
<p>The license handler introduced in 1.5.0 crashed when deployed as a nested WAR. The fix broadens the exception handling so that the "not running from source" detection covers more scenarios, allowing the server to start normally.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow Server 1.0.0]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-server-1-0-0/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-server-1-0-0/"/>
        <updated>2026-03-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow Server 1.0.0 has been released. This marks the launch of Fire Arrow's second product and a new chapter for the platform.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow Server 1.0.0 has been released. This marks the launch of Fire Arrow's second product and a new chapter for the platform.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="two-products-one-platform">Two Products, One Platform<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-0-0/#two-products-one-platform" class="hash-link" aria-label="Direct link to Two Products, One Platform" title="Direct link to Two Products, One Platform" translate="no">​</a></h2>
<p>Starting with this release, Fire Arrow consists of two products:</p>
<ul>
<li class=""><strong>Fire Arrow Core</strong> — the lightweight GraphQL facade that connects to an external FHIR server (e.g. Azure Health Data Services). This is the product previously known simply as "Fire Arrow", now rebranded as Fire Arrow Core.</li>
<li class=""><strong>Fire Arrow Server</strong> — a fully integrated FHIR server built on the open-source <a href="https://hapifhir.io/" target="_blank" rel="noopener noreferrer" class="">HAPI FHIR</a> project. Fire Arrow Server bundles its own PostgreSQL-backed data store together with the authorization, authentication, and workflow capabilities that Fire Arrow is known for.</li>
</ul>
<p>The rebranding of the original product to Fire Arrow Core is a naming change only — there are no breaking changes and existing deployments continue to work as before.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-fire-arrow-server">Why Fire Arrow Server?<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-0-0/#why-fire-arrow-server" class="hash-link" aria-label="Direct link to Why Fire Arrow Server?" title="Direct link to Why Fire Arrow Server?" translate="no">​</a></h2>
<p>Fire Arrow Core was designed for managed cloud environments where an external FHIR service handles data storage and scaling. That model works well for many use cases, but some deployments need:</p>
<ul>
<li class=""><strong>On-premise or sovereign hosting</strong> — running outside of US-owned hyperscalers, or within an organization's own infrastructure</li>
<li class=""><strong>Lower latency</strong> — eliminating the network hop to an external FHIR service</li>
<li class=""><strong>Richer server-side workflows</strong> — built-in FHIR Subscriptions, server-side CarePlan expansion, and an administration UI</li>
</ul>
<p>Fire Arrow Server addresses all of these while sharing the same authorization model, authentication providers, and GraphQL API that Core users are already familiar with.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-included">What's Included<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-0-0/#whats-included" class="hash-link" aria-label="Direct link to What's Included" title="Direct link to What's Included" translate="no">​</a></h2>
<p>Fire Arrow Server 1.0.0 ships with:</p>
<ul>
<li class=""><strong>Full FHIR R4 REST API</strong> with Swagger UI for interactive exploration</li>
<li class=""><strong>GraphQL API</strong> with read support, nested queries, and <code>_filter</code>-based search modifiers</li>
<li class=""><strong>Authentication</strong> via OAuth 2.0 / OIDC, Azure Identity, and API tokens (including QR-code-based one-time tokens for anonymous study participation)</li>
<li class=""><strong>Fine-grained authorization</strong> with additive rules, identity filters, property filters, and a rule debugger</li>
<li class=""><strong>FHIR Subscriptions</strong> (REST hook, email, websocket, Azure Storage Queue)</li>
<li class=""><strong>Server-side CarePlan workflows</strong> — automatic expansion of CarePlans into Tasks, with dynamic schedule updates based on Task completion</li>
<li class=""><strong>Administration Web UI</strong> with a GraphQL explorer, resource browser, and configuration overview</li>
<li class=""><strong>Pre-built Docker image</strong> available from the <a class="" href="https://docs.firearrow.io/docs/server/getting-started/first-run/">Evoleen Public ACR</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started">Getting Started<a href="https://docs.firearrow.io/changelog/fire-arrow-server-1-0-0/#getting-started" class="hash-link" aria-label="Direct link to Getting Started" title="Direct link to Getting Started" translate="no">​</a></h2>
<p>Head over to the <a class="" href="https://docs.firearrow.io/docs/server/getting-started/first-run/">First Run</a> guide to pull the Docker image and have a server running in minutes. For a detailed comparison of both editions, see <a class="" href="https://docs.firearrow.io/docs/general/editions/">Editions</a>.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
        <category label="Fire Arrow Server" term="Fire Arrow Server"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow 2.5.3]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-2-5-3/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-2-5-3/"/>
        <updated>2026-03-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow 2.5.3 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow 2.5.3 has been released.</p>
<ul>
<li class="">(bugfix) Fix identifier serialization when looking up identity resources by auth user ID</li>
</ul>
<!-- -->
<p>Fire Arrow supports looking up identity resources through a credential like an email address or by using the client's object ID from the authentication server. A bug in serializing the client's object ID led to an incorrect lookup of identity resources, causing multiple resources to be created and the client to be locked out if this was the primary method of identifying the client.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow 2.5.2]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-2-5-2/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-2-5-2/"/>
        <updated>2025-12-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow 2.5.2 has been released. This is a security release and all users are strongly encouraged to upgrade to this version.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow 2.5.2 has been released. This is a <strong>security release</strong> and all users are strongly encouraged to upgrade to this version.</p>
<ul>
<li class="">(security) Fix <code>LegitimateInterest</code> validator not blocking resources to unauthorized organizations</li>
</ul>
<!-- -->
<p>The <code>LegitimateInterest</code> validator compartmentalizes resources through an association with an <code>Organization</code>. This association is driven via <code>PractitionerRole</code> resources for <code>Practitioner</code> clients. A <code>Practitioner</code> client should not be able to see resources for which they don't have an active role.</p>
<p>A bug in processing search requests compromised this behavior.</p>
<div class="language-(graphql) codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-(graphql) codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">PatientList(organization: "123") {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    id</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><br></div></code></pre></div></div>
<p>Executing the query above without having an active role in this organization would still return patients associated with this organization. The root cause was improper parsing of search parameters, leading to an invalid comparison when computing the intersection between the allowed and requested organizations.</p>
<p>This release fixes the problem and improves the automated test suite to cover this case.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow 2.5.1]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-2-5-1/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-2-5-1/"/>
        <updated>2025-11-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow 2.5.1 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow 2.5.1 has been released.</p>
<ul>
<li class="">(bugfix) Refresh Azure Identity key stores on every request</li>
</ul>
<!-- -->
<p>Azure Identity is a variant of the OAuth authentication method. Fire Arrow uses it to authenticate backend services. To validate incoming requests, authentication tokens are cryptographically validated against public keys found in a key store. An implementation difference between OAuth and Azure Identity caused the key stores not to be refreshed for every incoming request, which led to a situation where a client signed their token with a newer key than was known to Fire Arrow.</p>
<p>This release ensures that the key store is always up to date before validating incoming tokens.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow 2.5.0]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-2-5-0/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-2-5-0/"/>
        <updated>2025-10-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow 2.5.0 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow 2.5.0 has been released.</p>
<ul>
<li class="">(feature) Add configurable option to propagate PlanDefinition extensions to CarePlan during <code>PlanDefinitionApply</code></li>
</ul>
<!-- -->
<p>A new feature <code>plan_definition_apply.propagate_plan_definition_extensions</code> has been introduced. This flag defaults to <code>false</code>, so Fire Arrow 2.5.0 will behave exactly as the previous release with unchanged configuration.</p>
<p>When the flag is set to <code>true</code>, all extensions contained in a <code>PlanDefinition</code> resource will be copied over to the <code>CarePlan</code> resource during <code>PlanDefinitionApply</code>.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow 2.4.0]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-2-4-0/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-2-4-0/"/>
        <updated>2025-10-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow 2.4.0 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow 2.4.0 has been released.</p>
<ul>
<li class="">(breaking) Replace decimal values with literals in API (previously used strings)</li>
<li class="">(chore) Update dependencies</li>
</ul>
<!-- -->
<p>The HL7 FHIR specification states that client shall not modify the precision of decimal values. This led to Fire Arrow using strings in its API to ensure that decimal values are passed through unchanged. However, this also caused breakage with APIs and libraries that insisted on parsing decimal values only.</p>
<p>Since the HL7 FHIR specification also states that a 64bit IEEE 754 compliant implementation is sufficient and values are unlikely to be in a range where precision matters, Fire Arrow has now switched to using floating point literals in its API.</p>
<p>This is a breaking change to previous versions.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow 2.3.0]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-2-3-0/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-2-3-0/"/>
        <updated>2025-07-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow 2.3.0 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow 2.3.0 has been released.</p>
<ul>
<li class="">(enhancement) Support custom search parameters created via <code>SearchParameter</code> resources via <code>_customSearchParameters</code> in queries</li>
<li class="">(enhancment) Add GraphQL schema documentation for standard search parameters</li>
<li class="">(bugfix) Fix GraphiQL UI not loading due to incorrect CDN URL</li>
<li class="">(chore) Update dependencies</li>
</ul>
<!-- -->
<p>This release enables support for custom search parameters that have been created on the FHIR server via <code>SearchParameter</code> resources. The GraphQL schema now exposes a new parameter <code>_customSearchParameters</code>. This parameter accepts a string through which custom parameters can be supplied. Fire Arrow will add them to the query string as-is.</p>
<p>The GraphiQL UI didn't load anymore because GraphiQL's CDN didn't serve the original JavaScript file anymore. This version serves an updated UI loader.</p>
<p>Furthermore, the GraphQL schema now also documents standard search parameters.</p>]]></content>
        <author>
            <name>Till Gerken</name>
            <uri>https://github.com/tigloo</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow 2.2.5]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-2-2-5/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-2-2-5/"/>
        <updated>2025-07-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow 2.2.5 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow 2.2.5 has been released.</p>
<ul>
<li class="">(bugfix) Fix plan definition action without definition removal</li>
</ul>
<!-- -->
<p>This release resolves a configuration issue with the <code>plan_definition_apply.remove_plan_definition_actions_without_definitions</code> setting. This configuration option allows the removal of PlanDefinition actions that lack references to other resources through their <code>definitionUri</code> or <code>definitionCanonical</code> fields during the <code>PlanDefinitionApply</code> operation.</p>
<p>The previous version prevented users from properly configuring this setting. This bugfix now enables correct configuration of this option, ensuring PlanDefinition operations work as intended.</p>]]></content>
        <author>
            <name>Bartek Wielek</name>
            <uri>https://github.com/bartekwk2</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow 2.2.4]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-2-2-4/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-2-2-4/"/>
        <updated>2025-06-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow 2.2.4 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow 2.2.4 has been released.</p>
<ul>
<li class="">(bugfix) Fix intersect search filter</li>
</ul>
<!-- -->
<p>This release resolves an issue with adding search filter with intersect option. Previously, when the search parameter included a list of conditions, for example: <code>organization': '1,2,3,4,5</code>, the intersect filter incorrectly converted OR logic into AND logic. Instead of searching for organization=1,2,3,4,5 as a group, the query was split into organization=1&amp;organization=2&amp;organization=3 etc. As a result, no records were returned because none could satisfy all these conditions at once. The update restores correct behavior, ensuring that searches with multiple values function as expected.</p>]]></content>
        <author>
            <name>Bartek Wielek</name>
            <uri>https://github.com/bartekwk2</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Fire Arrow 2.2.3]]></title>
        <id>https://docs.firearrow.io/changelog/fire-arrow-2-2-3/</id>
        <link href="https://docs.firearrow.io/changelog/fire-arrow-2-2-3/"/>
        <updated>2025-04-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Fire Arrow 2.2.3 has been released.]]></summary>
        <content type="html"><![CDATA[<p>Fire Arrow 2.2.3 has been released.</p>
<ul>
<li class="">(bugfix) Fix empty value in search parameter request</li>
</ul>
<!-- -->
<p>The string sanitizing method was enhanced to properly handle empty values in search parameter chains. Previously, when a search parameter chain contained an empty value, it could cause issues with FHIR server requests. The fix ensures that any subquery containing empty parameters is automatically excluded from the chain, as FHIR servers do not recognize empty parameters as valid search parameters.</p>
<p>This improvement makes Fire Arrow more robust when dealing with complex search queries and prevents potential errors when working with FHIR servers.</p>]]></content>
        <author>
            <name>Bartek Wielek</name>
            <uri>https://github.com/bartekwk2</uri>
        </author>
        <category label="Releases" term="Releases"/>
    </entry>
</feed>