DHIS2 version 41 and Android Capture 3.0 are now available!

Dear all,

DHIS2 version 41 and Android Capture 3.0 are out with many new features, apps and improvements. This is our first yearly release and includes more than 500 bug fixes and over 200 features of various size!

Log in with admin / district on the demo server to check it out for yourself!


  • Capture App now has all of the features of Tracker Capture, and more!
  • Line Listing App supports listing Tracked Entities which are enrolled in multiple programs
  • Android Capture App analytics now supports line lists that are updated while offline
  • More than 500 bugs fixed, thanks to the strong focus on maintenance and targeted bug-fixing activities for this release

Major updates by component


New, customizable version of the Login App [ROADMAP-46]

A new login app built on React is introduced. This app provides customizable configuration options, allowing for easy customization of the login experience to match your specific context.


Maintenance App redesign MVP [ROADMAP-47]

Introducing the first preview of the completely new Maintenance App. In v41 we are releasing the data element sections with new modules continuously introduced as they are developed. The updated features include advanced filtering options, bulk sharing capabilities, and a sleeker user interface.

System wide features

Option sets multi-select support for individual data [ROADMAP-72] [DHIS2-16211]

DHIS 2 now supports the selection of multiple options for datasets for both aggregated and individual multi-select data elements. They will also be available for analysis through indicators and program indicators.

Custom Icons

DHIS 2 now allows uploading custom icons, expanding beyond the built-in library, to allow for context-specific icons such as those used by the Ministry of Health or NGO, as well as expand the availability of icons for non-health-related areas. These icons are available across the web and Android, and are configured via Maintenance DHIS2 Web App.

Aggregate Data Entry

Custom Forms [ROADMAP-44]

We are adding more configuration options to the aggregate data entry form to allow you to customize the look and feel of the data entry form without building a custom HTML form. We have started with the option to pivot categories as rows and have data elements as columns or move a category to a row. You can now also add rich text fields before and after a section.

Capture (web)

Capture App Feature Parity with Tracker Capture

The Capture and Tracker Capture apps are now considered to be on feature parity. This means that the software development team is not adding any further functionality to Tracker Capture, only fixing critical/security bugs if discovered. The Tracker Capture app and old tracker endpoint are now deprecated, and will not be bundled into v42.

Since the Capture app is on continuous release, you can also use this app from 2.38 and above. There are certain features that have needed new backend dependencies, but if those are not required for you, you can use the app management app and update the app to newer versions on 2.38 and above.

The features that need specific backend versions are the following:

  • Change log, previously audit log (v41 and above)
  • Image thumbnails in working lists, forms, and widgets (Currently v41, but will soon be supported for lower versions)

There are also several features that are only available in the Capture app which we hope will encourage you to test it out. These include:

  • Working lists: The ability to configure, save, and share working lists in the UI itself (Rather than through API as in Tracker Capture), including program stage working lists.
  • Scheduling: The ability to use program rules to calculate the next scheduled date (assigned to a data element) which can then be used as the default date when scheduling. (Docs)
  • Configure widgets and layout: Similar to Tracker Capture, but done in the data store, meaning it will be the same for all users and stay consistent, with the possibility to have a different layout for the Enrollment Dashboard and the Program stage event workspace.

Relationship improvements

The relationships widget is updated for the Capture app with various improvements

Inheritable attributes for relationships

When creating a tracked entity through a relationship, tracked entity attributes configured with “inherit” will be pre-filled with values from the source tracked entity in order to reduce data entry burden and improve data quality

Growth chart widget based on WHO Child Growth Standards

The Capture App now includes a growth chart widget for individual tracked entities, based on the WHO z-scores for:

  • Head circumference for age
  • Length/height for age
  • Weight for age
  • Weight for length/height

Download working lists

You are now able to download working lists in the Capture app in JSON and CSV format.

Mark tracked entities for follow up

Individual tracked entities in working lists can now be marked for follow-up, and filtered to provide a list of all designated for follow-up.

Related Stages Widget

The referral widget has been updated and renamed the “Related Stages Widget” in the Capture app with additional functionality and improved user experience.

Ownership transfer between org units

In order to support referral workflows and correct attribution in analytics, we have completed the ownership transfer of enrollments between org units. The ownership transfer overwrites the ownership field of an enrollment, while preserving the enrolling org unit and event org unit fields

[Allow one time referrals between org units]

One time referrals are now supported in the Capture app, allowing for a selected org unit to access an enrollment without overwriting the ownership field.

