Skip to content
Android notifications 🔔, contact attachments 🖼️ and more 🎉 CHT 5.1 is here!

5.2.0 release notes

Released 2026-06-26

Highlights

Collapsable contact summaries

Previously, the content fields for contact summary condition cards were always visible to the user. Now, the body of the contact summary cards can be collapsed or expanded by tapping their headers. This reduces vertical scrolling for content-heavy cards like stock monitoring and immunizations. App developers can control the default state by configuring a property for the card.

Demo Video

Tab customizations

While the CHT has supported hiding certain tabs in the user interface, it has been impossible to set a new default tab or change the order of the visible tabs. CHT 5.2 enables deployments to customize the order and choose which tab a CHW sees when they first open their app. See the config documentation for more details.

UI Extensions

App developers can now build configurable pages in the CHT application! UI extensions are web components maintained and deployed as part of the CHT configuration code. They provide users with custom content ranging from static reference pages to interactive mini-apps. UI extensions can read/create/update data for contacts, reports, etc via stable apis. See the docs for more info.

Search Field in Tasks UI

During the Smart Task Prioritization squad, it became clear CHWs managing large numbers of tasks would benefit significantly from a free-text search feature to quickly locate tasks. The search works instantly and offline - eliminating the need to scroll through long lists. Check out the ticket for more info.

Demo Video

Identify users with replication failures

Large-scale CHT deployments are serving ever-increasing numbers of users. With 20,000+ active users on some instances and 80,000+ users across multiple instances in national deployments, monitoring system health is critical.

Users configured to sync more than 10,000 documents can experience replication failures that impact both their own device performance and the overall server response time for all users. Previously, identifying these problematic users required manual investigation and API queries.

CHT 5.2.0 introduces two new API endpoints that make it easy to identify users who have had replication failures or who have not successfully replicated within a configurable time interval. Administrators can now proactively identify and address users with excessive document loads, ensuring healthy synchronization for the entire deployment.

See also: Monitoring user replication status

Upgrade to CouchDB 3.5.2

The new CHT version includes CouchDB 3.5.2, which brings a ~60% performance improvement for Nouveau indexing - the technology which powers the CHT replication algorithm and online full-text searches. This upgrade also fixes an issue causing search timeouts. See the ticket for more details.

New REST apis for persons, places, and reports

