Release Notes 3.4 (2025-05)

Release Notes 3.4 (2025-05)

🔦 Key Points

Release Information

  • Cut Date: April 21, 2025

  • Release Date: May 22, 2025

  • Release Manager: @Dennis Kigen

Key Features

  • Visit Context Switching: Retrospective data entry with visit context headers (implemented behind a feature flag)

  • Carbon v1.76.0 Upgrade: Updated design system across all apps

  • Standardized Date Pickers: OpenmrsDatePicker component implemented consistently

  • Age-Based Vitals Ranges: Smart clinical alerts based on patient age (requires Core updates)

  • Ward Management v1: New ADT workflow with bed assignment support

Deferred to Next Release

  • React v19 upgrade

⚠️ Breaking Changes:

  • Patient Chart data flow: Refactored how patient data flows through Patient Chart components. The usePatient hook now only runs once at the root level instead of multiple times throughout the component tree. This improves performance by eliminating redundant data fetching, but may break extensions that directly call usePatient instead of receiving patient data as props.

  • Migration: Extensions should receive patient data through props rather than calling usePatient directly. See @Ian Bacher's PR for implementation details.

Where to find it: Demo at o3.openmrs.org (credentials: username: admin, password: Admin123) or download here: openmrs.org/download/


👷 Contributors

Special thanks to the following community PR reviewers:

DIGI: @Ian Bacher
OpenMRS: @Dennis Kigen, @Jayasanka Weerasinghe, @nethmi, @Rafal Korytkowski, @Samuel Male
PIH: @Chi Bong Ho, @Mark Goodrich, @Mike Seaton
Palladium: @Donald Kibet, @Kennedy Makombe
METS: @jabahum, @Samuel Lubwama
MSF Madiro: @Joshua Nsereko, @Pius Rubangakene, @Vineet Sharma

Contributors

🙏 Thank you to all our amazing contributors - you make releases like this one possible! Listed by organization:

  • CSaude: @Yassin Nurmahomed

  • SolDevelo: @Oliver Lewandowski

  • ICRC: @Pedro Sousa @José Francisco @parthfloyd

  • Madiro: @Pius Rubangakene@Vineet Sharma

  • Mekom: @Brandon Istenes @Siddharth Vaish

  • METS: @jabahum @Isaac Akileng @JONATHAN AJAL ODORA

  • OpenMRS Support: @Dennis Kigen @nethmi @Daniel Kayiwa@Samuel Male @Veronica Muthee @Wikum Weerakutti @herman muhereza

  • Palladium-Kenya: @Kennedy Makombe @amosmachora @Donald Kibet @itskios09 @omosh

  • PIH: @Chi Bong Ho @Mark Goodrich @Mike Seaton

  • Thoughtworks: @rahu1ramesh

  • UW ITECH DIGI: @Ian Bacher @CLIFF GITA

  • Independent Contributors: @Juliet Wamalwa @Elisha Bantana @Wyclif Luyima @shettybharath @harshthkkr @chintu @mohamedalimefteh @atulyadav745 @Mutagubya Jonathan@Bawantha Rathnayaka @yugalkaushik @joseph kagimu @EDSONZ-WASSWA @jayg @xprlgjf @shivarm @vinayaksharma @dhruvchandak30 @siddhant singh @sarang @capernix

 

Contributor Metrics

image-20250521-194437.png

# PRs included: 266

# of Orgs involved: 10

% from OpenMRS Inc. Global Support: 27%

(Source)


🔦 Highlights for Implementers

📈 Smarter vitals alerts for Children / Pediatrics: Vitals like heart rate and respiratory rate now use age-appropriate thresholds for clinical alerts. A heart rate of 100 might be normal for a child but concerning for an adult patient—the system now knows the difference and can be further configured. This feature requires Platform 2.7; older versions will continue using the previous fixed thresholds.