Images displayed in working lists

Image attributes can now be displayed in working lists, to easier enable identification of tracked entities for use cases such as patient identification; inventory management; lab equipment monitoring; etc.

Image preview

Uploaded images can now be previewed in both the event page and profile widget

Enhanced changelog

Various improvements to the change log, including sorting and filtering in order to provide important information about when a value was created, changed or deleted and by which user.

Formfield and dashboard plugins in the Capture app [ROADMAP-191]

As a part of the platform strategy to support greater customization and external development, we have added extension points to the Capture App allowing DHIS2 application developers to inject custom plugins in the data entry form as well as the enrollment dashboard. For an example of this in action, see the new growth charts and documentation, which were built using these same extension points.

API harmonization: Harmonized names and parameters in /tracker API

We have completed a full review of the tracker API and made significant changes in order to harmonize names and parameters for consistency and ease of use. These improvements include some breaking changes that should be noted and addressed. See details in the README, as well as the documentation.

Verbose logging for program rule debugging

You can now append &verbose=true to the end of a query in order receive more information for debugging and testing program rules.

Android Capture 3.0

Line listing analytics in Android [ROADMAP-206]

Android App now supports offline line-listing analytics. Created in DHIS2 web app, configured in Android Settings Web App (ASWA). Displayable on home screen and event/tracker programs; searchable by period, Org. unit, or custom columns.

Support for customized tracker terminology [ROADMAP-201]

DHIS2 now allows customizing tracker terminology like “event” and “enrollment” for end users’ familiarity. Admins can configure it per program via the Maintenance App, and the Android Capture App reflects these custom terms.

Improve end-user config error feedback [ROADMAP-296]

The Android Capture app now provides clear and explicit error messages for configuration issues, enabling effective communication between users and administrators to promptly resolve empty screen problems caused by empty forms or lack of access.

Improve App behaviour when working in offline mode [ROADMAP-295]

Android App now notifies users when actions requiring internet connection are tapped without connectivity. Improves behavior of non-responsive parts like sync buttons when no connection is available.

Improvements in tracker programs data entry flow [ROADMAP-294]

Improved tracker program user flow with confirmation dialog for TEI deletion, redesigned scheduling event dialog, streamlined org. unit selection for single access pre-filled, and program rule “Hide program stage” alignment with Capture web.

New Inputs for value types in Android App [ROADMAP-293]

Redesigned inputs for all value types in v2.10, improving data entry. Signature input and complete legend description enhance the experience. New fields have default settings, and admins have the option to opt-out via the Android Settings web app.

Configurable basemap layer [ROADMAP-209]

DHIS2 Android App now supports custom map layers configured in Maps Web App. These layers are downloaded and displayed alongside default ones, enhancing mapping capabilities.

Improve app navigation performance for high number of TEIs [ROADMAP-208]

Implementations are more and more demanding in terms of offline need of individual records. This version of the app has been reviewed to optimize performance when there are big numbers of TEIs downloaded locally.

Improve TEI dashboard user experience [ROADMAP-205]

TEI dashboard’s bottom part, displaying program stages, revamped for a cleaner look. Events list now offers more space, less non-critical info. Plus, create event button relocated to top (timeline view).

Improvements in forms layout [ROADMAP-204]

In this version, event/enrollment details like event date, org unit, coordinates, and category combinations are integrated within the form. They’re readily accessible as the first section, collapsed after filling for efficient data collection.

Improve TEI search user experience [ROADMAP-203]

Search form improved for cleaner, intuitive experience. Buttons now explicit for search/creation. TEI search with barcodes streamlined: Unique result opens TEI Dashboard; multiple results show TEI list; no results prompt creation or external search.

Import/export Android App DB [ROADMAP-210]

Users can export an encrypted local database for troubleshooting, allowing admins to import the exact environment. This aids in diagnosing sync issues and ensuring data integrity. Access to the exported database requires credentials for security.


Vector tiles as external layers [DHIS2-11960]

Vector files can not be imported into DHIS2 and displayed in the maps app. This allows for greater flexibility in displaying geographic data from other sources in the maps app.


Dashboard email push [ROADMAP-149] (Scheduled for 41.1)

Replace the legacy push analytics service with more modern functionality which uses the same visualization engine as the web-based visualization apps. Allow dashboards to be rendered on the server and sent to a user’s email, respecting sharing settings.

Data Visualizer

