2.60.0

2026-07-24

This version of Tamanu requires Chrome 149 or later.

Artifacts

central container oci://ghcr.io/beyondessential/tamanu-central:v2.60.0
central linux-amd64 https://servers.ops.tamanu.io/2.60.0/central-2.60.0-linux-amd64.tar.zst
Download
central windows-amd64 https://servers.ops.tamanu.io/2.60.0/central-2.60.0-windows.tar.zst
Download
dbt-manifest any https://docs.data.bes.au/tamanu/v2.60.0/manifest.json
Download
facility container oci://ghcr.io/beyondessential/tamanu-facility:v2.60.0
facility linux-amd64 https://servers.ops.tamanu.io/2.60.0/facility-2.60.0-linux-amd64.tar.zst
Download
facility windows-amd64 https://servers.ops.tamanu.io/2.60.0/facility-2.60.0-windows.tar.zst
Download
frontend any https://servers.ops.tamanu.io/2.60.0/web-2.60.0.tar.zst
Download
frontend container oci://ghcr.io/beyondessential/tamanu-frontend:v2.60.0
mobile android https://clients.ops.tamanu.io/2.60.0/android/tamanu/app-release.apk
patient-portal any https://servers.ops.tamanu.io/2.60.0/patient-portal-2.60.0.tar.zst
Download
patient-portal container oci://ghcr.io/beyondessential/tamanu-patient-portal:v2.60.0

Changelog

