2.61.0

2026-08-10

This version of Tamanu requires Chrome 150 or later.

Artifacts

central container oci://ghcr.io/beyondessential/tamanu-central:v2.61.0
central linux-amd64 https://servers.ops.tamanu.io/2.61.0/central-2.61.0-linux-amd64.tar.zst
Download
central windows-amd64 https://servers.ops.tamanu.io/2.61.0/central-2.61.0-windows.tar.zst
Download
dbt-manifest any https://docs.data.bes.au/tamanu/v2.61.0/manifest.json
Download
facility container oci://ghcr.io/beyondessential/tamanu-facility:v2.61.0
facility linux-amd64 https://servers.ops.tamanu.io/2.61.0/facility-2.61.0-linux-amd64.tar.zst
Download
facility windows-amd64 https://servers.ops.tamanu.io/2.61.0/facility-2.61.0-windows.tar.zst
Download
frontend any https://servers.ops.tamanu.io/2.61.0/web-2.61.0.tar.zst
Download
frontend container oci://ghcr.io/beyondessential/tamanu-frontend:v2.61.0
mobile android https://clients.ops.tamanu.io/2.61.0/android/tamanu/app-release.apk
patient-portal any https://servers.ops.tamanu.io/2.61.0/patient-portal-2.61.0.tar.zst
Download
patient-portal container oci://ghcr.io/beyondessential/tamanu-patient-portal:v2.61.0
analytics-metadata any https://tamanu-translations.data.bes.au/2.61.x/analytics-metadata-v2.61.x-standard.yml
Download
reporting-docs any https://tamanu-translations.data.bes.au/2.61.x/reporting-docs-v2.61.x-standard.html
Download
reporting-schema any https://tamanu-translations.data.bes.au/2.61.x/reporting-schema-v2.61.x-standard.sql
Download
reporting-standard any https://tamanu-translations.data.bes.au/2.61.x/reporting-standard/
Download

Changelog

