DHIS2 Version 2.39 & Android App 2.7 are released

Dear all,

DHIS2 version 2.39.0 and the Android App 2.7 are out with many new features, improvements and bug fixes.

You can log in and test them out on the demo server

Web admin / district
Android android / Android123


Legend sets for line lists: The line listing app you can now apply a legend to data items. Legends can be predefined or automatically generated. This allows you to make your data more easily interpretable by applying a color coding to indicate performance, status or severity.
Screenshot | Jira

Scheduled date in line lists: Scheduled date is made available as a time dimension in the line listing app. You can now present or filter data by scheduled date.
Screenshot | Jira

Earth Engine population data import: In the import export app you can now import data sets from Google Earth Engine. DHIS2 already allows visualizing Earth Engine layers in the maps app. The new importer takes this further by allowing for dynamic calculation of population data sets based on org unit geometries, and subsequent import of the population data as raw data in DHIS2. This will allow implementations to use the population data from Earth Engine in DHIS2 visualizations and combine it with other data sets as part of indicator expressions.
Screenshot | Jira


Continuously released Capture app: The Capture app was released shortly after the 2.38 release on the App Hub, and is now continuously released in 2.38 and 2.39. If you are running any of these versions you will be able to continuously upgrade to the latest version of the Capture app and receive the following features and fixes. The following tracker features are all available in both the 2.38 and 2.39 versions though the App Hub.

Enroll TEI in multiple programs: A tracked entity instance (TEI) can now be enrolled in multiple programs in the Capture app.
Screenshot | Docs | Jira

Open data entry after erollment: When enrolling a TEI into a program where one of the program stages is marked to be opened after enrollment, the user is taken directly to the form for adding that program stage to the enrollment. This is useful for reducing the amount of clicks and speeding up the data entry process.
Docs | Jira

Display front page lists: The front page list view can now be disabled in the Capture app. After selecting the program and org unit, the user can be taken directly to the search screen instead of displaying the list of tracked entity instances enrolled in the org unit. This will improve the user experience when users are expected to primarily search and find tracked entity instances. Avoiding unnecessary loading of the front page list also has performance benefits.
Docs | Jira

Working lists in search screen: In the Capture app, the search screen will now show working lists for the selected program. This is helpful when the user either wants to search for a tracked entity instance or in some cases use a targeted working list. This works well in combination with disabling the front page list and instead directing a user to the search page, but also for allowing one-click access to working lists.
Screenshot | Docs | Jira

See previous selected org unit: In the Capture app, a user that just deselected an org unit in the context selector will see the previously selected org unit highlighted. This is useful when working systematically through many org units.
Screenshot | Jira

Preserve filters on navigation: When filtering and sorting a working list in the Capture app, the filter selections will now persist through context switches. This is useful when a user needs to apply a filter across different org units as the org unit can be changed without losing the current filter and list settings. This works both with saved working lists and with unsaved filters.

Improved search in all programs: When searching for a tracked entity instance in a specific program, the search might not yield any result in the context of the program. In this case the user can expand the search to look for a tracked entity instance in all programs. The expanded search happens without the user changing the context, and the possible expanded search results is displayed below the original program results. This allows the user to easily revise the search criteria and continue working in the context they started in, potentially expanding the search again if no results is found in the program.
Screenshot | Docs | Jira


New data entry app: A new aggregate data entry app is now available. The new app is built on the new modern technology stack and brings a number of usability improvements. The data set, org unit and period selection is always visible, making it easy to see the current selections. The org unit tree makes it easy to see which org units are open for data entry for the currently selected data set. The details of a data value, including metadata info, comments, min and max limits, data value history and audit log are available in a sidebar and can remain visible while doing data entry. Data validation rules will open and can be easily triggered in a sidebar as well. Data which is captured offline will be automatically synchronized with the server. The new data entry app supports custom HTML forms but lacks Javascript/CSS support, which may be added later. The current data entry module will be phased out and removed in version 2.41.
Screenshot 1 | Scr 2 | Scr 3 | Scr 4 | Demo | Docs

User group management: The user group management in the user app now supports adding and removing users for databases which contain a large number of users. Users can be added and removed individually and the modifications will take effect when the user group is saved.
Screenshot | Demo | Docs

Multiple org unit geometries: DHIS2 can now store and visualize multiple geometries for org units. This is supported through a new metadata attribute GeoJSON value type. GeoJSON data can be imported through the metadata importer and stored using the new value type. This allows for example for displaying both the location (as a point) and the catchment area (as a polygon) for org units.
Screenshot | Demo

GeoJSON geometry import: A new import service supporting the industry standard GeoJSON format for geospatal data is now available. The importer allows for importing GeoJSON geometry and associate it with org units, using the org unit primary geometry field or custom metadata attributes of value type GeoJSON. The GeoJSON format is supported by most geospatial tools and services and enables integration with external systems. The new importer makes importing geometries and setting up maps a lot easier compared to the previous GML format.
Screenshot | Demo | Docs | geojson.org