Cumulative values in pivot tables [ROADMAP-147]

Data Visualizer application now supports the “cumulative values” setting for pivot table visualization types in v41. Each cell in the table displays the sum of the value in that cell and all preceding values in the same row.

Outlier tables in Data Visualizer [ROADMAP-146]

The Data Visualizer application in v41 introduces support for outlier tables as a visualization type. This enhanced functionality replaces and improves upon the legacy outlier tables that were previously available in the WHO Data Quality application.

Line Listing

Tracked Entity / cross program line lists [ROADMAP-143]

The Line Listing app now supports the creation of line lists for tracked entities which allows for creating a list of tracked entities that are registed or enrolled in multiple programs. This includes the ability to add and filter on data from different programs that tracked entity is enrolled in and/or view attributes of tracked entities that are shared across programs.


Scheduled job queues configuration UI [ROADMAP-43]

In v41, the Job Scheduler app now allows configuration of grouping jobs to run in sequence or in parallel. This functionality, previously added in v40 via the API, can now be easily configured through the app interface.

Scheduler app declarative architecture [ROADMAP-37]

Introducing a new simple scheduler based on the current database state, running asynchronously to execute task configurations. This eliminates issues with the previous “black box” approach, ensuring the job triggers as specified in the configuration.

Data Exchange

Aggregate Data Exchange configuration UI [ROADMAP-42]

The Data Exchange app has been updated to allow for creation and editing of the data exchanges directly within the app. You can manage data exchanges by listing, editing and removing them. This makes it much easier to set up exchanges and transfer data or convert tracker data into the aggregate model.

Data Administration

Integrity Check Configuration UI [ROADMAP-41]

The Integrity check app has been given an extensive update, allowing individual check runs, separating longer checks, and providing informative recommendations.


New “Form Field” and “Enrollment Dashboard” plugin types in the Capture App [ROADMAP-191]

(experimental) Additional plugin types can now be bundled in DHIS2 web apps, allowing Capture App functionality to be easily extended. These widgets can be installed in the App Management App and can be configured for different programs in the Data Store.

Expanded support for all HTTP methods in the Routes API [DHIS2-16921]

The Routes API, introduced in DHIS2 v40, has been expanded to support all HTTP methods. It was previously restricted to only forward GET requests to upstream targets.

Partial and rolling updates in Data Store and User Data Store APIs [DHIS2-17469]

(experimental) It is now possible to apply partial updates to keys in the Data Store and User Data Store. When applying a partial updates, items can be appended to array type keys. It is also possible to optionally specify a maximum size in the “roll” parameter which will discard items from the beginning of the array if its size exceeds the maximum after the new item has been appended. This is an experimental feature which may be updated in future DHIS2 releases.

Query aliases to shorten long API request URLs [ROADMAP-217]

(experimental) To work around issues with too-long DHIS2 API request URIs, causing HTTP 414 URI Too Long errors, it is now possible to create short-lived query aliases. A query alias is a shortened API path which is mapped to a specific longer path on the DHIS2 server. Query aliases can be deterministically created and then reused until they expire. This is an experimental feature which will be expanded, supported by the App Runtime, and leveraged in DHIS2 frontend apps such as the Data Visualizer in future releases.

Global App Shell [ROADMAP-190]

(experimental) A global app shell can be optionally installed, which will be served independently of individual applications. The global shell will ensure consistent headerbar and command pallet as well as other common global functionality such as alerts, session management, and more. This is an optional and experimental feature which will be expanded in future releases.


This is exciting, the database renaming will make life more straight forward. Great job done! :clap:


Thanks for the update. I hope many bugs are fixed!
On the Demo server the Icons on the Capture App Programs are corrupted (I used incognito window).


Hi @antonia ,

Thanks for flagging that - it seems to have been something wrong with the deployment of our demo. I’ve re-deployed and the icons are looking correct now.


Great release with exciting features especially for tracker users. congrats to the devteam


Thanks @phil for your quick resolution of the problem, now the icons are OK!


Hello @phil and others

Is anyone else getting the below error, I did upgrade jdk to 17 using tomcat 9

War file not getting exploded when i took from https://releases.dhis2.org/41/dhis2-stable-41.0.0.war

“Caused by: java.util.zip.ZipException: zip END header not found”

