9.4.28-2

coaidev/coai9.4.28-2Jul 7, 2026by github-actions[bot]

AI Summary

This release focuses on mobile app improvements including UI migrations, bug fixes for expense flows, and refactoring of navigation and storage components.

Key Highlights

  • Migrated the group members page to the new Table layout.
  • Fixed 'previously existing chat' error when creating distance expenses for new users.
  • Migrated US virtual card reveal details storage to the new `RevealedCardSecretsStore`.
  • Refactored money report header secondary actions to use dynamic verify account.
  • Added `canMergeReports` eligibility helper for the Merge Reports project.

New Features

  • Added Rillet integration import pages.
  • Added a Paid status expense report filter.
  • Made system/violation messages text-selectable on desktop web.

Full Release Notes

## What's Changed
* Migrate group members page to the new Table layout by @MelvinBot in https://github.com/Expensify/App/pull/95224
* refactor getParentNavigationSubtitle function to use translate param by @daledah in https://github.com/Expensify/App/pull/95140
* Migrate US virtual card reveal details storage to RevealedCardSecretsStore by @DylanDylann in https://github.com/Expensify/App/pull/95262
* [No QA] Docs updates for E/A#82075 spreadsheet member import approval fields by @MelvinBot in https://github.com/Expensify/App/pull/93902
* Fix: distance expense to new user lands on Workspace with 'previously existing chat' error (new manual expense flow) by @MelvinBot in https://github.com/Expensify/App/pull/94755
* [Payment due @linhvovan29546] Drive card feed selectors off linkedPolicyIDs, remove preferredPolicy decisioning by @MelvinBot in https://github.com/Expensify/App/pull/93928
* [No QA] Add seatbelt check and change context props by @Guccio163 in https://github.com/Expensify/App/pull/95268
* Replace getDisplayNameOrDefault with temporaryGetDisplayNameOrDefault - batch 5 by @cretadn22 in https://github.com/Expensify/App/pull/95315
* Fix supportal SAML redirect by @hungvu193 in https://github.com/Expensify/App/pull/95270
* Replace getDisplayNameOrDefault with temporaryGetDisplayNameOrDefault - batch 4 by @cretadn22 in https://github.com/Expensify/App/pull/95300
* Remove unused function and update getLoginsByAccountIDs usage in getApprovalChain, openReport, and toggleSubscribeToChildReport by @bernhardoj in https://github.com/Expensify/App/pull/95162
* Refactor money report header secondary actions to use dynamic verify account by @jmusial in https://github.com/Expensify/App/pull/94594
* [NOQA] fix: remove unused preview success animation scales by @OlimpiaZurek in https://github.com/Expensify/App/pull/94955
* [No QA] Crash diagnostics: stop reporting hidden/backgrounded tabs as crashes by @sosek108 in https://github.com/Expensify/App/pull/94818
* Replace getDisplayNameOrDefault with temporaryGetDisplayNameOrDefault - batch 3 by @cretadn22 in https://github.com/Expensify/App/pull/95071
* Part 5 - Remove Onyx.connect() for the key: ONYXKEYS.PERSONAL_DETAILS_LIST in src/libs/actions/Report.ts by @lorretheboy in https://github.com/Expensify/App/pull/94647
* [NoQA] feat: add canMergeReports eligibility helper for the Merge Reports project by @dmkt9 in https://github.com/Expensify/App/pull/94939
* Make system/violation messages text-selectable on desktop web by @MelvinBot in https://github.com/Expensify/App/pull/92142
* [No QA] Docs: add bulk Download as PDF to the Export Expenses and Reports article by @mollfpr in https://github.com/Expensify/App/pull/95290
* [CP Staging] update old routes by @huult in https://github.com/Expensify/App/pull/95368
* Fix all-empty column sort reordering rows and flipping between asc/desc by @mukhrr in https://github.com/Expensify/App/pull/95022
* Add Rillet integration import pages by @s77rt in https://github.com/Expensify/App/pull/94780
* Add a Paid status expense report filter with those three options by @dukenv0307 in https://github.com/Expensify/App/pull/94808
* [No QA] Revise custom export instructions for accounting software by @stephanieelliott in https://github.com/Expensify/App/pull/94227
* refactor: finalize Search router and delete legacy SearchList shell by @BartekObudzinski in https://github.com/Expensify/App/pull/95370
* Create receipt-wrangler-space-cowgirl.svg by @garrettmknight in https://github.com/Expensify/App/pull/95374
* Stabilize submit-to popover host context to prevent Search row re-renders by @TMisiukiewicz in https://github.com/Expensify/App/pull/95267
* Sort Device Management devices list by most recent timestamp first by @MelvinBot in https://github.com/Expensify/App/pull/95316
* [Home Page] "Recently added" slot doesn't update after creating an expense while offline by @adamgrzybowski in https://github.com/Expensify/App/pull/94180
* [Home Page] Design Followup for Recently Added Slot by @adamgrzybowski in https://github.com/Expensify/App/pull/95056
* [No QA] fix: checkout Mobile-Expensify PR before calling `Setup Node` action by @war-in in https://github.com/Expensify/App/pull/95386
* refactor isReportIneligibleForMoveExpenses and getTrackExpenseInformation to use data from useOnyx part 1 by @daledah in https://github.com/Expensify/App/pull/92964
* Migrate ComposedButton to ButtonWithDropdownMenu by @Guccio163 in https://github.com/Expensify/App/pull/93789
* [Payment due @truph01] Allow recovery code on Replace 2FA device flow by @allgandalf in https://github.com/Expensify/App/pull/91644
* fix: use microtask queue for whatwg-fetch XHR events by @rohit9625 in https://github.com/Expensify/App/pull/94399
* Fix Profile-Tapping green dot behaviour is inconsistent in landscape & portrait mode by @GCyganek in https://github.com/Expensify/App/pull/94453
* [NOQA] perf: add MoneyRequestReportPreview layout components by @OlimpiaZurek in https://github.com/Expensify/App/pull/94681


**Full Changelog**: https://github.com/Expensify/App/compare/9.4.27-2...9.4.28-2