Replace static port mapping with ephemeral Docker ports and a
scanner script that discovers host-mapped ports at runtime,
generating the fleet config dynamically. This removes the need
for a lock on Linux (parallel E2E runs per agent). Windows
keeps the lock due to GUI/Squish constraints.
currently the android e2e job needs 4 device runners and we have only 5.
This means other android e2e jobs will just hold a jenkins executor till
the previous E2E job has finished.
https://ci.status.im/job/status-app/job/e2e/job/prs-android/
This was causing a massive queue of jobs in CI.
We can enable android e2e for PRS later when we are able to handle the
traffic, this can be done by increasing the number of runner devices,
modifying the tests to use less runners possibly just rely on the 1
runner OR just speeding up the tests themselves.
To fix errors like these that happen on newer Ubuntu 24.04
[2026-08-05T07:43:07.967Z] + docker compose -p e2e-fleet -f
docker-compose.waku.yml up -d
[2026-08-05T07:43:07.968Z] permission denied while trying to connect
to the docker API at unix:///var/run/docker.sock
script returned exit code 1
* ci(e2e-android): provide the wallet test seed to the e2e job
The wallet-send smoke (#21420) skips unless WALLET_TEST_USER_SEED is
set, and the Android job never sets it. Bind the existing
wallet-test-user-seed credential, as the desktop e2e jobs already do.
Assisted-by: Claude (Anthropic)
Behind the compile-time USE_SIMULATED_KEYCARD flag (off by default, so
production is unaffected), the app drives a real Status Keycard applet
running in jcardsim instead of a physical reader — enabling keycard e2e
and manual testing without hardware.
- Bump status-keycard-qt (SimulatedChannelBackend + test-only KeycardTest*
C API) and nim-keycard-go (matching bindings), both gated by the flag.
- Add KeycardTestController (Nim) and the KeycardSimulatorController window
to start the simulator and create/insert/remove empty or seed-loaded cards.
- Wire USE_SIMULATED_KEYCARD through Makefile and CI, with a per-mode
nimcache so toggling the flag rebuilds cleanly.
Closes#20305
- Deleted the status-keycard-go submodule from .gitmodules and Makefile.
- Updated config.nims to reference STATUSKEYCARD_QT_LIBDIR instead of STATUSKEYCARDGO_LIBDIR.
- Adjusted build scripts and feature flags to remove dependencies on status-keycard-go.
- The code aligned.
- make the checks for updated (and not included) TS files mandatory from
now on
- Qt 6.9 had a bug in that it would sometimes miss some TS files
changes, fixed under 6.11, so make the check mandatory again
- fix a source string error
* chore: force build
* fix(EphemeralNotifications): Suppress message ephemeral toasts
Prevent chat message notification types from being added to the ephemeral notifications model shown in AppMain.
Message toasts are currently considered too noisy for the in-app experience, so NewMessage, NewMessageWithPersonalMention, and NewMessageWithGlobalMention are skipped until their usefulness is reassessed.
Fixes#20877
* fix: Android connectivity issues
Fixing multiple deadlocks on instable connectivity and on app restarts.
- go-waku deadlocks and peer reconnection storm fixed by https://github.com/logos-messaging/logos-delivery-go/pull/1302. This issue was deadlocking the messenger and any client restart would end-up in the same deadlock.
- status-go filters the connection change and propagates only when the state actually changes https://github.com/status-im/status-go/pull/7447. This would trigger a peer reconnection storm with lots tens of changes on app kill/app start.
- Handle dns failure at start-up, leaving the clients with no lightpush peer. App should start now with more peers. Send message should work from the start. https://github.com/status-im/status-go/pull/7447
- Make nim's connectionChange no-op on android. The connectionChange is managed by the android service itself since the service is persistent and the client is not.
- Add a destruction watchdog for the android activity. If qt's onDestry blocks for more than 3 seconds we'll forcefully kill the app. Otherwise it can deadlock, making app restart impossible.
* fix(MessageView): unbreak opening URLs when clicking on a text message
- use a StatusTextArea as the internal part (renderer) of the
StatusTextMessage and make it always enabled (disabling prevents the
URLs from being opened)
- by using a (Status)TextArea instead of a TextEdit, we can handle the
context menu events correctly w/o disabling the edit control
Fixes#20894
* fix(StatusMessage): unbreak opening chat image preview
- on touch screens, the `button` is often `Qt.NoButton`
- also fixup opening the image context menus; on touch screens, the
Menu.popup() needs a point position to open at the exact point the user
(long)pressed
Fixes#20897
* fix: reopen keyboard (#20947)
* ci: skip fdroid for release
* fix: handle shutdown process to avoid race conditions - more appropriate
- Added a global singleton instance for QGuiApplication to manage application lifecycle.
- Replaced direct quit calls with singletonInstance.application.quit() for consistent application termination.
* fix(Chat): Adjust chat lists margins and scrollbar spacing
1. Adjust 1:1 chat list margins and scrollbar spacing
2. Align community channel list margins and scrollbar spacing
3. Align member list margins and scrollbar spacing
- Sets a thinner scrollbar width matching the Activity Center list pattern
- Adds left content padding based on the swipe indicator width plus the standard minimum margin
- Reserves right padding for the scrollbar and a small gap so delegates do not overlap it
- Keeps the chat list geometry driven by `StatusScrollView` padding instead of manual child offsets
- Refines chat list spacing to improve visual balance and consistency.
Fixes#20593
* fix: IOS push notifications
* fix: back button close the app (#20969)
* fix(browser): android connector (#20885)
* fix(browser): per-tab ConnectorBridge and webchannel
* fix state correctness (connected flag)
* fixes OpenSea sign-in failing when another dApp tab (e.g. hub) is open
* fix stale listeners when reloading a page
Fixes#20602
* chore: tests
* fix(browser): route disconnect through connectorController
fix(browser): make status user-scripts idempotent on same-URL reload
fix(dapps): preserve connectorId for ConnectDAppModal disconnect
fix(browser): reload via ensureLoaded + native reload
* fix: assets page remains empty for ~15s for new user with 0 balances
- Added a `loading` property to the `AssetGroupItem` type to track balance fetching status.
- Updated `BalancesModel` to include loading state in data retrieval.
- Modified `onAllTokensBuilt` to set loading state based on balance errors.
- Loading states for balances introduced to the assets tab.
Closes: #20980
* fix[Browser] Update the new tab image
- also size-optimize some browser PNGs using `optipng`
Fixes#20601
* fix(Browser): fix closing an empty tab using a kdb shortcut
- we don't have an active WebView, so the abstract action wouldn't do
anything
* fix(Browser): opening a webpage for browsing activates the URL input field
- make a distinction between opening a new tab for viewing, and an empty
one (where we actually do want to start entering the URL)
Fixes#20656
* fix(Browser): fix closing the DevTools using its own close button
- don't break the settings binding, and update the internal action
properly
* fix(StatusBaseButton): fix setting explicit icon size from outside
- don't take the value from `d.iconSize` which is precomputed, make it
possible to set it properly via `icon.width/height`
* fix(StatusBaseButton): rely on the pointer hover handler also for tooltips and text color
- that way we don't get spurious hover events on touch
* fix(StatusDialogHeader): use discrete corner radii
- in Qt 6.11, we can set the radius on an individual rectangle corner,
no need to create an extra fake Rectangle
* fix(Browser): transparent favicon bleeds outside circle container
- no need to set the border here at all
Fixes#20683
* fix(Browser): minor browser UI fixes
- increase font sizes and spacings
- use default corner radius
- element sizes upped to 44, icon sizes to 28
- use the standard SearchBox component
- increase the webpage preview size
Fixes#20443
* fix(Browser): try to active OSK when editing the URL
Fixes#20891
* fix(Browser): disable IME for FindBar
- adjust the flags to make it more privacy oriented
* fix(Browser): update the New Tab illustrations
- also add a dark variant
Fixes#20601
* chore(Browser): always open a new tab with the "+" button
* chore: remove `suppressKeyboardResize` for the Browser section
- we `freeze` the native WebView when there's an active popup/modal
Fixes#20967
* fix: mobile navigation to subsections
Fixing broken bindings
* fix: persist push notifications settings
Was using the wrong persist key
* Release 2.38.0 RC2
* chore: tag version 2.38 RC2
* chore: use a real token image that is coming from the token lists instead of locally stored images
Using images from the token lists displaying any token is safe, while using locally stored images
requires adding new icons for new tokens and delivering new builds, otherwise tokens may appear
using incorrect image or be represented by their names (named icon, capital first letter).
* fix: Allow navigating to the same chat
* StatusChatInput: proper handling of attached images removal
Closes: #20928
* StatusChatInput: minor sizing alignments
Closes: #20570Closes: #20495
* Chat view: text wrap for system label
Closes: #20976
* StatusModal: StatusModal footer layout improved
The sizing via background implicit height was not taking into account
potential safe area margin. Now it's all calculated automatically,
with proper handling of safe area.
Closes: #20946
* fix: SafeArea handling and bottom sheet simplifications
It elminates logical circular dependencies and binding loop warnings.
* StatusChatInput: no jumps on backspace on ios
Closes: #20898
* fix(display-name): fix editing display name is very laggy when in a comm
Fixes#20963
The problem was that we called `isDisplayNameDupeOfCommunityMember` for each character on the display name edit.
To fix it, I use a debounce on that function. I had to do the rest of the validation manually, since you cannot edit the error message from the outside if there is already a validation happening internally (it gets overwritten).
* feat(gif): add count property to gifs model (#21028)
refs status-im/status-app#20691
* chore: bump status-go
---------
Co-authored-by: Jonathan Rainville <rainville.jonathan@gmail.com>
Co-authored-by: Noelia <noelia@status.im>
Co-authored-by: Alex Jbanca <alexjb@status.im>
Co-authored-by: Lukáš Tinkl <lukast@status.im>
Co-authored-by: Anthony Laibe <491074+alaibe@users.noreply.github.com>
Co-authored-by: Siddarth Kumar <siddarthkay@gmail.com>
Co-authored-by: Andrey Bocharnikov <andrey.bocharnikov@gmail.com>
Co-authored-by: Michał Cieślak <michalcieslak@status.im>
- Replace network_mode:host with bridge networking and port mapping
so the same compose file works on both Linux and Windows
- Use dns4 service names for inter-container communication instead
of ip4/127.0.0.1
- Add local waku fleet lifecycle to Windows E2E Jenkinsfile with
lock and try/finally pattern matching Linux implementation
- Update SQUISH_DIR path for benchmark e2e
Concurrent PR builds on the same agent create separate workspaces
(prs, prs@2, prs@3) each with a different compose project name,
causing port collisions even with the lock in place.
Fix by using `-p e2e-fleet` for all compose commands so every build
manages the same set of containers, and moving fleet teardown into
a try/finally block inside the lock to prevent race conditions with
post.always cleanup.
* chore(@e2e): use local waku fleet for E2E tests
Start local waku nodes via docker-compose before running E2E tests
and configure the app to use them instead of status.prod. This avoids
skewing production metrics, adding unnecessary load to prod hosts,
and generating noise in prod storage DBs.
- https://github.com/status-im/status-app/issues/20126
- https://github.com/status-im/status-go//tree/feat/fleet-override
* fix(@e2e): use host networking for local waku nodes
Switch docker-compose to network_mode:host so waku nodes
bind directly to localhost. Fixes ENR multiaddr containing
Docker internal hostnames/IPs unreachable by the app.
- Remove dns4-domain-name (caused Docker hostname in ENR)
- Use /ip4/127.0.0.1 for staticnode references
- Separate discv5 UDP ports (9000/9001
- Enable REST API for proper healthchecks
- Update fleet config JSON with correct DNS ENRs and store addr
* chore(@e2e): remove status community link from tests
---------
Co-authored-by: Anastasiya <anastasija.ig@gmail.com>