Bugfixes 🐛

  • AI: Remove default ai model (#10249)
  • AI: Remove default ai model (#10123)
  • adminPanel: Omit Invoice Price List Charging from reference data ‘Manage’ tab (#10363)
  • adminPanel: TAM-6891: reference data id search fields match on id, not name (HOTFIX 2.60) (#10512)
  • audit: Add migration to defer user_id FK constraint (#10169)
  • auth: fall back to cleartext token storage when Web Crypto unavailable (#10247)
  • auth: fall back to cleartext token storage when Web Crypto unavailable (backport 2.59) (#10153)
  • central: fix ESM build reference data export regression (#10145)
  • centralServer: Allow template name conflicts with historical templates (#10340)
  • dashboard: TAM-6950: Navigate on appointments link (#10209)
  • dashboard: TAM-6950: Navigate on appointments link (#10200)
  • database: retry reporting grant on catalog update race (HOTFIX 2.60) (#10555)
  • database: retry reporting role DDL on catalog update race (b65ce985a2)
  • db: Problematic prescriptions schema migration (#10552)
  • desktop: TAM-6954: Encounter programs form empty state (#10219)
  • desktop: TAM-6954: Encounter programs form empty state (#10211)
  • e2e: activate encounter tabs reliably via dispatchEvent (#10159)
  • encounters: TAM-6941: Require display ID input to delete encounter (#10184)
  • encounters: TAM-6941: Require display ID input to delete encounter (#10182)
  • fhir: stabilise flaky Patient given-name filter test (#10100)
  • fhir: stop FHIR resolver job stalling forever on lock waits (#10088)
  • forms: TAM-6945: Encounter form submission (#10244)
  • forms: TAM-6945: Encounter form submission (#10220)
  • imaging: Untranslated strings in encounter imaging requests table (#10406)
  • imaging: Sorting encoutner imaging requests by ‘Approved’ column (#10407)
  • imaging: Missing border on encounter imaging requests table (#10410)
  • invoices: TAM-6943: Discount error (#10196)
  • invoices: TAM-6943: Discount error (#10191)
  • invoicing: TAM-6897: fixed-price medications (#10109)
  • invoicing: TAM-6901: convert inpatient-bundled medication qty to dispensing units (#10276)
  • invoicing: Missing unit ‘Add items’ input, DOM semantics (#10389)
  • invoicing: Unwanted invoice table horizontal scrolling (#10508)
  • medication: Release 2.60 fixes (#10385)
  • medication: Add note tooltip (#10386)
  • medication: Add note tooltip (#10386)
  • medication: Fix dispensing unit invoice (#10490)
  • medication: Fix dispensing unit invoice (#10490)
  • medications: Medication release fixes (#10378)
  • medications: Show dispensing units in ‘Print prescription’ modal (#10390)
  • medications: Use em dash for empty values (#10419)
  • medications: Label quantity field as ‘Dispensing quantity’ even when no active encounter (#10430)
  • medications: Unnecessary horizontal overflow in ‘Dispense medication’ modal (#10438)
  • medications: Awkward line break in ‘Print prescription’ modal’s ‘duration’ (#10445)
  • medications: Missing unit in ‘Dispensing quantity’ field when ’Medication set’ medication edit form pre-populates (#10483)
  • mobile: TAM-6947: Workaround for emulator builds (#10197)
  • mobile: TAM-6947: Workaround for emulator builds (#10194)
  • mobile: Fix missing migration (#10257)
  • mobile: Fix missing migration (#10257)
  • mobile: APK not working in emulator (#10412)
  • mobile: APK not working in emulator (#10412)
  • mobile: Stale data in vaccine sheet after edit (#10441)
  • mobile: Clipped heading in ‘Edit patient additional data’ views (#10437)
  • mobile: Stale data in vaccine sheet after edit (take 2) (#10449)
  • mobile: TAM-6808: prescription dosing unit handling parity with Tamanu desktop (#10448)
  • modals: TAM-6935: Fix modal size (#10183)
  • modals: TAM-6935: Fix modal size (#10166)
  • modals: TAM-6944: Fix display on large modals (#10195)
  • modals: TAM-6944: Fix display on large modals (#10192)
  • navigation: TAM-6953: Mobile patient filters and recently viewed (#10222)
  • navigation: TAM-6953: Mobile patient filters and recently viewed (#10218)
  • patients: TAM-6964: Fix create duplicate patients (HOTFIX 2.60) (#10298)
  • patients: TAM-7006: gate Record death on write Patient as well (HOTFIX 2.60) (#10557)
  • precriptions: Show indication for medication on new line (#10399)
  • provisioning: TAM-6952: Update default ref data (#10210)
  • provisioning: TAM-6952: Update default ref data (#10208)
  • reporting: TAM-6862: degrade when reporting init fails (#10198)
  • sidebar: TAM-6950: Account for different sidebar in admin panel (#10241)
  • sidebar: TAM-6950: Account for different sidebar in admin panel (#10240)
  • sync: Order changelog FK targets (users) first during pull (#10018)
  • sync: Disable unsafe sync in central (HOTFIX 2.60) (#10304)
  • sync: TAM-6959: List FK issues in mobile sync (HOTFIX 2.60) (#10317)
  • translations: Allows TranslationOptions with getEnumTranslation (cherry pick from main) (#10446)
  • web: unique "key" prop warning in TableComponent render (#10226)
  • web: …unique "key" prop warning TableComponent render (9d223e4c60)
  • web: TAM-6956: Fixed issue where clicking ‘read more’ on notes displays them as a single line (#10224)
  • web: keep tab param when opening medication modal from notification (#10245)
  • web: Accessibly label discharge form ‘Discontinue’ column (#10310)
  • web: Number input field unit overflow (#10316)
  • web: Layout of MAR popover input with unit (#10369)
  • web: Squashed ‘Preset labels’ field in ‘Dispense medication’ modal (#10384)
  • web: Missing ‘Dose due’ label for variable-dose meds in MAR (#10388)
  • web: double slash in API requests (2.60 backport) (#10398)
  • web: Double slash in API requests (#10367)
  • web: Double slash in API request (0bd49896d3)
  • web: TAM-6975: faulty rendering of FreeText questions as numbers in encounter ‘Charts’ tab (2.60 backport) (#10415)
  • web: TAM-6975: faulty rendering of FreeText questions as numbers in encounter ‘Charts’ tab (#10382)
  • TAM-4047: remove static report permissions (#10102)- More number-input-adjacent UI jank (#10366)

Database 📊

  • add time indexes to sync_sessions (HOTFIX 2.60) (#10556)

Documentation 📚

  • Add scope-tamanu-release-tests skill (.claude/skills) (#10177)

Features ⭐

  • fhir: Offline FHIR Integrations (#9356)
  • invoicing: TAM-6897: fixed-price medications (#10109)
  • invoicing: TAM-6901: inpatient fee inclusions/exclusions (#10243)
  • labs: TAM-6820: Support non-numeric reference ranges on individual lab tests (#9908)
  • medications: TAM-6808: Split drug units into dosingUnit and dispensingUnit (#9914)
  • migrations: add –dry-run to migrate and upgrade (#10144)
  • reporting: TAM-6862: Tamanu manages reporting/raw db roles (#10082)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • sync: TAM-6863: facility sync-host setup workflow (#10124)

Performance 🌊

  • labs: exclude sensitive labs with NOT EXISTS anti-join in worklist query (HOTFIX 2.60) (#10558)
  • mobile: Avoid small spurious database request (#10514)
  • TAM-2410: simplify medication helpers, narrow types, add test suite (#10255)- Initialise <NumberField> onWheel handler only once (#10327)

Repo 📖

  • TAM-4047: remove static report permissions (#10102)- Transitive dependency update skill (#10132)

Revert ⏪

  • mobile: Stale data in vaccine sheet after edit (#10455)

Security ⚠️

  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)

Testing 🧪

  • invoicing: TAM-6897: fixed-price medications (#10109)

Tweaks ⚖️

  • invoicing: Clamp invoice item details to two lines (#10535)
  • medications: Use em dash for empty values (#10419)
  • web: Format numeric <SurveyAnswerResult> locale-aware-ly (#9782)
  • web: TAM-2410: semantics hygiene in MAR header (#10213)
  • web: Fix grammar, casing, empty state in patient encounter summary (#10216)
  • web: Disable vendor-prefixed CSS fallbacks (#10223)
  • web: TAM-2410: make medication constants constant (#10227)
  • web: Make medication constants constant (8259171082)
  • web: Explicitly use tabular figures in numeric inputs (#10242)
  • web: Improve discharge form medication table layout (#10355)
  • web: Shrink ‘Preset labels’ column, educate quote (#10387)
Copied to clipboard!