You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Login-Tapping try new Expensify directs to log out page #102728
👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:
Identify the pull request that introduced this issue and revert it.
Recommendation: Revert #101437 together with its companion native change. It is a dependency bump, so the revert should be clean.
Why: NitroSQLite 9.8.0+ throws Database OnyxDB is already open when a database is opened a second time in the same Android process. Older versions silently replaced the open connection. When Android HybridApp starts a new NewDot JS runtime in the same process after "Try new Expensify," Onyx fails to open its store. NewDot then starts with no session and shows the sign-in page. A cold restart clears the native state, so the open succeeds and NewDot loads.
Investigation details
Evidence chain
The PR bumps react-native-nitro-sqlite from 9.6.0 to 9.8.2 (package.json:204) and turns on threadSafe and performanceMode (package.json:456-459).
The library keeps open databases in a native map (cpp/operations.cpp) that lives as long as the Android process, not the JS runtime. Nothing closes them when a runtime is torn down.
In 9.8.2, sqliteOpenDb throws DatabaseAlreadyOpen if the name is already in that map. 9.6.0 and 9.7.0 overwrote the entry (dbMap[dbName] = db).
Onyx's SQLite provider opens OnyxDB at startup. If that throws, the store stays unset and every read fails with Store is not initialized!.
Onyx only falls back to memory-only storage for the IndexedDB error, not this one. So the app has no session and routes to sign-in.
Not verified
The OldDot to NewDot handoff code is outside this repo, so I couldn't confirm it reuses the process when starting a new runtime. A comment in src/HybridAppHandler.tsx:46-56 suggests new runtimes do happen.
I can't explain why the Troubleshoot "reset" step matters. QA could retest with only "Switch to Classic" then "Try new Expensify."
To confirm quickly, check the Android logcat for Database OnyxDB is already open or Store is not initialized! during the repro.
I didn't run a device test. The bug is Android HybridApp only, and this run could only test web.
Other candidates (lower)
The Mobile-Expensify submodule bump in this release (9.4.97-0 to 9.5.0-0) covers the OldDot side of the handoff. It's the main alternative if the logcat check doesn't confirm the error above.
I've found the fix for this deploy blocker and i'm about to publish 2 new versions of NitroSQLite:
v9.8.3 is going to include just the fix. We can bump the dependency immediately to fix the deploy blocker.
v10.0.1 includes the fix + more features and performance improvements that are already being worked in this issue and this PR. The PR will still have to be reviewed and QAd separately.
Both PRs stay limited to NitroSQLite dependency and lockfile updates. Their descriptions include this blocker's Reset → Classic → Try New Expensify reproduction and expected result, along with an iOS regression check. Manual native and staging QA remain pending.
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.0-5 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]
Activity
applause-bot commentedon Oct 1, 2026
While Applause doesn't embed attachments for this bug, here are the links for quick view:
https://platform.applause.com/services/links/v1/external/5f6347f60ab107fd3345c859a772881e98cbf7d43206854eff7fb30ee3093c68
melvin-bot commentedon Oct 1, 2026
Triggered auto assignment to @yuwenmemon (
DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.melvin-bot commentedon Oct 1, 2026
💬 A slack conversation has been started in #expensify-open-source
github-actions commentedon Oct 1, 2026
👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:
MelvinBot commentedon Oct 1, 2026
Deploy Blocker Analysis
Likely cause (medium confidence): chore(deps): Update NitroSQLite to 9.8.2 (
Expensify/App#101437, bychrispader, merged 2026-09-30, on Deploy Checklist: New Expensify 2026-09-30).Recommendation: Revert #101437 together with its companion native change. It is a dependency bump, so the revert should be clean.
Why: NitroSQLite 9.8.0+ throws
Database OnyxDB is already openwhen a database is opened a second time in the same Android process. Older versions silently replaced the open connection. When Android HybridApp starts a new NewDot JS runtime in the same process after "Try new Expensify," Onyx fails to open its store. NewDot then starts with no session and shows the sign-in page. A cold restart clears the native state, so the open succeeds and NewDot loads.Investigation details
Evidence chain
react-native-nitro-sqlitefrom 9.6.0 to 9.8.2 (package.json:204) and turns onthreadSafeandperformanceMode(package.json:456-459).cpp/operations.cpp) that lives as long as the Android process, not the JS runtime. Nothing closes them when a runtime is torn down.sqliteOpenDbthrowsDatabaseAlreadyOpenif the name is already in that map. 9.6.0 and 9.7.0 overwrote the entry (dbMap[dbName] = db).OnyxDBat startup. If that throws, the store stays unset and every read fails withStore is not initialized!.Not verified
Database OnyxDB is already openorStore is not initialized!during the repro.Other candidates (lower)
NetworkStore.tsandenhanceParameters.ts, but only adds logging.HybridAppHandler.tsx,actions/HybridApp,actions/Session,actions/App.ts, or the Troubleshoot page.Fix-forward options (if you don't revert)
Next Steps: Reply with
@MelvinBot <your feedback>to refine this analysis.view run
chrispader commentedon Oct 1, 2026
Looking into this!
chrispader commentedon Oct 1, 2026
I've found the fix for this deploy blocker and i'm about to publish 2 new versions of NitroSQLite:
v9.8.3is going to include just the fix. We can bump the dependency immediately to fix the deploy blocker.v10.0.1includes the fix + more features and performance improvements that are already being worked in this issue and this PR. The PR will still have to be reviewed and QAd separately.chrispader commentedon Oct 1, 2026
Chris's AI release helper here. 🤖
The NitroSQLite 9.8.3 dependency updates are ready for review:
Both PRs stay limited to NitroSQLite dependency and lockfile updates. Their descriptions include this blocker's Reset → Classic → Try New Expensify reproduction and expected result, along with an iOS regression check. Manual native and staging QA remain pending.
cc @NicolasBonet
Julesssss commentedon Oct 1, 2026
PRs cherry-picked
m-natarajan commentedon Oct 1, 2026
Not repro, Redmi note 10s android 13, 9.5.0-3
Screenrecorder-2026-10-01-23-47-12-387.mp4
melvin-bot commentedon Oct 1, 2026
If you are the assigned CME please investigate whether the linked PR caused a regression and leave a comment with the results.
If a regression has occurred and you are the assigned CM follow the instructions here.
If this regression could have been avoided please consider also proposing a recommendation to the PR checklist so that we can avoid it in the future.
melvin-bot commentedon Oct 1, 2026
@yuwenmemon / @Julesssss / @NicolasBonet
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.0-5 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]