Aggregate data exchange: A new service for aggregate data exchange allows for exchanging data from one DHIS2 instance to another, as well as within a single instance of DHIS2. The service will aggregate data in the source instance using the analytics engine, and import the data as aggregate data values in the target instance. Data exchanges can be triggered from the API, from the data exchange web app or run as a scheduled job. This is useful for transferring data from an HMIS instance to a DHIS2 data portal instance, to import aggregated numbers into a DHIS2 HMIS instance based on individual records in a DHIS2 tracker instance, and to pre-compute aggregate numbers based on individual tracker records using program indicators. A new web app named Data exchange will be made available from the App Hub shortly.
Screenshot 1 | Scr 2 | API docs | Jira | Web app coming soon

Redis for cluster management: When running DHIS2 in a cluster (using multiple servers/nodes for a single instance), Redis can now be used for dynamic invalidation of caches across instances. This is an improvement over the Debezium-based approach introduced in 2.38 as it is more reliable and works on other database engines beyond standard PostgreSQL such as AWS RDS. The new cluster management solution allows for adding and removing nodes dynamically without any updates to the DHIS2 configuration files of the existing nodes. The new solution requires Redis to be available, though Redis is already required for cluster configurations.

RapidPro integration: The DHIS2 - RapidPro integration is generally available. It allows for synchronization of RapidPro contacts with DHIS2 users, transfer of aggregate data reports from RapidPro to DHIS2 and reminders to RapidPro contacts when aggregate reports are overdue. Read more at the GitHub repository and contact the DHIS2 integration team for assistance if you are interested in configuring the integration for your country or organization.


Shorthand fields notation for attributes: A new shorthand notation is supported for attributes and values in the metadata endpoints, and attribute values can now be conveniently referred to using the metadata attribute identifier: filter={attribute-id}:eq:{value}. The same applies to object filtering, where the attribute identifier can be used in filters: filter={attribute-id}:eq:{value}.
Docs 1 | Docs 2 | Jira 1 | Jira 2

Data entry endpoints: A collection of API endpoints optimized for the new data entry app is made available. These endpoints are also useful for custom data entry web apps. These include retrieving metadata for accessible data sets, retrieving custom data entry forms, retrieving data values for a form, retrieving context for a form, saving min-max limits and completing a form.

API improvements: Several incremental API improvements have been made available.

  • CSV data value import supports a data set parameter, allowing for completing the data set.
    Docs | Jira
  • In the user data store API, an admin can modify data store values for other users through a username query parameter.
    Docs | Jira
  • The data value importer only creates an audit record if the data value was actually modified (identical values are ignored).
  • The tracked entity audit endpoints support org unit, start and end date and program stage query parameters.
    Docs | Jira
  • All geometry data for org units can be removed in a single API call, which is useful for integration. Docs | Jira
  • Metadata attribute values are now properly validated based on the value type of the associated data element.
  • Deletion of data elements is significantly faster.



Increase tappable areas in icons and buttons: Some buttons or tappable labels of the Android App had small sensitive areas for the user to tap. The whole user interface was reviewed and the tappable areas has been increased. For example the “+” button to create a new stage or the “v” icon to open TEI details or expand a section.
Jira | Screenshot | Documentation

Clean data entry forms: The input fields had a hint message saying “Insert value here” which remained there after the values was entered. We have kept the hints when the field is empty, but they disappear now once the value is entered by the user.
Jira | Screenshot | Documentation

Simplify steps to create program stage: When the user groups the events per program stage in a tracker program, the option to create a stage was only visible when the events of the specific program stage where expanded. In this version, the option to create a new event is always visible. When the user taps on the button, that program stage will unfold showing to the user all the already existing events of that particular program stage. In addition to this, when there is only one option based on the program configuration, the available program stage is selected automatically and program stage selection step is skipped.
Jira 1 | Jira 2 | Screenshot | Documentation

Share button in TEI dashboard in secondary menu: The TEI dashboard had a “Share” button which was using a significant space on the screen and not align with the visual design of the app while the function is very marginally used. The button has been removed and the functionality to share a TEI through QR code has been located on the three vertical dot menu, at the top right corner of the screen.
Jira | Screenshot | Documentation

Intuitive navigation for event sections: The accordion navigation of form sections was confusing for some some users and the next action after completing the last field of one section was not intuitive. This version of the app includes a “next” button at the end of each section which calls the user to action. The function of the button is to close the current section and open the new one.
Jira | Screenshot | Documentation

New input dialog for data sets: When the user in entering data in a dataset, the keyboard opens overlapping most of the screen and the dataset table. The new text input dialog opens an input field above the keyboard which shows the data element name, and category options of the field being selected, ensuring the user does not lose context when navigating the tables during data entry.
Jira | Screenshot | Documentation