Platform 2.7 introduced backend support for flexible concept ranges (thanks to @isaiahmuli's work in 3.3.0). Version 3.5.0 builds on this foundation by implementing age-based reference ranges for temperature, pulse, oxygen saturation, and respiratory rate. See the config file here: https://github.com/openmrs/openmrs-content-referenceapplication-demo/blob/main/configuration/backend_configuration/conceptreferencerange/conceptreferenceranges.csv

For Platform 2.7+ implementations: Use the new conceptreferencerange endpoint to fetch age-specific vitals metadata. This enables proper validation across the vitals header, data tables, and biometrics workspace forms.

For Platform 2.6 and below: @Daniel Kayiwa added fallback behavior so you'll continue receiving the previous hardcoded reference ranges—no changes needed.

 

 

🏥 Streamlined visit workflow: Redesigned how you navigate between patient visits with a new visit history table, context switching within workspaces, and support for creating visits with past dates. The interface is cleaner with visit controls moved to more logical locations.

@Chi Bong Ho delivered comprehensive visit workflow improvements:

Cleaner navigation: Consolidated visit controls into the patient header (removing the separate visit header) and moved the location picker to the main navbar for easier access.

Better visit history: Replaced static summary cards with an interactive table that shows visit details in expandable rows with customizable columns.

Flexible visit context: Added the ability to switch between different patient visits while working in charts and forms—especially useful for entering historical data when the Retrospective data entry feature is enabled.

Enhanced visit creation: The visit form now supports creating new visits, continuing existing ones, or adding past visits with proper date validation.

📝 Easier form creation: Users can now set concept mappings directly in the interface (previously required manual JSON editing), add helpful tooltips to questions, and control whether form sections start expanded or collapsed.

Concept mapping selection: Form builders can now choose their preferred concept mapping (like CIEL:5090 instead of 5090AAAAA) directly in the Create/Edit question modal, eliminating the need to manually edit form JSON. Only SAME-AS type mappings are available for selection (courtesy of @jayg).

Section expansion control: Set whether form sections start expanded or collapsed by default when creating or editing forms (courtesy of@jayg).

Restored tooltip functionality: Re-added the ability to enter tooltip text that appears when users hover over question info icons (courtesy of @mohamedalimefteh).

Performance improvements: Smoother patient data updates and patient registration edit flow.

Faster patient data loading: @Ian Bacher fixed a performance issue where patient information was being fetched multiple times simultaneously, causing slow page loads and UI lag in the Patient Chart. Patient data now loads once and gets shared across all chart components, making navigation noticeably faster.

Registration form responsiveness: @Dennis Kigen fixed sluggish performance when editing existing patient records using the registration form. The form previously felt slow and unresponsive during typing—updates now happen instantly without delays or lag.

⬆️ Updated design system: Upgraded to the latest Carbon design components for better consistency and visual polish across all apps.

Upgraded Carbon design components to v1.76.0, bringing visual consistency improvements and better performance across all apps. This modernization effort included migrating to updated component APIs, standardizing spacing and typography with Carbon's design tokens, and optimizing stylesheets for faster loading. Users will notice more polished interfaces and smoother interactions throughout the system.

✏️ Edit and delete vitals and biometrics: You can now modify or remove incorrect vitals and biometrics readings directly from the data tables. Important: Deleting removes both vitals AND biometrics from that encounter since they're recorded together.

@Samuel Male delivered a major clinical workflow improvement that was previously missing from O3:

Edit vitals and biometrics: Click the overflow menu on any existing record to modify values directly. The form pre-populates with current data for easy correction, and changes update in place without creating duplicate entries.

Delete erroneous data: Remove bad readings through the overflow menu with confirmation prompts to prevent accidental deletion.

Critical behavior: Editing or deleting affects both vitals AND biometrics together since they're recorded as a single encounter, even though they appear in separate tables.

This allows clinicians to correct data entry mistakes and remove erroneous readings that could impact clinical

🗓️ Consistent date pickers: All date input fields now use the same standardized date picker component, ensuring consistent behaviour and better support for different languages and calendar systems.

@Ian Bacher Building on @Ian Bacher's custom OpenMRS datepicker from 3.1.0, this release standardizes all date input fields to use the same component. Users now get consistent date picker behavior across the entire system, with improved internationalization support and better handling of different calendar systems. This foundation enables future enhancements like enhanced input validation and expanded localization features.

🛏️ New ward management: Added a complete ward app for managing patient admissions, discharges, and transfers between locations. Includes optional bed assignment features and a separate bed management interface for configuring ward layouts.

Setup requirements: See the Ward app’s README for installation prerequisites and the Bed Management app README for configuration details.

 


📸 Example Visual Changes

 

image-20250509-122826.png
Age-Based Reference Ranges for Vitals
image-20250509-081808.png
Select a concept mapping as the concept ID
image-20250509-085034.png
Support in the Dispensing view for displaying active conditions and visit diagnoses
image-20250509-072628.png
Start RDE visits with both start and end dates
image-20250509-071313.png
Visit Context Header with a Visit Switcher
Ward app displaying admitted patients
Bed management for a ward

 


🔍 Changelogs