<2>    at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:143)
<2>    at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
<2>    ... 44 more
<2>Caused by: java.io.IOException: java.lang.reflect.InvocationTargetException
<2>    at org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:209)
<2>    at org.apache.tomcat.util.compat.JreCompat.jarFileNewInstance(JreCompat.java:226)
<2>    at org.apache.catalina.webresources.AbstractSingleArchiveResourceSet.initInternal(AbstractSingleArchiveResourceSet.java:140)
<2>    ... 45 more
<2>Caused by: java.lang.reflect.InvocationTargetException
<2>    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
<2>    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
<2>    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
<2>    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
<2>    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
<2>    at org.apache.tomcat.util.compat.Jre9Compat.jarFileNewInstance(Jre9Compat.java:206)
<2>    ... 47 more
<2>Caused by: java.util.zip.ZipException: zip END header not found
<2>    at java.base/java.util.zip.ZipFile$Source.findEND(ZipFile.java:1633)
<2>    at java.base/java.util.zip.ZipFile$Source.initCEN(ZipFile.java:1641)
<2>    at java.base/java.util.zip.ZipFile$Source.<init>(ZipFile.java:1479)
<2>    at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1441)
<2>    at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:718)
<2>    at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:252)
<2>    at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:181)
<2>    at java.base/java.util.jar.JarFile.<init>(JarFile.java:346)
<2>    ... 53 more
<6>Deployment of web application archive [/home/risington/tomcat-dhis/webapps/ROOT.war] has finished in [13] ms
<6>Starting ProtocolHandler ["http-nio-8080"]
<6>Server startup in [35] milliseconds```

HI @jthomas ,

We haven’t seen that, but to be honest for our deployments we unpack the war file before starting Tomcat in order to limit the amount of access that the process running Tomcat has; This is considered good practice, particularly for production environments.

Nevertheless I’ll look into the issue you are reporting, as it should still be possible for Tomcat to deploy the war.

Kind regards,

1 Like

Hi @phil please ignore this issue i reported, it turned out my file got corrupted while downloading.

My apologies


Hi @phil

Thank you and the DHIS team for the job done.
I wanted to test version 41 before to upgrade, and installed it on the local machine.
When I run analytics, have received following errors messages:

2024-06-01 18:51:06 StatementCallback; SQL [create index in__ax_ae3o6seyewn_2007_GmLGu on analytics_tei_events_ae3o6seyewn_2007_temp using btree(eventdatavalues);]; ERROR: index row size 4448 exceeds btree version 4 maximum 2704 for index in__ax_ae3o6seyewn_2007_GmLGu Detail: Index row references tuple (0,1) in relation analytics_tei_events_ae3o6seyewn_2007_temp. Hint: Values larger than 1/3 of a buffer page cannot be indexed. Consider a function index of an MD5 hash of the value, or use full text indexing.; nested exception is org.postgresql.util.PSQLException: ERROR: index row size 4448 exceeds btree version 4 maximum 2704 for index in__ax_ae3o6seyewn_2007_GmLGu Detail: Index row references tuple (0,1) in relation analytics_tei_events_ae3o6seyewn_2007_temp. Hint: Values larger than 1/3 of a buffer page cannot be indexed. Consider a function index of an MD5 hash of the value, or use full text indexing.
2024-06-01 18:51:06 StatementCallback; SQL [create index in__ax_ae3o6seyewn_2021_QUghT on analytics_tei_events_ae3o6seyewn_2021_temp using btree(eventdatavalues);]; ERROR: index row requires 9000 bytes, maximum size is 8191; nested exception is org.postgresql.util.PSQLException: ERROR: index row requires 9000 bytes, maximum size is 8191

and this is only part of error messages.

Do you have any ideas what it could be?

Thank you

1 Like

Hi @Ulanbek ,

Thanks for giving us this quick feedback!

I’ll flag it to the team so that we can try to quickly understand the root cause.

Kind regards,

1 Like

Hi again @Ulanbek ,

We believe the problem you are seeing is due to the amount of data you have in some TEIs, which are now processed as part of the analytics generation to support the new Line Listing cross program functionality.

The team will look into how to avoid this problem with future releases, but in the meantime could you try to generate analytics with the option “Skip generation of tracked entity data” enabled? This will prevent the use of the cross program functionality, but other features will be ok.

Kind regards,

1 Like

Hi @phil

Thank you. I will try
In general all analytics works fine, despite of having the error messages



We are observing an issue whereby relationships created in the android app (version 2.9 and 3.0) do not always sync to web. THe sync works sometimes but not always. Wondering if others had experienced this issue.


1 Like