Bugfixes 🐛

  • AI: TAM-2400: AI Encounter summary (#9861)
  • AI: Remove default ai model (#10249)
  • AI: Remove default ai model (#10123)
  • SAST: COOL-58 sast vulnerabilities rate limit (#9614)
  • SAST: COOL-58: sast vulnerabilities sensitive cookie (#9615)
  • a11y: Medication-related button semantics, disabled state (#10371)
  • a11y: * ornament spacing & unescaped accessible label (#10401)
  • admin: fix reference data export crashing on 31 char sheet name limit (#10637)
  • adminPanel: Permissions table keyboard accessibility (#9540)
  • adminPanel: NASS-1898: manage program registries (#9517)
  • adminPanel: NASS-1898: manage program registries (#9517)
  • adminPanel: NASS-1898: manage program registries (#9517)
  • adminPanel: NASS-1898: manage program registries (#9517)
  • adminPanel: NASS-1898: manage program registries (#9517)
  • adminPanel: NASS-1898: manage program registries (#9517)
  • adminPanel: TAM-6891: reference data id search fields match on id, not name (#10420)
  • adminPanel: TAM-6891: correct searchById where-merge and trim FK-name joins (#10516)
  • ai: missing patient context (#9998)
  • ai: missing patient context (#9970)
  • ai: missing patient context (#9998)
  • alert: Fhir-unresolvable-service-requests-labs.yml erroring (#9844)
  • api: retry on a partial stream message instead of yielding undefined (#10277)
  • appointments: only send appointment email when checkbox ticked (#9858)
  • appointments: fix past appointments query on locale-collated DBs (#10114)
  • assets: TAM-6818: Patient cert logo (MAIN) (#9906)
  • assets: TAM-6818: Patient cert logo (MAIN) (#9906)
  • audit: Add migration to defer user_id FK constraint (#10169)
  • auth: main hotfix: fall back to local login on central version mismatch (#9831)
  • 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)
  • backups: TAM-6752: Update restore action and add docs (#9889)
  • build: Declare dependencies on @tamanu/build-tooling (2e4645444b)
  • build: Declare dependencies on @tamanu/build-tooling (297bcc7bb0)
  • cd: windows esm migration loader (hotfix 2.61) (#10727)
  • cd: windows esm migration loader (#10682)
  • central: fix ESM build reference data export regression (#10145)
  • central: dequeue only the timed-out request in loadshedder (#10267)
  • central: dequeue only the timed-out request in loadshedder (#10267)
  • central: read lab-test publisher limit from task config (#10318)
  • central: include digit 9 in patient-portal one-time codes (#10320)
  • central: use payload exp for absoluteExpiration token refresh (#10321)
  • central: await report-failure email and pass body as text (#10323)
  • central: stop deceased patient discharger stalling on skipped rows (#10325)
  • central: batch repeating-task generation with where filter and offset (#10319)
  • central: accept numeric zero answers in survey response import (#10322)
  • centralServer: Missing object-level permission check for GET /admin/programRegistry/:id (#9690)
  • ci: COOL-64: Improve CI momentarily (#9606)
  • ci: Increase timeout in database package tests (#9663)
  • ci: actions/cache keys (#10041)
  • ci: node_modules cache key (753d351b4e)
  • dashboard: TAM-6950: Navigate on appointments link (#10209)
  • dashboard: TAM-6950: Navigate on appointments link (#10200)
  • database: compute survey result from final answers on server submit (#10331)
  • database: Assert created_at updated_at having default NOW() (#10364)
  • database: retry reporting grant on catalog update race (#10491)
  • database: retry reporting role DDL on catalog update race (479258279b)
  • deaths: Death certificate stuck in loading state when no villageId (#9590)
  • deps: Misplaced @types/umzug dependency declaration, restore Buffer (#10044)
  • desktop: TAM-6927: Patient mark for sync error notification (#10126)
  • desktop: TAM-6954: Encounter programs form empty state (#10219)
  • desktop: TAM-6954: Encounter programs form empty state (#10211)
  • e2e: Fix broken tokens in E2E (#9649)
  • 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)
  • facility: link referral to encounter when admitting from a referral (#10274)
  • facility: stop vaccine creation after a 400 validation response (#10272)
  • facility: enforce sensitive-lab permission for panel requests (#10285)
  • facility: parameterise facilityId in patient location queries (#10268)
  • facility: exclude cancelled bookings from reschedule conflict check (#10324)
  • facility: return imaging area note content in update response (#10328)
  • facility: handle MAR update without doses payload (#10329)
  • facility: return after early empty responses in route handlers (#10333)
  • fhir: COOL-63: De-prioritise FHIR jobs created during migrations (#9586)
  • fhir: defuse FHIR search literal-replacements throw + detect Windows path-casing duplication (#9660)
  • fhir: switch fhir job listener to pg-notify for auto-reconnect (#9866)
  • fhir: backstop fhir queue processing from heartbeat (#9867)
  • fhir: detect dead NOTIFY listener and crash after drain (#9873)
  • fhir: TAM-6904: clean up stale FHIR jobs and incorrect trigger on facility servers (#10101)
  • fhir: stabilise flaky Patient given-name filter test (#10100)
  • fhir: stop FHIR resolver job stalling forever on lock waits (#10088)
  • fhir: scrub PDF attachments from bundle entry resources in write logs (#10193)
  • forms: TAM-6945: Encounter form submission (#10244)
  • forms: TAM-6945: Encounter form submission (#10220)
  • integration: SAV-1150: Update mSupply API (#9568)
  • integrations: SAV-1150: Update config case (#9635)
  • invoices: TAM-6943: Discount error (#10196)
  • invoices: TAM-6943: Discount error (#10191)
  • invoicing: parse price list rules JSON on import (MAIN) (#9667)
  • invoicing: parse price list rules JSON on import (#9651)
  • invoicing: SAV-1054: Palau sliding fee scale (#9601)
  • invoicing: show correct patient subtotal on patient invoices tab (#9932)
  • invoicing: show correct patient subtotal on patient invoices tab (#9865)
  • invoicing: show patientSubtotal in patient invoices table (3bc878eab4)
  • invoicing: recalculate payment status when invoice is updated (#9933)
  • invoicing: recalculate payment status when invoice is updated (#9874)
  • invoicing: TAM-6897: fixed-price medications (#10109)
  • invoicing: run invoice and payment writes inside their transaction (#10275)
  • invoicing: stop ripple ghosting on three-dot menu items (#10588)
  • invoicing: fix patient total due showing $0 when payment edited to $0 (#10625)
  • invoicing: fix edit patient payments modal UI issues (#10630)
  • labs: TAM-4440: remap DiagnosticReport invalidation workflow (#9986)
  • labs: fix method column too narrow in enter results modal (#10646)
  • labs: show historical lab categories and panels a patient has results for (#10674)
  • medication: TAM-6856: use Dark colour for already-prescribed inline text (#10034)
  • medication: fix dosing unit missing from dispense label text (#10642)
  • medication: prevent editing medication administration records after discharge (#10658)
  • medications: TAM-6801: preset labels for dispensed medications (#9922)
  • medications: TAM-6813: dispensed medication label text formatting (#9939)
  • medications: Grammar in administration schedule discrepancy error message (#10435)
  • medications: Administration change log modal footer border (#10700)
  • medications: show updated pharmacy note after a dispense modification (#10715)
  • migrations: main hotfix: rebuild procedures sync lookup (#9820)
  • migrations: TAM-6977: Remove settings seeds on facility (#10381)
  • mobile: fix vitals survey freezes (#9735)
  • mobile: remove patient title from mobile model (#9745)
  • mobile: fix crash on initial sync when mobileSync settings missing (#9934)
  • mobile: fix crash on initial sync when mobileSync settings missing (#9896)
  • mobile: remove obsolete dietId column from encounter (#10052)
  • mobile: transpile logical assignment operators before minification (#10068)
  • 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: store auto-generated MAR dueAt as local ISO 9075 (#10278)
  • mobile: compute current-encounter day boundary in local time (#10284)
  • mobile: roll back survey submit on error instead of committing partial data (#10270)
  • mobile: reset preventSignOutOnFailure so auth errors sign out again (#10279)
  • mobile: skip incomplete conditions when saving program registration (#10283)
  • mobile: render midday and midnight correctly in plain time format (#10354)
  • mobile: enforce mandatory village using the villageId field key (#10352)
  • mobile: filter report totals by device in where clause (#10351)
  • mobile: raise auth error for unknown email in offline login (#10349)
  • mobile: record per-field sync ticks on patient additional data insert (#10353)
  • mobile: record per-field sync ticks on patient additional data insert (#10353)
  • mobile: remove date restriction on program registration date (#10356)
  • mobile: Store real timestamp for incoming sync tombstones (#10350)
  • mobile: store real timestamp for incoming sync tombstones (56f0a13482)
  • 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)
  • models: Missing patientId property on PatientIssue (#9728)
  • navigation: TAM-6953: Mobile patient filters and recently viewed (#10222)
  • navigation: TAM-6953: Mobile patient filters and recently viewed (#10218)
  • node: TAM-6979: Event listeners max (#10383)
  • notes: Fix latest handover notes performance (MAIN) (#9984)
  • notes: deterministic note change log ordering (#10096)
  • notes: stable note changelog ordering to fix flaky E2E (32e7fa35c2)
  • patientCertificates: ‘Place of death’ when died outside health facility (#10571)
  • patientPortal: Inaccurate type (#9804)
  • patientPortal: Untrimmed form data, microcopy casing (#9859)
  • patients: TAM-6833: hide Record death link without permission (#9969)
  • patients: TAM-6964: Fix create duplicate patients (#10256)
  • patients: TAM-7006: gate Record death on write Patient as well (#10528)
  • patients: fix and consolidate triage wait time calculation (#10678)
  • procedures: fix assistant clinicians missing from procedure responses (#10634)
  • programRegistry: clear search fields when switching program registries (#9936)
  • programRegistry: clear search fields when switching program registries (#9912)
  • programs: fix blank edited from/to values in form response changelog (#10645)
  • provisioning: Update provisioning data to work with default survey code (#9600)
  • provisioning: Revert duplicate codes in location provisioning (#9607)
  • provisioning: TAM-6952: Update default ref data (#10210)
  • provisioning: TAM-6952: Update default ref data (#10208)
  • repo: drop alerts COPY from Dockerfile (#9971)
  • reporting: TAM-6862: degrade when reporting init fails (#10198)
  • reports: NOTAM-566: always include :timezone in report query replacements (#9630)
  • reports: TAM-1331: exclude soft-deleted reports from admin listing (#9944)
  • reports: exclude soft-deleted reports from admin listing (9e8d75dd3d)
  • reviewHero: Test coverage custom tamanu agents (#9587)
  • scripts: read web replica counts from web options in deploy helper (#10335)
  • security: Dependency updates for security patches (#9612)
  • seedSnapshot: unblock snapshot creation on 2.61 (#10622)
  • settings: Treat secret settings as high risk (#9702)
  • settings: stop settings cascade mutating schema defaults (#10269)
  • shared: Polynomial regular expression in legacy visibilityCriteria parsing (#10016)
  • shared: de-duplicate programRegistry suggester, allow re-registration (#10289)
  • shared: preserve supplied timezone when parsing fhir datetimes (#10332)
  • sidebar: TAM-6950: Account for different sidebar in admin panel (#10241)
  • sidebar: TAM-6950: Account for different sidebar in admin panel (#10240)
  • sync: include prescriptions in sync when patient_ongoing_prescription tick changes (#9608)
  • sync: retain errored snapshot tables for 24h and batch-clean overnight (#9646)
  • sync: Suppress sequelize hooks when persisting sync data (#9711)
  • sync: TAM-6834: Fix sync_lookup rebuild when there is custom where (MAIN) (#9958)
  • sync: TAM-6832: Change record_id to TEXT (MAIN) (#9953)
  • sync: Don’t attempt to sync if sync credentials are not configured (#9943)
  • sync: Avoid stack overflow in runFunctionInBatches on large batches (#10017)
  • sync: Order changelog FK targets (users) first during pull (#10018)
  • sync: Disable unsafe sync in central (MAIN) (#10305)
  • sync: TAM-6959: List FK issues in mobile sync (MAIN) (#10308)
  • sync: TAM-6962: record legacy sync credentials without needing central (2.61 FIX) (#10584)
  • sync: TAM-6962: record legacy sync credentials without needing central (ef2754b088)
  • sync: TAM-7013: Fix sensitive facility data (#10598)
  • sync: TAM-7013: Fix sensitive facility data (#10598)
  • sync: TAM-7103: Rebuild sync_lookup for models missing sensitive facilities filtering logic (#10619)
  • sync: Batch changelog insertion, avoiding OOM during persist phase (#10723)
  • tasking: fix task table icon formatting and alignment (#10653)
  • tasking: fix task name column truncation and width (#10673)
  • tasking: vertically centre the checkbox, status icon, and task name columns (#10699)
  • tasks: TAM-6990: Update font size (#10440)
  • tests: Flaky CentralSyncManager test (#9788)
  • tests: stop RefreshMaterializedView precondition from leaking across files (#9870)
  • translation: bulk-fetch existing rows in admin save to avoid N+1 (#9710)
  • translations: Allow TranslationOptions with getEnumTranslation (#10444)
  • triage: update reason for encounter when chief complaint is edited (#9935)
  • triage: update reason for encounter when chief complaint is edited (#9909)
  • triage: update encounter reason for encounter when chief complaint is edited (959543902e)
  • utils: parse repeat date as local time for ordinal weekday (#10334)
  • utils: net refunds out of printed invoice remaining balance (#10336)
  • web: Erroneously forwarded transient <LoadingIndicator> props (#9561)
  • web: Breadcrumb semantics & translations (#9685)
  • web: Untranslated copy & typographic fixes (#9457)
  • web: only remember email on successful login (#9709)
  • web: Suppressed non-404 error in <SurveyResponseDetailsModal> (#9740)
  • web: Inverted guard in <SurveyResponseDetailsModal> (#9749)
  • web: Erroneously forwarded <SurveyResultBadge> attribute (#9775)
  • web: Remove unsupported data-* props from <ClickAwayListener>s (#9763)
  • web: main hotfix: prevent encounter summary PDF render failures (#9827)
  • web: main hotfix: wait for PDF worker readiness (#9839)
  • web: Preserve user’s whitespace when displaying Multiline answer (#9823)
  • web: autocomplete crash when option label is nullish (#9883)
  • web: Draggable tab semantics (#9885)
  • web: Accessibly label table columns, icon buttons (#9890)
  • web: Ambiguous prop forwarding (#9779)
  • web: Erroneously forwarded transient props in <DiagnosisList> (8a2cd9874a)
  • web: Diagnosis list semantics & keyboard accessibility (#9891)
  • web: Accessibly label <BaseModal> ‘Close’ button (#9894)
  • web: Label <BaseModal> ‘Close’ button (03a0362ec1)
  • web: Make getSetting more referentially stable (#9895)
  • web: TAM-3992: CalculatedQuestion fields not showing result (#9917)
  • web: <TabDisplayDraggable> UI jank (#9925)
  • web: TAM-3996: form response change log (#9810)
  • web: Recently viewed patient list semantics (#10005)
  • web: TAM-4424: DisplayText question type (#9843)
  • web: TAM-3994: Time question type (#9841)
  • web: Translation & icon for ‘Delete’ & ‘Add complex chart’ buttons (#9924)
  • web: Default table cell border colour (#10037)
  • web: add outline border to MUI table cells (6add6f512c)
  • web: TAM-6783: Improve back button behaviour (#9893)
  • 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: stop imaging request save creating a blank result each time (#10282)
  • web: show error screen when vaccine form patient data fails to load (#10271)
  • web: use react-query v4 isLoading for user modal submit state (#10281)
  • web: escape regex metacharacters in translation search (#10280)
  • web: clear dependent report parameter when its category changes (#10286)
  • web: gate encounter panes read-only prop on the delivered name (#10273)
  • web: clear sample fields when lab collection time is cleared (#10287)
  • web: control table pagination and ignore stale fetch responses (#10288)
  • web: spread empty filter state in location bookings context (#10338)
  • web: sort related conditions ascending in program registry table (#10346)
  • web: validate only visible chart form questions (#10345)
  • web: clear encounter loading state when the fetch fails (#10339)
  • web: exclude triage-only certainty options outside triage (#10341)
  • web: stop TimeWithUnitField mutating shared time unit options (#10342)
  • web: handle missing normal range and zero minimum in lab tests table (#10337)
  • web: pass sensitive-medication permission to ongoing meds discharge table (#10343)
  • web: scope date selector arrow keys to the day strip (#10347)
  • web: clear stale frequency when switching task templates (#10348)
  • web: render report load-failure message without [object Object] (#10344)
  • web: Double slash in API requests (#10367)
  • web: Double slash in API request (6c4372665e)
  • web: Focus loss when typing in pharmacy order form ‘Quantity’ field (#10370)
  • web: TAM-6975: faulty rendering of FreeText questions as numbers in encounter ‘Charts’ tab (#10382)
  • web: Make table error messages honour theme colour (#10411)
  • web: clear leaked loading timer for superseded table fetches (#10620)
  • web: fix vertical separator line in remove program registry modal (#10633)
  • Bruno bootstrap serviceRequest filtering (#9679)- Date locale parse ordering (#9694)- Include imaging encounters in all outpatient encounter type checks (#9503)- Include 'other' sex value across sex checks in codebase (#9504)- propagate 2.52 fixes to main (#9878)- TAM-4047: remove static report permissions (#10102)- The flag always resets to false, so a second consecutive auth error signs (57ea8be4ea)

Configuration ⚙️

  • central: read lab-test publisher limit from task config (#10318)
  • central: read lab-test publisher limit from task config (#10318)
  • email: generalise sender-address config as mail.from (#9656)
  • mobile: reset preventSignOutOnFailure so auth errors sign out again (#10279)
  • scripts: read web replica counts from web options in deploy helper (#10335)
  • sync: TAM-6962: record legacy sync credentials without needing central (2.61 FIX) (#10584)

Database 📊

  • migration: Fix long backfillNoteTypeIds run time (#10605)
  • migration: Make addIndexToFhirJobsResourceColumn idempotent (#10613)
  • migration: fix fhir.job_worker_is_alive always returning false (#10631)
  • rebuild procedures sync lookup after assistant migration (0a81e9113c)- add time indexes to sync_sessions (#10473)- backfill null created_at/updated_at timestamps (#10539)- add missing indexes for hot API query paths (#10561)

Dependencies 📦

  • mobile: Remove extraneous depdency on @tamanu/shared (#10033)
  • scripts: Remove “run”-time dependency on rimraf (#10027)
  • Replace uuidCrypto.randomUUID() (except in @tamanu/mobile) (#10029)- TAM-6849: resolve dependency issues (#9921)- Consolidate actions/cache to v5 (#10042)

Documentation 📚

  • llm: Tighten translations rule for AI agents (#9691)
  • printing: chunked + parallel encounter record PDF rendering (#10061)
  • Add scope-tamanu-release-tests skill (.claude/skills) (#10177)- Add pre-release-checks skill (#10246)- Add upgrade-check and release-cutoff-checks skills (#10330)

Features ⭐

  • AI: TAM-2400: AI Encounter summary (#9861)
  • admin: COOL-52: Admin impersonate role (#9202)
  • adminPanel: NASS-1898: manage program registries (#9517)
  • adminPanel: NASS-1898: migrate to MUI v7 Tabs and Tab (#9527)
  • adminPanel: NASS-1898: migrate to MUI v7 Tabs and Tab (#9527)
  • backups: TAM-6752: Database backups (#9842)
  • bruno: 1 click fhir endpoint testing (#9671)
  • build: vite consumes shared package source for instant HMR (#10070)
  • db: COOL-57: replace migration chain with SQL baseline snapshot (#9572)
  • db: COOL-57: extend migration baseline snapshot to v2.41.5 (#9647)
  • db: TAM-6848: database–server version compatibility check (#10081)
  • docs: TAM-6985: E2E tests setup (#10416)
  • email: 2.51: add SMTP and other nodemailer transport support (MAIN) (#9675)
  • email: 2.51: add SMTP and other nodemailer transport support (#9653)
  • fhir: NASS-1868: Lab request rejected status (#9128)
  • fhir: NASS-1871: Allow SENAITE to create reflex tests via the FHIR API (#9119)
  • fhir: TAM-6749: Allow SENAITE to specify the Lab Result method via the FHIR API (#9753)
  • fhir: NASS-1883: Allow SENAITE to specify a custom reference range for a lab test (#9772)
  • fhir: NASS-1883: Added mobile migration for lab_tests reference range columns (#9785)
  • fhir: TAM-6792: Allow SENAITE to specify the Labratory Officer of a Lab Test via the FHIR API (#9794)
  • fhir: Offline FHIR Integrations (#9356)
  • formBuilder: SAV-1151: add configurable AI prompts (#9688)
  • invoicing: TAM-6825: add evaluationOrder to invoice price lists (MAIN) (#9930)
  • invoicing: TAM-6825: add evaluationOrder to invoice price lists (#9927)
  • invoicing: TAM-4428: default invoice item ‘Ordered by’ to supervising clinician (#9913)
  • invoicing: TAM-6897: fixed-price medications (#10109)
  • invoicing: TAM-6901: inpatient fee inclusions/exclusions (#10243)
  • invoicing: TAM-6898: FSM Invoicing Epic (#10121)
  • labs: NASS-1875: Lab result history (#8989)
  • labs: TAM-6840: update FHIR DiagnosticReport to set resultsInterpretation from conclusion field (#9997)
  • labs: TAM-6820: Support non-numeric reference ranges on individual lab tests (#9908)
  • medication: TAM-2044: Alow edit prescription (#10263)
  • medications: TAN-2622: Add dispense without labels button (#9809)
  • medications: TAM-6801: preset labels for dispensed medications (#9922)
  • medications: TAM-6813: dispensed medication label text formatting (#9939)
  • medications: TAM-6808: Split drug units into dosingUnit and dispensingUnit (#9914)
  • medications: TAM-6741: Medication dispensing quantity auto calc (#10451)
  • migrations: COOL-60: Preserve information about migrations (#9634)
  • migrations: add –dry-run to migrate and upgrade (#10144)
  • mobile: TAM-6846: Upgrade react native (#10079)
  • notes: TAM-2051: Add search bar to encounter notes (#10439)
  • patients: TAM-6786: Enhance emergency patients board (#10130)
  • pharmacyOrders: TAM-6739: Add setting to control the default prescription type when sending an order to the pharmacy (#9764)
  • pharmacyOrders: TAM-6739: Add setting to control the default prescription type when sending an order to the pharmacy (#9726)
  • printing: chunked + parallel encounter record PDF rendering (#10061)
  • procedures: TAM-6736: auto-populate department, area & location from encounter (#9910)
  • programRegistry: SAV-1117: Program registry PLTFU auto flag (#9330)
  • reporting: TAM-6862: Tamanu manages reporting/raw db roles (#10082)
  • security: add security.requireHttps setting to reject non-HTTPS clients (#10154)
  • settings: modal markdown editor for long ai prompts (#9681)
  • settings: SAV-1164: live cache invalidation across server and web (#9670)
  • settings: SAV-1165: settings secrets (#9109)
  • settings: date formatting locale setting and browser-locale plumbing (#9996)
  • sync: TAM-6863: facility sync-host setup workflow (#10124)
  • syntheticUsage: TAN-2608: Additional synthetic usage workflows (#9559)
  • web: TAM-3996: form response change log (#9810)
  • web: TAM-4424: DisplayText question type (#9843)
  • web: TAM-3994: Time question type (#9841)
  • web: TAM-3995: Signature question type (#9931)
  • web: TAM-6850: schema-aware setting inputs (select, editable list, length bounds) (#10011)
  • web: Support all recent Chromium browsers in gate (#10089)
  • web: configurable browser/device support gate (#10092)
  • web: make browser/device support gate configurable via settings (58450583a0)
  • TAM-3992: program form edit implementation (#9719)- Epic Gimmicky AI features (#9707)- support BIND_ADDRESS env var for server and frontend listeners (#10264)

Performance 🌊

  • build: TAM-6848: build CommonJS & ES modules in parallel (#10021)
  • build: TAM-6849: incremental TypeScript builds (#10023)
  • build: TAM-6849: parallelise internal package builds with Turborepo (#10035)
  • database: Faster Model.forResponse() (#9383)
  • labs: exclude sensitive labs with NOT EXISTS anti-join in worklist query (#10402)
  • mobile: Improve survey form performance on low-end devices (#9521)
  • mobile: Improve program form list load time (#10667)
  • shared: Short-circuit checkForOneOfPermissions (#10570)
  • tasking: drive clinician-tasks medication EXISTS from encounter (#10568)
  • web: Remove useless spread (#10358)
  • web: parallelise encounter load and trim redundant fetches (#10368)
  • TAM-2410: simplify medication helpers, narrow types, add test suite (#10255)- Avoid intermediate arrays when sorting (#10418)- Avoid redundant function calls in medication set select handler (#10425)- Initialise suggester options outside render cycle (#10426)- Short-circuit checkForOneOfPermissions (32dcc0e9bf)

Refactors 🛠️

  • alerts: split sync-errors into separate mobile and server alerts (#9871)
  • alerts: Remove all alerts (#9945)
  • buildTooling: Simplify ensureDirectoryExists (#10019)
  • database: break migration hooks into explicit named functions (#10453)
  • email: generalise sender-address config as mail.from (#9656)
  • scripts: Use util.parseArgs (#10026)
  • uiComponents: Break cyclic imports in translation utils (#9846)
  • uiComponents: Remove useless wrapper components (#10204)
  • web: Return stable references from usePatientNavigation (#9684)
  • web: Deduplicate <hr> styles (#10251)
  • web: Dedupe ad-hoc ‘required’ ornaments (#10400)
  • web: Dedupe patient allergies warning (#10428)
  • Tighten patient-issue-related constant types (80b73002c5)- Replace hextorgba() with relative colour syntax (#9716)- TAM-3993: form-response-adjacent hygiene (#9701)- Deduplicate <hr> styles (a3a035335f)- Dedupe ad-hoc ‘required’ ornaments (857425da1a)- Dedupe repeated horizontal rule definitions (#10433)

Repo 📖

  • llm: Slightly less contrived release branch list command (#10569)
  • web: render report load-failure message without [object Object] (#10344)
  • Narrow Kamaka codeowner gate to deploy workflows (#9708)- Embed node runtime in Windows packages instead of via npm (#10086)- embed official Node runtime in the Windows server pack instead of the node npm dep (0e8c6abc55)- TAM-4047: remove static report permissions (#10102)- Transitive dependency update skill (#10132)

Revert ⏪

  • ci: actions/cache keys (#10043)
  • db: COOL-57: replace migration chain with SQL baseline snapshot (#9572)
  • db: COOL-57: replace migration chain with SQL baseline snapshot (#9572)

Security ⚠️

  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • security: Dependency updates for security patches (#9612)
  • 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 🧪

  • central: accept numeric zero answers in survey response import (#10322)
  • centralServer: TAM-4038: admin /roles endpoints (#9892)
  • db: COOL-57: replace migration chain with SQL baseline snapshot (#9572)
  • e2e: authenticate both frontends in one Playwright session (#10013)
  • facility: return imaging area note content in update response (#10328)
  • invoicing: TAM-6897: fixed-price medications (#10109)
  • invoicing: TAM-6900: add route + auto-discharge coverage for encounter fees (#10537)
  • medications: TAM-6741: Medication dispensing quantity auto calc (#10451)
  • web: clear dependent report parameter when its category changes (#10286)
  • web: clear dependent report parameter when its category changes (#10286)
  • web: clear sample fields when lab collection time is cleared (#10287)
  • Update test timeout (#9593)- Epic Gimmicky AI features (#9707)

Tweaks ⚖️

  • E2E: Speed up vaccine E2E spec (#9648)
  • alerts: silence benign sync restart errors, alert on sustained restarts (#9872)
  • bruno: TAN-2531: Add device id to bruno login payload (#9664)
  • bruno: Add pdf to diagnostic report (#9761)
  • buildToolling: More legible, less verbose move-dts logs (#10020)
  • constants: TAM-2410: tighten medication types (#10111)
  • constants: Tighten medication types (f1f5b7b435)
  • database: disable sync tick trigger via fact during migrations (#10486)
  • database: reinstall updated_at_sync_tick trigger unconditionally post-migration (#10487)
  • e2e: Combine db setup for e2e shards (#9621)
  • e2e: Generate failure report when running from checkbox (#9750)
  • medications: TAM-6811: ‘Ordering prescriber’ copy updates (#9920)
  • medications: TAM-2412: Add medication routes (#10125)
  • medications: Use en dash to denote time range (#10429)
  • playwright: Include visual debug data in failed tests report when running locally (#9645)
  • review-hero: Add Save suppressions checkbox to PR template (#9700)
  • shared: More helpful 404 error messages (#10207)
  • translations: Ignore dist directories in scrapeTranslations (#9807)
  • uiComponents: Don’t stringify primitive errors in forms (#9377)
  • web: SAV-1168: rename “Encounter summary” button to “Encounter record” (#9692)
  • web: Explicitly default <table>s to tabular figures (#9776)
  • web: Use en dash in date range (#9918)
  • web: Loading spinner when marking patient for sync (#10110)
  • web: ‘can not’ → ‘cannot’ spelling (#10112)
  • 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: Set baseline popover inset (#10290)
  • web: Improve table reset (#10361)
  • Remove repetitive E2E tests already covered by endpoint tests (#9616)- Enforce E2E pass before merge (#9609)- restore E2E checkbox (#9746)- Narrow medication dosing, dispensing unit types (#10359)
Copied to clipboard!