New REST apis have been added to the CHT server for creating and updating persons, places, and reports (#9835). These can be used by scripts or 3rd-party integrations to interact with the CHT data model. See our newly enhanced API reference documentation for more details!

Known issues

Check the repository for the latest known issues.

Upgrade notes

Breaking changes

None.

UI/UX changes

  • #10240: Add the option to hide target counts past the goal
  • #10569: Indicate the number of households in a hierarchy
  • #10694: Implement free text search feature in tasks page
  • #10766: Support collapsing contact-summary cards
  • #9834: Make login page responsive to LTR <-> RTL switching

And more…

Features

  • #10224: Support custom UI Extensions
  • #10240: Add the option to hide target counts past the goal
  • #10438: Add telemetry for how many tasks the users see
  • #10508: Serialize lists of primitive values returned from External Apps as space-delimited strings
  • #10569: Indicate the number of households in a hierarchy
  • #10694: Implement free text search feature in tasks page
  • #10794: Implement failed user replication tracking
  • #10810: Support calling extension-libs from form expressions
  • #11146: Add API endpoint that returns which users have no replication successes within an interval
  • #7005: Use OpenAPI to document endpoints
  • #9339: Phone Widget display formatted phone number value

Improvements

  • #10217: Record telemetry for External Android App calls
  • #10695: Implement telemetry to track task selection duration
  • #10766: Support collapsing contact-summary cards
  • #10846: Allow configuring phone number display format in outgoing SMS messages (strip country code)
  • #10862: Don’t run database compaction on every version upgrade
  • #10987: Login password visibility icon does not update after toggling
  • #11071: Add monitoring data about users who fail to replicate
  • #11196: Wrong translation in nepali for unsupported safari browser
  • #4543: Marking inputs field’s appearance as ‘hidden’ in person-create form generates empty pages
  • #7948: Improve misconfigured “registration” transition error message
  • #8226: Do not display a form page when all the contents are “hidden”
  • #8816: Fragile text search can invalidate CouchDb admins on container restart
  • #9834: Make login page responsive to LTR <-> RTL switching
  • #9835: Add cht-datasource APIs for creation and update of contacts and reports

Security fixes

  • #10209: Protect against XXE attack
  • #10520: Remove dependency of on disk GH token for release notes
  • #10559: Implement static analysis of github CI to check for security vulnerabilities
  • #11075: Bump nginx to 1.31
  • #11112: Bump nginx to 1.31.1
  • #6571: Detect logged passwords and errors

Performance improvements

  • #11080: Upgrade to CouchDB 3.5.2

Bug fixes

  • #10341: Deleting roles does not result in users with those roles losing permission
  • #10357: debug level messages printed on production instances
  • #10661: Race condition in loading contact summary
  • #10679: Geolocation acquisition timeout blocks submitting forms
  • #10712: ContactChangeFilterService.isRelevantChange uses ?? instead of ||, making isRelevantContact and isRelevantReport dead code
  • #10751: Duplicate phone number validation broken when using “
  • #10754: Cookies not being sent with secure: true
  • #10802: Message getting sent to pending state even after it is sent.
  • #10815: Existing helm chart fails after recent changes on helm chart
  • #10852: accept_patient_reports can throw an error if configuration is missing the messages property
  • #10879: Unsupported browser warning not shown on About page
  • #10912: Authorization context drops duplicate replication-key matches because Set.add() only adds one id
  • #11153: Nouveau requests timeout after 30 seconds
  • #11154: Bump bikram-sambat to 1.8.1
  • #11198: API fails to initialize after Node 22.23 release
  • #8974: Form end meta field not correctly populated when the form ends

Technical improvements

  • #10029: Upgrade to Angular 20
  • #10113: Flaky test: CI compile fails due to rate limiting when downloading shellcheck
  • #10144: Extract common patterns from CouchDB helm charts templates into reusable helper templates
  • #10174: Cleanup workflow fails for all contributors with forked repositories
  • #10302: Remove app management configure targets page
  • #10378: Switch to UUID v7 everywhere
  • #10416: Warning: patch-package detected a patch file version mismatch
  • #10495: Flaky integration test: monitoring v1 should return empty values for empty db:
  • #10498: Multiple e2e workflow tests are failing due to feedback documents being generated
  • #10538: Add constant for ‘privacy-policies’ document ID
  • #10539: Add constant for ‘branding’ document ID
  • #10540: Add constant for ‘partners’ document ID
  • #10541: Add constants for ’target-aggregates’, ‘migration-log’, ’extension-libs’, and ‘zscore-charts’ document IDs
  • #10542: Add constant for ‘data_record’ document type
  • #10544: Add constant for ‘clinic’ document type
  • #10546: Add constant for ‘district_hospital’ document type
  • #10550: Add constants for HTTP headers (e.g., common header names beyond REQUEST_ID)
  • #10551: Add constants for user roles (e.g., common role strings beyond ONLINE)
  • #10552: Add constants for Sentinel metadata (e.g., additional local document IDs)
  • #10553: Add constants for common prefixes or patterns (e.g., org.couchdb.user:, messages- for translations)
  • #10564: Flaky e2e test: User with contact should quit training in modal, and be able to complete it later in the Training Material page, verify completed trainings display in the list
  • #10606: Switch minimum browser version for e2e tests from 90 to 107
  • #10613: Hide dependabot commits when running release notes script
  • #10653: Add frontend performance benchmarking suite
  • #10702: release notes script: Exclude “chore” type, update readme
  • #10704: Add e2e test that checks repeat fields are saved
  • #10729: Fix bugs and typos in smsparser.js and related files
  • #10780: Flaky e2e test: meta db replication should replicate meta db up
  • #10813: Flaky integration test db-doc handler restricts offline users GET attachment:
  • #10858: Flaky wdio test: should reply to an existing message and add a new recipient - raw phone number
  • #10870: Add automated test to validate shared-libs testing script
  • #10871: Flaky api integration test: Import Records JSON parses and stores the passed JSON:
  • #10872: Flaky api integration test: auditing api db should only store 10 history entries
  • #10873: Flaky api integration test: server DNS resolver nginx should resolve updated api ips
  • #10878: Switching pages too quickly can throw errors in the contacts detail page
  • #10881: Flaky wdio test: Tasks group landing page should open task from the same group
  • #10882: Migrate small Angular templates from structural directives to built-in control flow
  • #10883: Replace any types with proper interfaces in small service files
  • #10891: Implement GHA concurrency
  • #10892: Break down ci-webdriver-default-workflows in two separate actions
  • #10931: Storage progress bar has broken aria-label binding and hardcoded English text
  • #10944: updateMessageTaskStates crashes when allDocs returns rows without doc
  • #10985: Nouveau query escaping misses documented special characters
  • #11099: CI failing when pushing to ECR: maximum allowed number of tags per image which is ‘1000’
  • #11118: Routing test fails for feature release branches
  • #11179: Flaky e2e test: create-user-for-contacts.create-user.wdio-spec.js
  • #11181: Release notes script failing: Cannot read properties of null
  • #11182: Loading webapp without a valid user cookie logs an error
  • #11191: Flaky integration test: mark_for_outbound error logging logs an error if the server cannot be found:
  • #11204: Flaky integration test: should find existing outbound tasks and execute them, leaving them if the send was unsuccessful
  • #11207: Run cht-conf integration tests in isolation
  • #5936: Record test coverage
  • #8758: Test report creation using SMS in default config
  • #8799: Shared libs unit test failures are a chore to debug
  • #9491: e2e tests should fail gracefully if the ports are not available (or find a new port)
  • #9492: Webapp unit tests have very noisy logs
  • #9927: Targets widgets

Contributors

Thanks to all who committed changes for this release!

Last updated on

Did this documentation help you ?