New legend style on tables: The style for legends in tables has a new design which ensures good contrast and visibility independently from the selected color for the legend.
Jira | Screenshot | Documentation

Implement missing aggregation functions: The following aggregation functions are supported now in local analytics: LAST, FIRST, AVERAGE_SUM_ORG_UNIT, LAST_AVERAGE_ORG_UNIT, LAST_IN_PERIOD, LAST_IN_PERIOD_AVERAGE_ORG_UNIT, FIRST_AVERAGE_ORG_UNIT
Jira | Documentation


Open home after syncing metadata: When a user opens the app for the first time, the app will download all metadata and data, including file resources. Depending on the server and configuration, on the server resources and on the internet connection, this process can take a lot of time. Until this version, all these happened on the splash screen and the user had to wait during all this time. In this new version the app will remain in the splash screen during the metadata download and will open the home screen once the metadata is in the device. In the home screen, the app will inform with a loading spinner on each program when the data is downloading and when is ready. The user will be able to see which programs are downloading data, making the waiting process more informative.
Jira | Screenshot | Documentation

Do not make full sync when opening the app: Previously, when a user opened the Capture app, the application would launch a sync process for data and metadata, to ensure the app was in sync with the server. In most cases and locations this process was very slow. In order to facilitate the work in the most difficult cases, we have removed that sync process. When the user opens the app, even if s/he logs out and logs in again, the app will open without performing a full sync. Users have the option to sync with the server through the “refresh” button any time they wish.
Jira | Documentation


Manage ownership in permanent referrals: When a user makes a permanent referral of a TEI, the ownership will be updated accordingly.
Jira | Documentation


Upload SMS APK: The app available in Google Play includes SMS functionality. In previous versions, this functionality was only available on an APK available in GitHub.


Release Information Link
Download release and sample database Downloads - DHIS2
Upgrade notes Upgrade notes on GitHub
Full list of features and bugs Web Release Notes
Source code on Github DHIS2 · GitHub
Docker image docker pull dhis2/core:2.39.0
Docker Hub images Docker Hub
Android App in Google Play or Github Google Play - Github
Android App full list of features and bugs Android Release Notes
Android App Source code on Github DHIS2 Android App · GitHub
Android SDK Source code on Github DHIS2 Android SDK · GitHub
Documentation https://docs.dhis2.org
Demo instance DHIS2 Demo - Sierra Leone
Community forum https://community.dhis2.org/

Thank you!

DHIS2 Core and Android Release Teams


Congrats to the whole team working on this release, I know a lot of effort was put into it and it shows! Can’t wait to see what the community will do with this release!


Hello @phil, this is really interesting. Very interesting updates.

Thank you everyone for a great job.

I think someone has changed the password for the demo site and I cannot log in to view the updates. I tried to create an account for myself but it gives very limited access to the platform:

Can someone help us reset the password?

@Gassim @dhis2-backend

1 Like

Hello, please can someone help? The default username/password is not working.


Thanks for flagging the issue with the demo. I’ll look into that now!

We have reset the database on the demo, so you should be able to log on with admin user again now.

1 Like

Congratulations :tada:

1 Like


Please note that Event Data import does not work in 2.39 (and not in 2.38 either) - it just hangs. You can replicate it by exporting some 2-3 years of event data from the SL demo, event program inpatient & outpatient mortality. Export for instance as .csv, then try to import the exported file into the same demo instance again - it just hangs. Nothing in the tomcat log. The same event data export file that imports without problems in earlier versions don’t import in 2.38 & 2.39. So it looks like a regression bug.

Hi @Calle_Hedberg

The Event import is an open issue on a few versions at the moment.
Thank you for flagging it; hopefully we will get this fixed for later maintenance patches.

Kind regards,

Hello. Please who is the best person/are the best people to talk to about the android app?


Please create a topic post. Someone from @dhis2-android will respond to your post.

Thank you!

1 Like

2 posts were merged into an existing topic: DHIS 2.39.0 page goes blank after logging in

Thank you for the release, I can see event reports can now be downloaded.
Is 2.39 compatible with the Android 2.6 Capture App?

Hi @WaluQ ,

Android 2.7 Capture App has been developed with DHIS2 2.39, and is fully compatible.
Android 2.6 Capture App is not compatible with DHIS2 2.39.
Android 2.7 Capture App is compatible with DHIS2 2.38, so it is possible to roll out Android updates before the DHIS2 upgrade.

I hope that helps.

Kind regards,

1 Like

Thank you @phil , was planning to upgrade DHIS2 before rolling out the new app. This is very helpful.

A post was merged into an existing topic: DHIS 2.39.0 page goes blank after logging in

A post was split to a new topic: Android app OU filter (events)