Repository: status-im/status-desktop
Pull request #17799: feat(Communities): Add promotional card into community portal
Author: login: noeliaSD
Created: 2025-04-15T16:26:45Z | Merged: 2025-04-16T12:35:30Z

Closes #17754

### What does the PR do

- It creates`PromotionalCommunityCard` component and added corresponding `storybook` page.
- It adds a promotional card into the third position of the current `Communities Portal` layout as per design.

### Affected areas

Communities Portal

### Architecture compliance

- [x] I am familiar with the application architecture and agreed good practices.
My PR is consistent with this document: [Status Desktop Architecture Guide](https://github.com/status-im/status-desktop/blob/master/CONTRIBUTING.md)

### Screenshot of functionality (including design for comparison)

- `Storybook` page

https://github.com/user-attachments/assets/f14f229e-6036-429d-86e7-50787b12239f

- `App`

<img width="1243" alt="Screenshot 2025-04-15 at 18 22 10" src="https://github.com/user-attachments/assets/1fcdaa36-0f53-4f09-9ebc-b680fdf379d9" />

### Impact on end user

It promotes the Community Directory Curation to encourage community owners and members to have their community featured on the Communities Portal page.

### How to test

- Test the component at `storybook`
- Test the promotional card at `Communities Portal` page

Linked issue #17754: Apply some `Community Portal` design updates
Design:
https://www.figma.com/design/qHfFm7C9LwtXpfdbxssCK3/Kuba%E2%8E%9CDesktop---Communities?node-id=55170-330315&m=dev

![Image](https://github.com/user-attachments/assets/6bb1b77d-cd07-4495-b6c6-b59e55e07124)

- [ ] New placeholder card `Want to see your community here?`  with its flows
- [ ] Layout reorganization with the new placeholder card where it is finally decided
- [ ] TBC: Tags component behavior updates

Diff:
diff --git a/storybook/pages/PromotionalCommunityCardPage.qml b/storybook/pages/PromotionalCommunityCardPage.qml
new file mode 100644
index 00000000000..bcfdbe9a9bf
--- /dev/null
+++ b/storybook/pages/PromotionalCommunityCardPage.qml
@@ -0,0 +1,41 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQuick.Layouts 1.15
+
+import StatusQ.Components 0.1
+import StatusQ.Core.Theme 0.1
+
+import AppLayouts.Communities.controls 1.0
+
+import Storybook 1.0
+
+SplitView {
+    id: root
+
+    orientation: Qt.Vertical
+
+    Logs { id: logs }
+
+    Item {
+        SplitView.fillWidth: true
+        SplitView.fillHeight: true
+
+        PromotionalCommunityCard {
+            anchors.centerIn: parent
+
+            onLearnMore: logs.logEvent("PromotionalCommunityCard::onLearnMore")
+            onInitiateVote: logs.logEvent("PromotionalCommunityCard::onInitiateVote")
+        }
+    }
+
+    LogsAndControlsPanel {
+        SplitView.minimumHeight: 100
+        SplitView.preferredHeight: 160
+
+        logsView.logText: logs.logText
+    }
+}
+
+// category: Components
+// status: good
+// https://www.figma.com/design/qHfFm7C9LwtXpfdbxssCK3/Kuba%E2%8E%9CDesktop---Communities?node-id=55170-330778&m=dev
diff --git a/ui/app/AppLayouts/Communities/controls/PromotionalCommunityCard.qml b/ui/app/AppLayouts/Communities/controls/PromotionalCommunityCard.qml
new file mode 100644
index 00000000000..3931675fa29
--- /dev/null
+++ b/ui/app/AppLayouts/Communities/controls/PromotionalCommunityCard.qml
@@ -0,0 +1,105 @@
+import QtQuick 2.15
+import QtQuick.Layouts 1.15
+
+import StatusQ.Core 0.1
+import StatusQ.Core.Theme 0.1
+import StatusQ.Controls 0.1
+
+import shared.controls 1.0
+import shared.panels 1.0
+
+Item {
+    id: root
+
+    /*!
+        \qmlsignal StatusCommunityCard::learnMore
+        This signal is emitted when the card learn more button is clicked.
+    */
+    signal learnMore
+
+    /*!
+        \qmlsignal StatusCommunityCard::initiateVote
+        This signal is emitted when the card initiate vote button is clicked
+    */
+    signal initiateVote
+
+    QtObject {
+        id: d
+        readonly property int cardWidth: 335
+        readonly property int cardHeight: 230
+        readonly property int defaultMargin: 12
+        readonly property int defaultSpacing: 8
+    }
+
+    implicitWidth: d.cardWidth
+    implicitHeight: d.cardHeight
+
+    ShapeRectangle {
+        anchors.fill: parent
+
+        ColumnLayout {
+            width: parent.width
+            anchors.centerIn: parent
+            spacing: d.defaultSpacing
+
+            StatusIcon {
+                Layout.topMargin: 28
+                Layout.alignment: Qt.AlignHCenter
+
+                icon: "communities"
+            }
+
+            StatusBaseText {
+                Layout.alignment: Qt.AlignHCenter
+                Layout.maximumWidth: parent.width - 4 * d.defaultMargin
+
+                text: qsTr("Want to see your community here?")
+                font.weight: Font.Bold
+            }
+
+            StatusBaseText {
+                Layout.alignment: Qt.AlignHCenter
+                Layout.maximumWidth: parent.width - 4 * d.defaultMargin
+
+                text: qsTr("Help more people discover your community - start or join the vote to get it on the board.")
+                font.pixelSize: Theme.additionalTextSize
+                lineHeight: 1.2
+                horizontalAlignment: Text.AlignHCenter
+                wrapMode: Text.WordWrap
+            }
+
+            Separator {
+                Layout.fillWidth: true
+                Layout.topMargin: 22
+                Layout.leftMargin: d.defaultMargin
+                Layout.rightMargin: d.defaultMargin
+                Layout.bottomMargin: 4
+            }
+
+            RowLayout {
+                Layout.fillWidth: true
+                Layout.alignment: Qt.AlignHCenter
+                Layout.leftMargin: d.defaultMargin
+                Layout.rightMargin: d.defaultMargin
+                spacing: d.defaultSpacing
+
+                StatusButton {
+                    text: qsTr("Learn more")
+                    icon.name: "external-link"
+                    size: StatusBaseButton.Size.Small
+
+                    onClicked: root.learnMore()
+                }
+
+                StatusButton {
+                    text: qsTr("Initiate the vote")
+                    icon.name: "external-link"
+                    size: StatusBaseButton.Size.Small
+
+                    onClicked: root.initiateVote()
+                }
+            }
+
+        } // End of content card
+    }
+}
diff --git a/ui/app/AppLayouts/Communities/controls/qmldir b/ui/app/AppLayouts/Communities/controls/qmldir
index e6e6fc7e56c..094f7f4ce7d 100644
--- a/ui/app/AppLayouts/Communities/controls/qmldir
+++ b/ui/app/AppLayouts/Communities/controls/qmldir
@@ -27,6 +27,7 @@ OutroMessageInput 1.0 OutroMessageInput.qml
 PermissionItem 1.0 PermissionItem.qml
 PermissionListItem 1.0 PermissionListItem.qml
 PermissionsRow 1.0 PermissionsRow.qml
+PromotionalCommunityCard 1.0 PromotionalCommunityCard.qml
 SettingsPageHeader 1.0 SettingsPageHeader.qml
 TagsPicker 1.0 TagsPicker.qml
 TagsRow 1.0 TagsRow.qml
diff --git a/ui/app/AppLayouts/Communities/views/CommunitiesGridView.qml b/ui/app/AppLayouts/Communities/views/CommunitiesGridView.qml
index 284c4d66bc9..10fc37ff9bc 100644
--- a/ui/app/AppLayouts/Communities/views/CommunitiesGridView.qml
+++ b/ui/app/AppLayouts/Communities/views/CommunitiesGridView.qml
@@ -22,7 +22,8 @@ StatusScrollView {
     property var assetsModel
     property var collectiblesModel
 
-    readonly property bool isEmpty: !featuredRepeater.count && !popularRepeater.count
+    readonly property bool isEmpty: !featuredRepeater.count && !root.popularCommunitiesCount
+    readonly property int popularCommunitiesCount: firstPopularElementsRepeater.count + restOfPopularElementsRepeater.count
 
     signal cardClicked(string communityId)
 
@@ -34,6 +35,11 @@ StatusScrollView {
         // values from the design
         readonly property int scrollViewTopMargin: 20
         readonly property int subtitlePixelSize: 17
+        readonly property int promotionalCardPosition: gridLayout.columns - 1
+
+        // URLs:
+        readonly property string learnAboutCommunitiesVoteLink: Constants.statusHelpLinkPrefix + "communities/vote-to-feature-a-status-community#step-2-initiate-a-round-of-vote"
+        readonly property string voteCommunityLink: "https://curate.status.app/votes"
     }
 
     SortFilterProxyModel {
@@ -48,14 +54,37 @@ StatusScrollView {
     }
 
     SortFilterProxyModel {
-        id: popularModel
+        id: sfpmFirstPopularElementsModel
 
         sourceModel: root.model
 
-        filters: ValueFilter {
-            roleName: "featured"
-            value: false
-        }
+        filters: [
+            ValueFilter {
+                roleName: "featured"
+                value: false
+            },
+            IndexFilter {
+                maximumIndex: d.promotionalCardPosition - 1
+            }
+        ]
+
+    }
+
+    SortFilterProxyModel {
+        id: sfpmRestOfPopularElementsModel//popularModel
+
+        sourceModel: root.model
+
+        filters: [
+            ValueFilter {
+                roleName: "featured"
+                value: false
+            },
+            IndexFilter {
+                maximumIndex: d.promotionalCardPosition - 1
+                inverted: true
+            }
+        ]
     }
 
     Component {
@@ -141,7 +170,7 @@ StatusScrollView {
         }
 
         StatusBaseText {
-            visible: !root.searchLayout && popularRepeater.count
+            visible: !root.searchLayout && root.popularCommunitiesCount
             Layout.topMargin: 20
             //: All communities
             text: qsTr("All")
@@ -151,14 +180,29 @@ StatusScrollView {
         }
 
         GridLayout {
+            id: gridLayout
+
             visible: !root.searchLayout
             columns: 3
             columnSpacing: Theme.padding
             rowSpacing: Theme.padding
 
             Repeater {
-                id: popularRepeater
-                model: popularModel
+                id: firstPopularElementsRepeater
+                model: sfpmFirstPopularElementsModel
+                delegate: communityCardDelegate
+            }
+
+            PromotionalCommunityCard {
+                onLearnMore: Global.openLinkWithConfirmation(d.learnAboutCommunitiesVoteLink,
+                                                             StringUtils.extractDomainFromLink(d.learnAboutCommunitiesVoteLink))
+                onInitiateVote: Global.openLinkWithConfirmation(d.voteCommunityLink,
+                                                                StringUtils.extractDomainFromLink(d.voteCommunityLink))
+            }
+
+            Repeater {
+                id: restOfPopularElementsRepeater
+                model: sfpmRestOfPopularElementsModel
                 delegate: communityCardDelegate
             }
         }


Reviews:
user: login: jrainville
body: Looks good
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-15T16:38:08Z
user: login: caybro
body: LGTM in general, just some minor thoughts
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-15T17:06:20Z
user: login: noeliaSD
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T08:14:04Z
user: login: caybro
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-16T09:31:22Z

Review comments:
diff_hunk: @@ -0,0 +1,105 @@
+import QtQuick 2.15
+import QtQuick.Layouts 1.15
+
+import StatusQ.Core 0.1
+import StatusQ.Core.Theme 0.1
+import StatusQ.Controls 0.1
+
+import shared.controls 1.0
+import shared.panels 1.0
+
+Item {
+    id: root
+
+    /*!
+        \qmlsignal StatusCommunityCard::learnMore
+        This signal is emitted when the card learn more button is clicked.
+    */
+    signal learnMore
+
+    /*!
+        \qmlsignal StatusCommunityCard::initiateVote
+        This signal is emitted when the card initiate vote button is clicked
+    */
+    signal initiateVote
+
+    QtObject {
+        id: d
+        readonly property int cardWidth: 335
+        readonly property int cardHeigth: 230
path: ui/app/AppLayouts/Communities/controls/PromotionalCommunityCard.qml
user: login: caybro
body: ```suggestion
        readonly property int cardHeight: 230
```
created_at: 2025-04-15T17:01:21Z
author_association: MEMBER
diff_hunk: @@ -34,6 +35,11 @@ StatusScrollView {
         // values from the design
         readonly property int scrollViewTopMargin: 20
         readonly property int subtitlePixelSize: 17
+        readonly property int promotionalCardPosition: 2
path: ui/app/AppLayouts/Communities/views/CommunitiesGridView.qml
user: login: caybro
body: Not sure we should hardcode it like this, eventually the layout should be responsive with a flexible amount of columns. It should be reflected here imho (as e.g. `grid.columnCount - 1`)
created_at: 2025-04-15T17:04:39Z
author_association: MEMBER
diff_hunk: @@ -0,0 +1,105 @@
+import QtQuick 2.15
+import QtQuick.Layouts 1.15
+
+import StatusQ.Core 0.1
+import StatusQ.Core.Theme 0.1
+import StatusQ.Controls 0.1
+
+import shared.controls 1.0
+import shared.panels 1.0
+
+Item {
+    id: root
+
+    /*!
+        \qmlsignal StatusCommunityCard::learnMore
+        This signal is emitted when the card learn more button is clicked.
+    */
+    signal learnMore
+
+    /*!
+        \qmlsignal StatusCommunityCard::initiateVote
+        This signal is emitted when the card initiate vote button is clicked
+    */
+    signal initiateVote
+
+    QtObject {
+        id: d
+        readonly property int cardWidth: 335
+        readonly property int cardHeigth: 230
+        readonly property int defaultMargin: 12
+        readonly property int defaultSpacing: 8
+    }
+
+    implicitWidth: d.cardWidth
+    implicitHeight: d.cardHeigth
+
+    ShapeRectangle {
+        anchors.fill: parent
+
+        ColumnLayout {
+            width: parent.width
+            anchors.verticalCenter: parent.verticalCenter
path: ui/app/AppLayouts/Communities/controls/PromotionalCommunityCard.qml
user: login: caybro
body: What about the `horizontalCenter`?
created_at: 2025-04-15T17:05:56Z
author_association: MEMBER
diff_hunk: @@ -34,6 +35,11 @@ StatusScrollView {
         // values from the design
         readonly property int scrollViewTopMargin: 20
         readonly property int subtitlePixelSize: 17
+        readonly property int promotionalCardPosition: 2
path: ui/app/AppLayouts/Communities/views/CommunitiesGridView.qml
user: login: noeliaSD
body: You are right, we can fix this way.
created_at: 2025-04-16T08:14:04Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,106 @@
+import QtQuick 2.15
+import QtQuick.Layouts 1.15
+
+import StatusQ.Core 0.1
+import StatusQ.Core.Theme 0.1
+import StatusQ.Controls 0.1
+
+import shared.controls 1.0
+import shared.panels 1.0
+
+Item {
+    id: root
+
+    /*!
+        \qmlsignal StatusCommunityCard::learnMore
+        This signal is emitted when the card learn more button is clicked.
+    */
+    signal learnMore
+
+    /*!
+        \qmlsignal StatusCommunityCard::initiateVote
+        This signal is emitted when the card initiate vote button is clicked
+    */
+    signal initiateVote
+
+    QtObject {
+        id: d
+        readonly property int cardWidth: 335
+        readonly property int cardHeight: 230
+        readonly property int defaultMargin: 12
+        readonly property int defaultSpacing: 8
+    }
+
+    implicitWidth: d.cardWidth
+    implicitHeight: d.cardHeight
+
+    ShapeRectangle {
+        anchors.fill: parent
+
+        ColumnLayout {
+            width: parent.width
+            anchors.verticalCenter: parent.verticalCenter
+            anchors.horizontalCenter: parent.horizontalCenter
path: ui/app/AppLayouts/Communities/controls/PromotionalCommunityCard.qml
user: login: caybro
body: Now it can be a simple :wink: :
```suggestion
            anchors.centerIn: parent
```
created_at: 2025-04-16T09:31:17Z
author_association: MEMBER

PR comments:
user: login: status-im-auto
created_at: 2025-04-15T16:35:44Z
body: 
### Jenkins Builds
<details>
<summary>Click to see older builds (8)</summary>

| :grey_question: | Commit | :hash: | Finished (UTC) | Duration | Platform | Result |
|-|-|-|-|-|-|-|
| :heavy_check_mark: | f0b359f6 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17799/1/) | 2025-04-15 16:35:43 | ~8 min | `tests/nim` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17799/1//consoleText) |
| :heavy_check_mark: | f0b359f6 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17799/1/) | 2025-04-15 16:40:07 | ~13 min | `tests/ui` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17799/1//consoleText) |
| :heavy_check_mark: | f0b359f6 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/windows/job/x86_64/job/package/job/PR-17799/1/) | 2025-04-15 16:46:32 | ~19 min | `windows/x86_64` | [:cd:`exe`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250415-162708-f0b359-pr17799-x86_64.exe) |
| :heavy_check_mark: | f0b359f6 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package-nix/job/PR-17799/1/) | 2025-04-15 16:50:07 | ~23 min | `linux-nix/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250415-162659-f0b359-pr17799-x86_64.nix.tar.gz) |
| :heavy_check_mark: | f0b359f6 | [#1](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package/job/PR-17799/1/) | 2025-04-15 16:50:40 | ~23 min | `linux/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250415-162701-f0b359-pr17799-x86_64.tar.gz) |
| | | | | | | |
| :heavy_check_mark: | 61215b83 | [#2](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17799/2/) | 2025-04-16 08:30:27 | ~9 min | `tests/nim` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17799/2//consoleText) |
| :heavy_check_mark: | 61215b83 | [#2](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17799/2/) | 2025-04-16 08:36:04 | ~14 min | `tests/ui` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17799/2//consoleText) |
| :heavy_check_mark: | 61215b83 | [#2](https://ci.status.im/job/status-desktop/job/prs/job/windows/job/x86_64/job/package/job/PR-17799/2/) | 2025-04-16 08:39:27 | ~17 min | `windows/x86_64` | [:cd:`exe`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-082129-61215b-pr17799-x86_64.exe) |
</details>

| :grey_question: | Commit | :hash: | Finished (UTC) | Duration | Platform | Result |
|-|-|-|-|-|-|-|
| :heavy_check_mark: | 7e60a747 | [#3](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/aarch64/job/package/job/PR-17799/3/) | 2025-04-16 08:50:08 | ~9 min | `macos/aarch64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-084053-7e60a7-pr17799-aarch64.dmg) |
| :heavy_check_mark: | 7e60a747 | [#3](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17799/3/) | 2025-04-16 08:50:27 | ~9 min | `tests/nim` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17799/3//consoleText) |
| :heavy_check_mark: | 7e60a747 | [#3](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17799/3/) | 2025-04-16 08:55:06 | ~14 min | `tests/ui` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17799/3//consoleText) |
| :heavy_check_mark: | 7e60a747 | [#3](https://ci.status.im/job/status-desktop/job/prs/job/windows/job/x86_64/job/package/job/PR-17799/3/) | 2025-04-16 08:57:15 | ~16 min | `windows/x86_64` | [:cd:`exe`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-084055-7e60a7-pr17799-x86_64.exe) |
| :heavy_check_mark: | 7e60a747 | [#3](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/x86_64/job/package/job/PR-17799/3/) | 2025-04-16 09:01:27 | ~20 min | `macos/x86_64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-084053-7e60a7-pr17799-x86_64.dmg) |
| :heavy_check_mark: | 7e60a747 | [#3](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package/job/PR-17799/3/) | 2025-04-16 09:02:36 | ~21 min | `linux/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-084049-7e60a7-pr17799-x86_64.tar.gz) |
| :heavy_check_mark: | 7e60a747 | [#3](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package-nix/job/PR-17799/3/) | 2025-04-16 09:03:19 | ~22 min | `linux-nix/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-084048-7e60a7-pr17799-x86_64.nix.tar.gz) |
| | | | | | | |
| :heavy_check_mark: | ce18e488 | [#4](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/aarch64/job/package/job/PR-17799/4/) | 2025-04-16 09:43:51 | ~6 min | `macos/aarch64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-093720-ce18e4-pr17799-aarch64.dmg) |
| :heavy_check_mark: | ce18e488 | [#4](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17799/4/) | 2025-04-16 09:47:51 | ~10 min | `tests/nim` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-nim/job/PR-17799/4//consoleText) |
| :heavy_check_mark: | ce18e488 | [#4](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17799/4/) | 2025-04-16 09:50:41 | ~13 min | `tests/ui` | [:page_facing_up:`log`](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/tests-ui/job/PR-17799/4//consoleText) |
| :heavy_check_mark: | ce18e488 | [#4](https://ci.status.im/job/status-desktop/job/prs/job/macos/job/x86_64/job/package/job/PR-17799/4/) | 2025-04-16 09:53:10 | ~15 min | `macos/x86_64` | [:apple:`dmg`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-093722-ce18e4-pr17799-x86_64.dmg) |
| :heavy_check_mark: | ce18e488 | [#4](https://ci.status.im/job/status-desktop/job/prs/job/windows/job/x86_64/job/package/job/PR-17799/4/) | 2025-04-16 09:58:11 | ~20 min | `windows/x86_64` | [:cd:`exe`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-093724-ce18e4-pr17799-x86_64.exe) |
| :heavy_check_mark: | ce18e488 | [#4](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package/job/PR-17799/4/) | 2025-04-16 10:01:33 | ~24 min | `linux/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-093717-ce18e4-pr17799-x86_64.tar.gz) |
| :heavy_check_mark: | ce18e488 | [#4](https://ci.status.im/job/status-desktop/job/prs/job/linux/job/x86_64/job/package-nix/job/PR-17799/4/) | 2025-04-16 10:02:56 | ~25 min | `linux-nix/x86_64` | [:package:`tgz`](https://status-im-desktop-prs.ams3.cdn.digitaloceanspaces.com/StatusIm-Desktop-250416-093715-ce18e4-pr17799-x86_64.nix.tar.gz) |

author_association: MEMBER
user: login: jakubgs
created_at: 2025-04-16T07:58:25Z
body: This branch is created from an outdated `master`, please rebase.
author_association: MEMBER