From c6af22c9c65cd166049b7914d5c8469e8e702867 Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Thu, 21 May 2026 20:37:21 -0700 Subject: [PATCH 01/12] Add flatpak build job to CI --- .github/workflows/build.yaml | 70 ++++++++++++++++++- flatpak/com.cypherstack.stackwallet.desktop | 7 ++ .../com.cypherstack.stackwallet.metainfo.xml | 17 +++++ flatpak/com.cypherstack.stackwallet.yaml | 35 ++++++++++ flatpak/stack_wallet.sh | 2 + 5 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 flatpak/com.cypherstack.stackwallet.desktop create mode 100644 flatpak/com.cypherstack.stackwallet.metainfo.xml create mode 100644 flatpak/com.cypherstack.stackwallet.yaml create mode 100644 flatpak/stack_wallet.sh diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index e9dd3ed29..6a92ed681 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -484,9 +484,75 @@ jobs: name: stack_wallet-ios-aarch64-${{ steps.ver.outputs.version }} path: stack_wallet-ios-aarch64-${{ steps.ver.outputs.version }}.ipa + build-flatpak: + runs-on: ubuntu-24.04 + needs: build-linux + steps: + - uses: actions/checkout@v6 + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + + - name: Download Linux bundle + uses: actions/download-artifact@v4 + with: + name: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }} + + - name: Stage bundle and icon + run: | + tar -xzf "stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" -C flatpak/ + cp asset_sources/icon/stack_wallet/icon.png flatpak/com.cypherstack.stackwallet.png + + - name: Install Flatpak tools + run: | + sudo apt-get update -q + sudo apt-get install -y flatpak flatpak-builder + + - name: Set up Flathub remote + run: flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + + - name: Cache Flatpak SDK + uses: actions/cache@v4 + with: + path: ~/.local/share/flatpak + key: flatpak-freedesktop-24.08-v1 + + - name: Install Flatpak SDK + run: | + flatpak install --user --noninteractive flathub \ + org.freedesktop.Platform//24.08 \ + org.freedesktop.Sdk//24.08 + + - name: Build Flatpak + run: | + flatpak-builder --user --force-clean \ + --repo=flatpak-repo \ + build-flatpak flatpak/com.cypherstack.stackwallet.yaml + + - name: Bundle Flatpak + run: | + flatpak build-bundle flatpak-repo \ + "stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.flatpak" \ + com.cypherstack.stackwallet + + - uses: actions/upload-artifact@v4 + with: + name: stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }} + path: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.flatpak + release: if: github.ref_type == 'tag' - needs: [build-linux, build-android, build-windows, build-macos, build-ios] + needs: [build-linux, build-android, build-windows, build-macos, build-ios, build-flatpak] runs-on: ubuntu-latest permissions: contents: write @@ -503,7 +569,7 @@ jobs: name=$(basename "$dir") (cd "$dir" && zip -r "../../release-files/${name}.zip" .) done - find artifacts/ \( -name "*.tar.gz" -o -name "*.zip" -o -name "*.ipa" \) -mindepth 2 -exec mv {} release-files/ \; + find artifacts/ \( -name "*.tar.gz" -o -name "*.zip" -o -name "*.ipa" -o -name "*.flatpak" \) -mindepth 2 -exec mv {} release-files/ \; find artifacts/ -name "*.apk" -mindepth 2 -exec mv {} release-files/ \; - uses: softprops/action-gh-release@v2 diff --git a/flatpak/com.cypherstack.stackwallet.desktop b/flatpak/com.cypherstack.stackwallet.desktop new file mode 100644 index 000000000..d5b7d55d2 --- /dev/null +++ b/flatpak/com.cypherstack.stackwallet.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=Stack Wallet +Comment=Open-source non-custodial cryptocurrency wallet +Exec=stack_wallet +Icon=com.cypherstack.stackwallet +Type=Application +Categories=Finance; diff --git a/flatpak/com.cypherstack.stackwallet.metainfo.xml b/flatpak/com.cypherstack.stackwallet.metainfo.xml new file mode 100644 index 000000000..abf3b19c9 --- /dev/null +++ b/flatpak/com.cypherstack.stackwallet.metainfo.xml @@ -0,0 +1,17 @@ + + + com.cypherstack.stackwallet + CC0-1.0 + GPL-3.0-only + Stack Wallet + Open-source non-custodial cryptocurrency wallet + +

+ Stack Wallet is an open-source, non-custodial, privacy-focused + cryptocurrency wallet supporting multiple coins. +

+
+ https://stackwallet.com + https://github.com/cypherstack/stack_wallet/issues + +
diff --git a/flatpak/com.cypherstack.stackwallet.yaml b/flatpak/com.cypherstack.stackwallet.yaml new file mode 100644 index 000000000..3707ccbba --- /dev/null +++ b/flatpak/com.cypherstack.stackwallet.yaml @@ -0,0 +1,35 @@ +app-id: com.cypherstack.stackwallet +runtime: org.freedesktop.Platform +runtime-version: '24.08' +sdk: org.freedesktop.Sdk +command: stack_wallet + +finish-args: + - --share=network + - --share=ipc + - --socket=fallback-x11 + - --socket=wayland + - --device=dri + - --talk-name=org.freedesktop.secrets + - --talk-name=org.freedesktop.Notifications + +modules: + - name: stack_wallet + buildsystem: simple + build-commands: + # Install the pre-built Flutter bundle under /app/lib/stack_wallet/ so + # the binary's $ORIGIN/lib and $ORIGIN/data lookups resolve correctly. + - mkdir -p /app/lib/stack_wallet + - install -Dm755 bundle/stack_wallet /app/lib/stack_wallet/stack_wallet + - cp -r bundle/lib bundle/data /app/lib/stack_wallet/ + # Wrapper script so the Flatpak command path resolves to the binary. + - install -Dm755 stack_wallet.sh /app/bin/stack_wallet + - install -Dm644 com.cypherstack.stackwallet.desktop + /app/share/applications/com.cypherstack.stackwallet.desktop + - install -Dm644 com.cypherstack.stackwallet.metainfo.xml + /app/share/metainfo/com.cypherstack.stackwallet.metainfo.xml + - install -Dm644 com.cypherstack.stackwallet.png + /app/share/icons/hicolor/512x512/apps/com.cypherstack.stackwallet.png + sources: + - type: dir + path: . diff --git a/flatpak/stack_wallet.sh b/flatpak/stack_wallet.sh new file mode 100644 index 000000000..db2f325b1 --- /dev/null +++ b/flatpak/stack_wallet.sh @@ -0,0 +1,2 @@ +#!/bin/sh +exec /app/lib/stack_wallet/stack_wallet "$@" From b36af88c37cfff1422e4835ae33f915625ec09f9 Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Thu, 21 May 2026 21:40:06 -0700 Subject: [PATCH 02/12] ci: embed Flathub runtime-repo in flatpak bundle --- .github/workflows/build.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 6a92ed681..5b96e739a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -542,6 +542,7 @@ jobs: - name: Bundle Flatpak run: | flatpak build-bundle flatpak-repo \ + --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo \ "stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.flatpak" \ com.cypherstack.stackwallet From f2c52c2042d89641d33d1a41f717235f30b9353c Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Thu, 21 May 2026 22:10:27 -0700 Subject: [PATCH 03/12] flatpak: grant filesystem access to ~/.stackwallet --- flatpak/com.cypherstack.stackwallet.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/flatpak/com.cypherstack.stackwallet.yaml b/flatpak/com.cypherstack.stackwallet.yaml index 3707ccbba..f8836e6de 100644 --- a/flatpak/com.cypherstack.stackwallet.yaml +++ b/flatpak/com.cypherstack.stackwallet.yaml @@ -10,6 +10,7 @@ finish-args: - --socket=fallback-x11 - --socket=wayland - --device=dri + - --filesystem=~/.stackwallet - --talk-name=org.freedesktop.secrets - --talk-name=org.freedesktop.Notifications From 9571fae89331ee06afa765cca1cea99d06d724c7 Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Fri, 22 May 2026 11:21:30 -0700 Subject: [PATCH 04/12] ci: add build-campfire-linux and build-stack-duo-linux jobs --- .github/workflows/build.yaml | 130 ++++++++++++++++++++++++++++++++++- 1 file changed, 129 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 5b96e739a..08b39f8d3 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -484,6 +484,134 @@ jobs: name: stack_wallet-ios-aarch64-${{ steps.ver.outputs.version }} path: stack_wallet-ios-aarch64-${{ steps.ver.outputs.version }}.ipa + build-campfire-linux: + runs-on: ubuntu-24.04 + permissions: + contents: read + packages: read + container: + image: ghcr.io/${{ github.repository_owner }}/stackwallet-ci:latest + credentials: + username: ${{ github.actor }} + password: ${{ github.token }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + BUILD_NUMBER="${{ github.run_number }}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + BUILD_NUMBER="${{ inputs.build_number }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + BUILD_NUMBER="${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT + + - name: Configure app + run: | + cd scripts + echo "yes" | ./build_app.sh \ + -v "${{ steps.ver.outputs.version }}" \ + -b "${{ steps.ver.outputs.build_number }}" \ + -p linux -a campfire -d -s + + - name: Get dependencies + run: flutter pub get + + - name: Decode secrets + env: + CHANGE_NOW: ${{ secrets.CHANGE_NOW }} + run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart + + - name: Build + env: + USE_SYSTEM_SECURE_STORAGE_DEPS: "1" + run: flutter build linux --release --verbose + + - name: Package + run: | + tar -czf "campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" \ + -C build/linux/x64/release bundle + + - uses: actions/upload-artifact@v4 + with: + name: campfire-linux-x86_64-${{ steps.ver.outputs.version }} + path: campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz + + build-stack-duo-linux: + runs-on: ubuntu-24.04 + permissions: + contents: read + packages: read + container: + image: ghcr.io/${{ github.repository_owner }}/stackwallet-ci:latest + credentials: + username: ${{ github.actor }} + password: ${{ github.token }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + BUILD_NUMBER="${{ github.run_number }}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + BUILD_NUMBER="${{ inputs.build_number }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + BUILD_NUMBER="${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT + + - name: Configure app + run: | + cd scripts + echo "yes" | ./build_app.sh \ + -v "${{ steps.ver.outputs.version }}" \ + -b "${{ steps.ver.outputs.build_number }}" \ + -p linux -a stack_duo -d -s + + - name: Get dependencies + run: flutter pub get + + - name: Decode secrets + env: + CHANGE_NOW: ${{ secrets.CHANGE_NOW }} + run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart + + - name: Build + env: + USE_SYSTEM_SECURE_STORAGE_DEPS: "1" + run: flutter build linux --release --verbose + + - name: Package + run: | + tar -czf "stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" \ + -C build/linux/x64/release bundle + + - uses: actions/upload-artifact@v4 + with: + name: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }} + path: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz + build-flatpak: runs-on: ubuntu-24.04 needs: build-linux @@ -553,7 +681,7 @@ jobs: release: if: github.ref_type == 'tag' - needs: [build-linux, build-android, build-windows, build-macos, build-ios, build-flatpak] + needs: [build-linux, build-android, build-windows, build-macos, build-ios, build-flatpak, build-campfire-linux, build-stack-duo-linux] runs-on: ubuntu-latest permissions: contents: write From 4f3927e5cb57b4814e1cc0ce8b2444278c42771f Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Fri, 22 May 2026 11:37:44 -0700 Subject: [PATCH 05/12] Drop release workflow to keep it manual --- .github/workflows/build.yaml | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 08b39f8d3..347f872a4 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -679,29 +679,3 @@ jobs: name: stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }} path: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.flatpak - release: - if: github.ref_type == 'tag' - needs: [build-linux, build-android, build-windows, build-macos, build-ios, build-flatpak, build-campfire-linux, build-stack-duo-linux] - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/download-artifact@v4 - with: - path: artifacts - - - name: Package artifacts - run: | - mkdir -p release-files - for dir in artifacts/stack_wallet-windows-*/; do - [ -d "$dir" ] || continue - name=$(basename "$dir") - (cd "$dir" && zip -r "../../release-files/${name}.zip" .) - done - find artifacts/ \( -name "*.tar.gz" -o -name "*.zip" -o -name "*.ipa" -o -name "*.flatpak" \) -mindepth 2 -exec mv {} release-files/ \; - find artifacts/ -name "*.apk" -mindepth 2 -exec mv {} release-files/ \; - - - uses: softprops/action-gh-release@v2 - with: - generate_release_notes: true - files: release-files/* From 70df0e5682ea62994e42d33060997a99d88d5883 Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Fri, 22 May 2026 11:44:13 -0700 Subject: [PATCH 06/12] ci: package Windows as zip, add Android AAB, add format extensions to artifact names --- .github/workflows/build.yaml | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 347f872a4..ea994cba0 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -93,7 +93,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }} + name: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz path: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz build-android: @@ -203,6 +203,8 @@ jobs: android-artifacts/stack_wallet-android-armeabi-v7a-${VERSION}.apk cp build/app/outputs/flutter-apk/app-x86_64-release.apk \ android-artifacts/stack_wallet-android-x86_64-${VERSION}.apk + cp build/app/outputs/bundle/release/app-release.aab \ + android-artifacts/stack_wallet-android-${VERSION}.aab - uses: actions/upload-artifact@v4 with: @@ -320,10 +322,16 @@ jobs: - name: Build run: flutter build windows --release + - name: Package + shell: pwsh + run: | + Compress-Archive -Path "build/windows/x64/runner/Release/*" ` + -DestinationPath "stack_wallet-windows-x86_64-${{ steps.ver.outputs.version }}.zip" + - uses: actions/upload-artifact@v4 with: - name: stack_wallet-windows-x86_64-${{ steps.ver.outputs.version }} - path: build/windows/x64/runner/Release/ + name: stack_wallet-windows-x86_64-${{ steps.ver.outputs.version }}.zip + path: stack_wallet-windows-x86_64-${{ steps.ver.outputs.version }}.zip build-macos: runs-on: macos-latest @@ -399,7 +407,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: stack_wallet-macos-aarch64-${{ steps.ver.outputs.version }} + name: stack_wallet-macos-aarch64-${{ steps.ver.outputs.version }}.zip path: stack_wallet-macos-aarch64-${{ steps.ver.outputs.version }}.zip build-ios: @@ -481,7 +489,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: stack_wallet-ios-aarch64-${{ steps.ver.outputs.version }} + name: stack_wallet-ios-aarch64-${{ steps.ver.outputs.version }}.ipa path: stack_wallet-ios-aarch64-${{ steps.ver.outputs.version }}.ipa build-campfire-linux: @@ -545,7 +553,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: campfire-linux-x86_64-${{ steps.ver.outputs.version }} + name: campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz path: campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz build-stack-duo-linux: @@ -609,7 +617,7 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }} + name: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz path: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz build-flatpak: @@ -634,7 +642,7 @@ jobs: - name: Download Linux bundle uses: actions/download-artifact@v4 with: - name: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }} + name: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz - name: Stage bundle and icon run: | @@ -671,11 +679,11 @@ jobs: run: | flatpak build-bundle flatpak-repo \ --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo \ - "stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.flatpak" \ + "stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak" \ com.cypherstack.stackwallet - uses: actions/upload-artifact@v4 with: - name: stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }} - path: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.flatpak + name: stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak + path: stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak From b37c46558dccc28ba8bab3c41362cc6f3f31dd96 Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Fri, 22 May 2026 14:44:19 -0700 Subject: [PATCH 07/12] ci: add AppImage builds and full platform coverage for campfire and stack_duo --- .github/workflows/build.yaml | 926 ++++++++++++++++++ appimage/campfire/AppRun | 5 + appimage/campfire/campfire.desktop | 7 + appimage/stack_duo/AppRun | 5 + appimage/stack_duo/stack_duo.desktop | 7 + appimage/stack_wallet/AppRun | 5 + appimage/stack_wallet/stack_wallet.desktop | 7 + flatpak/campfire.sh | 2 + flatpak/com.cypherstack.campfire.desktop | 7 + flatpak/com.cypherstack.campfire.metainfo.xml | 16 + flatpak/com.cypherstack.campfire.yaml | 33 + flatpak/com.cypherstack.stackduo.desktop | 7 + flatpak/com.cypherstack.stackduo.metainfo.xml | 16 + flatpak/com.cypherstack.stackduo.yaml | 33 + flatpak/stack_duo.sh | 2 + 15 files changed, 1078 insertions(+) create mode 100755 appimage/campfire/AppRun create mode 100644 appimage/campfire/campfire.desktop create mode 100755 appimage/stack_duo/AppRun create mode 100644 appimage/stack_duo/stack_duo.desktop create mode 100755 appimage/stack_wallet/AppRun create mode 100644 appimage/stack_wallet/stack_wallet.desktop create mode 100644 flatpak/campfire.sh create mode 100644 flatpak/com.cypherstack.campfire.desktop create mode 100644 flatpak/com.cypherstack.campfire.metainfo.xml create mode 100644 flatpak/com.cypherstack.campfire.yaml create mode 100644 flatpak/com.cypherstack.stackduo.desktop create mode 100644 flatpak/com.cypherstack.stackduo.metainfo.xml create mode 100644 flatpak/com.cypherstack.stackduo.yaml create mode 100644 flatpak/stack_duo.sh diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ea994cba0..3036f0764 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -687,3 +687,929 @@ jobs: name: stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak path: stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak + build-appimage: + runs-on: ubuntu-24.04 + needs: build-linux + steps: + - uses: actions/checkout@v6 + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + + - name: Download Linux bundle + uses: actions/download-artifact@v4 + with: + name: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz + + - name: Install AppImage tools + run: | + sudo apt-get update -q + sudo apt-get install -y squashfs-tools + + - name: Build AppImage + run: | + VERSION="${{ steps.ver.outputs.version }}" + tar -xzf "stack_wallet-linux-x86_64-${VERSION}.tar.gz" + mkdir -p AppDir + cp -r bundle/* AppDir/ + cp appimage/stack_wallet/AppRun AppDir/AppRun + chmod +x AppDir/AppRun + cp appimage/stack_wallet/stack_wallet.desktop AppDir/ + cp asset_sources/icon/stack_wallet/icon.png AppDir/stack_wallet.png + curl -fsSL -o appimagetool \ + https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage + chmod +x appimagetool + ARCH=x86_64 ./appimagetool --appimage-extract-and-run AppDir \ + "stack_wallet-appimage-x86_64-${VERSION}.AppImage" + + - uses: actions/upload-artifact@v4 + with: + name: stack_wallet-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage + path: stack_wallet-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage + + build-campfire-android: + runs-on: ubuntu-24.04 + permissions: + contents: read + packages: read + container: + image: ghcr.io/${{ github.repository_owner }}/stackwallet-ci:latest + credentials: + username: ${{ github.actor }} + password: ${{ github.token }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + BUILD_NUMBER="${{ github.run_number }}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + BUILD_NUMBER="${{ inputs.build_number }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + BUILD_NUMBER="${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT + + - name: Configure app + run: | + cd scripts + echo "yes" | ./build_app.sh \ + -v "${{ steps.ver.outputs.version }}" \ + -b "${{ steps.ver.outputs.build_number }}" \ + -p android -a campfire -d -s + + - name: Get dependencies + run: flutter pub get + + - name: Decode secrets + env: + CHANGE_NOW: ${{ secrets.CHANGE_NOW }} + run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart + + - name: Set up Android local.properties + run: | + cat > android/local.properties < android/keystore-orig.jks + [ -s android/keystore-orig.jks ] || { echo "ERROR: ANDROID_KEYSTORE_BASE64 secret is empty or not set"; exit 1; } + keytool -importkeystore \ + -srckeystore android/keystore-orig.jks \ + -destkeystore android/keystore.jks \ + -deststoretype pkcs12 \ + -srcstorepass "${{ secrets.ANDROID_STORE_PASSWORD }}" \ + -deststorepass "${{ secrets.ANDROID_STORE_PASSWORD }}" \ + -noprompt \ + -J-Dkeystore.pkcs12.legacy + rm android/keystore-orig.jks + cat > android/key.properties <> $GITHUB_OUTPUT + echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT + + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.38.1' + channel: 'stable' + + - uses: actions/setup-go@v5 + with: + go-version: '1.24.13' + + - name: Flutter doctor + run: flutter doctor -v + + - name: Configure app + run: | + cd scripts + echo "yes" | ./build_app.sh \ + -v "${{ steps.ver.outputs.version }}" \ + -b "${{ steps.ver.outputs.build_number }}" \ + -p windows -a campfire -d -s + + - name: Replace asset symlinks with copies (CI workaround) + run: | + set -euo pipefail + for dirname in default_themes icon lottie in_app_logo_icons svg; do + target="assets/${dirname}" + source="asset_sources/${dirname}/campfire" + if [ -e "$target" ] || [ -L "$target" ]; then + cmd.exe /c rmdir "$(cygpath -w "$target")" 2>/dev/null || rm -rf "$target" + fi + mkdir -p "$target" + cp -r "${source}/." "$target/" + done + + - name: Get dependencies + run: flutter pub get + + - name: Decode secrets + env: + CHANGE_NOW: ${{ secrets.CHANGE_NOW }} + run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart + + - name: Build secp256k1.dll for Windows + run: dart run coinlib:build_windows + + - name: Build + run: flutter build windows --release + + - name: Package + shell: pwsh + run: | + Compress-Archive -Path "build/windows/x64/runner/Release/*" ` + -DestinationPath "campfire-windows-x86_64-${{ steps.ver.outputs.version }}.zip" + + - uses: actions/upload-artifact@v4 + with: + name: campfire-windows-x86_64-${{ steps.ver.outputs.version }}.zip + path: campfire-windows-x86_64-${{ steps.ver.outputs.version }}.zip + + build-campfire-macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + BUILD_NUMBER="${{ github.run_number }}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + BUILD_NUMBER="${{ inputs.build_number }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + BUILD_NUMBER="${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT + + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.38.1' + channel: 'stable' + + - uses: actions/setup-go@v5 + with: + go-version: '1.24.13' + + - name: Configure app + run: | + cd scripts + echo "yes" | ./build_app.sh \ + -v "${{ steps.ver.outputs.version }}" \ + -b "${{ steps.ver.outputs.build_number }}" \ + -p macos -a campfire -d -s + + - name: Get dependencies + run: flutter pub get + + - name: Decode secrets + env: + CHANGE_NOW: ${{ secrets.CHANGE_NOW }} + run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart + + - name: Build + run: flutter build macos --release + + - name: Package + run: | + cd "build/macos/Build/Products/Release" + zip -r "$GITHUB_WORKSPACE/campfire-macos-aarch64-${{ steps.ver.outputs.version }}.zip" \ + "Campfire.app" + + - uses: actions/upload-artifact@v4 + with: + name: campfire-macos-aarch64-${{ steps.ver.outputs.version }}.zip + path: campfire-macos-aarch64-${{ steps.ver.outputs.version }}.zip + + build-campfire-ios: + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + BUILD_NUMBER="${{ github.run_number }}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + BUILD_NUMBER="${{ inputs.build_number }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + BUILD_NUMBER="${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT + + - uses: dtolnay/rust-toolchain@master + with: + toolchain: stable + targets: aarch64-apple-ios + + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.38.1' + channel: 'stable' + + - uses: actions/setup-go@v5 + with: + go-version: '1.24.13' + + - name: Configure app + run: | + cd scripts + echo "yes" | ./build_app.sh \ + -v "${{ steps.ver.outputs.version }}" \ + -b "${{ steps.ver.outputs.build_number }}" \ + -p ios -a campfire -d -s + + - name: Get dependencies + run: flutter pub get + + - name: Decode secrets + env: + CHANGE_NOW: ${{ secrets.CHANGE_NOW }} + run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart + + - name: Build + run: flutter build ios --release --no-codesign + + - name: Package IPA + run: | + mkdir Payload + cp -r build/ios/iphoneos/Runner.app Payload/ + zip -r "campfire-ios-aarch64-${{ steps.ver.outputs.version }}.ipa" Payload/ + + - uses: actions/upload-artifact@v4 + with: + name: campfire-ios-aarch64-${{ steps.ver.outputs.version }}.ipa + path: campfire-ios-aarch64-${{ steps.ver.outputs.version }}.ipa + + build-campfire-flatpak: + runs-on: ubuntu-24.04 + needs: build-campfire-linux + steps: + - uses: actions/checkout@v6 + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + + - name: Download Linux bundle + uses: actions/download-artifact@v4 + with: + name: campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz + + - name: Stage bundle and icon + run: | + tar -xzf "campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" -C flatpak/ + cp asset_sources/icon/campfire/icon.png flatpak/com.cypherstack.campfire.png + + - name: Install Flatpak tools + run: | + sudo apt-get update -q + sudo apt-get install -y flatpak flatpak-builder + + - name: Set up Flathub remote + run: flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + + - name: Cache Flatpak SDK + uses: actions/cache@v4 + with: + path: ~/.local/share/flatpak + key: flatpak-freedesktop-24.08-v1 + + - name: Install Flatpak SDK + run: | + flatpak install --user --noninteractive flathub \ + org.freedesktop.Platform//24.08 \ + org.freedesktop.Sdk//24.08 + + - name: Build Flatpak + run: | + flatpak-builder --user --force-clean \ + --repo=flatpak-repo \ + build-flatpak flatpak/com.cypherstack.campfire.yaml + + - name: Bundle Flatpak + run: | + flatpak build-bundle flatpak-repo \ + --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo \ + "campfire-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak" \ + com.cypherstack.campfire + + - uses: actions/upload-artifact@v4 + with: + name: campfire-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak + path: campfire-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak + + build-campfire-appimage: + runs-on: ubuntu-24.04 + needs: build-campfire-linux + steps: + - uses: actions/checkout@v6 + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + + - name: Download Linux bundle + uses: actions/download-artifact@v4 + with: + name: campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz + + - name: Install AppImage tools + run: | + sudo apt-get update -q + sudo apt-get install -y squashfs-tools + + - name: Build AppImage + run: | + VERSION="${{ steps.ver.outputs.version }}" + tar -xzf "campfire-linux-x86_64-${VERSION}.tar.gz" + mkdir -p AppDir + cp -r bundle/* AppDir/ + cp appimage/campfire/AppRun AppDir/AppRun + chmod +x AppDir/AppRun + cp appimage/campfire/campfire.desktop AppDir/ + cp asset_sources/icon/campfire/icon.png AppDir/campfire.png + curl -fsSL -o appimagetool \ + https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage + chmod +x appimagetool + ARCH=x86_64 ./appimagetool --appimage-extract-and-run AppDir \ + "campfire-appimage-x86_64-${VERSION}.AppImage" + + - uses: actions/upload-artifact@v4 + with: + name: campfire-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage + path: campfire-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage + + build-stack-duo-android: + runs-on: ubuntu-24.04 + permissions: + contents: read + packages: read + container: + image: ghcr.io/${{ github.repository_owner }}/stackwallet-ci:latest + credentials: + username: ${{ github.actor }} + password: ${{ github.token }} + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + BUILD_NUMBER="${{ github.run_number }}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + BUILD_NUMBER="${{ inputs.build_number }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + BUILD_NUMBER="${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT + + - name: Configure app + run: | + cd scripts + echo "yes" | ./build_app.sh \ + -v "${{ steps.ver.outputs.version }}" \ + -b "${{ steps.ver.outputs.build_number }}" \ + -p android -a stack_duo -d -s + + - name: Get dependencies + run: flutter pub get + + - name: Decode secrets + env: + CHANGE_NOW: ${{ secrets.CHANGE_NOW }} + run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart + + - name: Set up Android local.properties + run: | + cat > android/local.properties < android/keystore-orig.jks + [ -s android/keystore-orig.jks ] || { echo "ERROR: ANDROID_KEYSTORE_BASE64 secret is empty or not set"; exit 1; } + keytool -importkeystore \ + -srckeystore android/keystore-orig.jks \ + -destkeystore android/keystore.jks \ + -deststoretype pkcs12 \ + -srcstorepass "${{ secrets.ANDROID_STORE_PASSWORD }}" \ + -deststorepass "${{ secrets.ANDROID_STORE_PASSWORD }}" \ + -noprompt \ + -J-Dkeystore.pkcs12.legacy + rm android/keystore-orig.jks + cat > android/key.properties <> $GITHUB_OUTPUT + echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT + + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.38.1' + channel: 'stable' + + - uses: actions/setup-go@v5 + with: + go-version: '1.24.13' + + - name: Flutter doctor + run: flutter doctor -v + + - name: Configure app + run: | + cd scripts + echo "yes" | ./build_app.sh \ + -v "${{ steps.ver.outputs.version }}" \ + -b "${{ steps.ver.outputs.build_number }}" \ + -p windows -a stack_duo -d -s + + - name: Replace asset symlinks with copies (CI workaround) + run: | + set -euo pipefail + for dirname in default_themes icon lottie in_app_logo_icons svg; do + target="assets/${dirname}" + source="asset_sources/${dirname}/stack_duo" + if [ -e "$target" ] || [ -L "$target" ]; then + cmd.exe /c rmdir "$(cygpath -w "$target")" 2>/dev/null || rm -rf "$target" + fi + mkdir -p "$target" + cp -r "${source}/." "$target/" + done + + - name: Get dependencies + run: flutter pub get + + - name: Decode secrets + env: + CHANGE_NOW: ${{ secrets.CHANGE_NOW }} + run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart + + - name: Build secp256k1.dll for Windows + run: dart run coinlib:build_windows + + - name: Build + run: flutter build windows --release + + - name: Package + shell: pwsh + run: | + Compress-Archive -Path "build/windows/x64/runner/Release/*" ` + -DestinationPath "stack_duo-windows-x86_64-${{ steps.ver.outputs.version }}.zip" + + - uses: actions/upload-artifact@v4 + with: + name: stack_duo-windows-x86_64-${{ steps.ver.outputs.version }}.zip + path: stack_duo-windows-x86_64-${{ steps.ver.outputs.version }}.zip + + build-stack-duo-macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + BUILD_NUMBER="${{ github.run_number }}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + BUILD_NUMBER="${{ inputs.build_number }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + BUILD_NUMBER="${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT + + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.38.1' + channel: 'stable' + + - uses: actions/setup-go@v5 + with: + go-version: '1.24.13' + + - name: Configure app + run: | + cd scripts + echo "yes" | ./build_app.sh \ + -v "${{ steps.ver.outputs.version }}" \ + -b "${{ steps.ver.outputs.build_number }}" \ + -p macos -a stack_duo -d -s + + - name: Get dependencies + run: flutter pub get + + - name: Decode secrets + env: + CHANGE_NOW: ${{ secrets.CHANGE_NOW }} + run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart + + - name: Build + run: flutter build macos --release + + - name: Package + run: | + cd "build/macos/Build/Products/Release" + zip -r "$GITHUB_WORKSPACE/stack_duo-macos-aarch64-${{ steps.ver.outputs.version }}.zip" \ + "Stack Duo.app" + + - uses: actions/upload-artifact@v4 + with: + name: stack_duo-macos-aarch64-${{ steps.ver.outputs.version }}.zip + path: stack_duo-macos-aarch64-${{ steps.ver.outputs.version }}.zip + + build-stack-duo-ios: + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + BUILD_NUMBER="${{ github.run_number }}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + BUILD_NUMBER="${{ inputs.build_number }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + BUILD_NUMBER="${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + echo "build_number=${BUILD_NUMBER}" >> $GITHUB_OUTPUT + + - uses: dtolnay/rust-toolchain@master + with: + toolchain: stable + targets: aarch64-apple-ios + + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.38.1' + channel: 'stable' + + - uses: actions/setup-go@v5 + with: + go-version: '1.24.13' + + - name: Configure app + run: | + cd scripts + echo "yes" | ./build_app.sh \ + -v "${{ steps.ver.outputs.version }}" \ + -b "${{ steps.ver.outputs.build_number }}" \ + -p ios -a stack_duo -d -s + + - name: Get dependencies + run: flutter pub get + + - name: Decode secrets + env: + CHANGE_NOW: ${{ secrets.CHANGE_NOW }} + run: echo "$CHANGE_NOW" | base64 --decode > lib/external_api_keys.dart + + - name: Build + run: flutter build ios --release --no-codesign + + - name: Package IPA + run: | + mkdir Payload + cp -r build/ios/iphoneos/Runner.app Payload/ + zip -r "stack_duo-ios-aarch64-${{ steps.ver.outputs.version }}.ipa" Payload/ + + - uses: actions/upload-artifact@v4 + with: + name: stack_duo-ios-aarch64-${{ steps.ver.outputs.version }}.ipa + path: stack_duo-ios-aarch64-${{ steps.ver.outputs.version }}.ipa + + build-stack-duo-flatpak: + runs-on: ubuntu-24.04 + needs: build-stack-duo-linux + steps: + - uses: actions/checkout@v6 + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + + - name: Download Linux bundle + uses: actions/download-artifact@v4 + with: + name: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz + + - name: Stage bundle and icon + run: | + tar -xzf "stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" -C flatpak/ + cp asset_sources/icon/stack_duo/icon.png flatpak/com.cypherstack.stackduo.png + + - name: Install Flatpak tools + run: | + sudo apt-get update -q + sudo apt-get install -y flatpak flatpak-builder + + - name: Set up Flathub remote + run: flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo + + - name: Cache Flatpak SDK + uses: actions/cache@v4 + with: + path: ~/.local/share/flatpak + key: flatpak-freedesktop-24.08-v1 + + - name: Install Flatpak SDK + run: | + flatpak install --user --noninteractive flathub \ + org.freedesktop.Platform//24.08 \ + org.freedesktop.Sdk//24.08 + + - name: Build Flatpak + run: | + flatpak-builder --user --force-clean \ + --repo=flatpak-repo \ + build-flatpak flatpak/com.cypherstack.stackduo.yaml + + - name: Bundle Flatpak + run: | + flatpak build-bundle flatpak-repo \ + --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo \ + "stack_duo-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak" \ + com.cypherstack.stackduo + + - uses: actions/upload-artifact@v4 + with: + name: stack_duo-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak + path: stack_duo-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak + + build-stack-duo-appimage: + runs-on: ubuntu-24.04 + needs: build-stack-duo-linux + steps: + - uses: actions/checkout@v6 + + - name: Set version + id: ver + run: | + if [ "${{ github.ref_type }}" = "tag" ]; then + VERSION="${{ github.ref_name }}" + VERSION="${VERSION#v}" + elif [ -n "${{ inputs.version }}" ]; then + VERSION="${{ inputs.version }}" + else + VERSION="0.0.0-staging.${{ github.run_number }}" + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + + - name: Download Linux bundle + uses: actions/download-artifact@v4 + with: + name: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz + + - name: Install AppImage tools + run: | + sudo apt-get update -q + sudo apt-get install -y squashfs-tools + + - name: Build AppImage + run: | + VERSION="${{ steps.ver.outputs.version }}" + tar -xzf "stack_duo-linux-x86_64-${VERSION}.tar.gz" + mkdir -p AppDir + cp -r bundle/* AppDir/ + cp appimage/stack_duo/AppRun AppDir/AppRun + chmod +x AppDir/AppRun + cp appimage/stack_duo/stack_duo.desktop AppDir/ + cp asset_sources/icon/stack_duo/icon.png AppDir/stack_duo.png + curl -fsSL -o appimagetool \ + https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage + chmod +x appimagetool + ARCH=x86_64 ./appimagetool --appimage-extract-and-run AppDir \ + "stack_duo-appimage-x86_64-${VERSION}.AppImage" + + - uses: actions/upload-artifact@v4 + with: + name: stack_duo-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage + path: stack_duo-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage + diff --git a/appimage/campfire/AppRun b/appimage/campfire/AppRun new file mode 100755 index 000000000..2d22d3d22 --- /dev/null +++ b/appimage/campfire/AppRun @@ -0,0 +1,5 @@ +#!/bin/bash +SELF=$(readlink -f "$0") +HERE=${SELF%/*} +export LD_LIBRARY_PATH="${HERE}/lib:${LD_LIBRARY_PATH}" +exec "${HERE}/campfire" "$@" diff --git a/appimage/campfire/campfire.desktop b/appimage/campfire/campfire.desktop new file mode 100644 index 000000000..71b7b612c --- /dev/null +++ b/appimage/campfire/campfire.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=Campfire +Comment=Your privacy. Your wallet. Your Firo. +Exec=campfire +Icon=campfire +Type=Application +Categories=Finance; diff --git a/appimage/stack_duo/AppRun b/appimage/stack_duo/AppRun new file mode 100755 index 000000000..9b8f349b2 --- /dev/null +++ b/appimage/stack_duo/AppRun @@ -0,0 +1,5 @@ +#!/bin/bash +SELF=$(readlink -f "$0") +HERE=${SELF%/*} +export LD_LIBRARY_PATH="${HERE}/lib:${LD_LIBRARY_PATH}" +exec "${HERE}/stack_duo" "$@" diff --git a/appimage/stack_duo/stack_duo.desktop b/appimage/stack_duo/stack_duo.desktop new file mode 100644 index 000000000..64b9f6de4 --- /dev/null +++ b/appimage/stack_duo/stack_duo.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=Stack Duo +Comment=An open-source, multicoin wallet for everyone +Exec=stack_duo +Icon=stack_duo +Type=Application +Categories=Finance; diff --git a/appimage/stack_wallet/AppRun b/appimage/stack_wallet/AppRun new file mode 100755 index 000000000..6038f4b29 --- /dev/null +++ b/appimage/stack_wallet/AppRun @@ -0,0 +1,5 @@ +#!/bin/bash +SELF=$(readlink -f "$0") +HERE=${SELF%/*} +export LD_LIBRARY_PATH="${HERE}/lib:${LD_LIBRARY_PATH}" +exec "${HERE}/stack_wallet" "$@" diff --git a/appimage/stack_wallet/stack_wallet.desktop b/appimage/stack_wallet/stack_wallet.desktop new file mode 100644 index 000000000..19c6fcce5 --- /dev/null +++ b/appimage/stack_wallet/stack_wallet.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=Stack Wallet +Comment=Open-source non-custodial cryptocurrency wallet +Exec=stack_wallet +Icon=stack_wallet +Type=Application +Categories=Finance; diff --git a/flatpak/campfire.sh b/flatpak/campfire.sh new file mode 100644 index 000000000..0bd715433 --- /dev/null +++ b/flatpak/campfire.sh @@ -0,0 +1,2 @@ +#!/bin/sh +exec /app/lib/campfire/campfire "$@" diff --git a/flatpak/com.cypherstack.campfire.desktop b/flatpak/com.cypherstack.campfire.desktop new file mode 100644 index 000000000..512ef2cc0 --- /dev/null +++ b/flatpak/com.cypherstack.campfire.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=Campfire +Comment=Your privacy. Your wallet. Your Firo. +Exec=campfire +Icon=com.cypherstack.campfire +Type=Application +Categories=Finance; diff --git a/flatpak/com.cypherstack.campfire.metainfo.xml b/flatpak/com.cypherstack.campfire.metainfo.xml new file mode 100644 index 000000000..f355750b4 --- /dev/null +++ b/flatpak/com.cypherstack.campfire.metainfo.xml @@ -0,0 +1,16 @@ + + + com.cypherstack.campfire + CC0-1.0 + GPL-3.0-only + Campfire + Your privacy. Your wallet. Your Firo. + +

+ Campfire is an open-source, non-custodial Firo wallet. +

+
+ https://campfireprivacy.com + https://github.com/cypherstack/stack_wallet/issues + +
diff --git a/flatpak/com.cypherstack.campfire.yaml b/flatpak/com.cypherstack.campfire.yaml new file mode 100644 index 000000000..9f8cd9efc --- /dev/null +++ b/flatpak/com.cypherstack.campfire.yaml @@ -0,0 +1,33 @@ +app-id: com.cypherstack.campfire +runtime: org.freedesktop.Platform +runtime-version: '24.08' +sdk: org.freedesktop.Sdk +command: campfire + +finish-args: + - --share=network + - --share=ipc + - --socket=fallback-x11 + - --socket=wayland + - --device=dri + - --filesystem=~/.campfire + - --talk-name=org.freedesktop.secrets + - --talk-name=org.freedesktop.Notifications + +modules: + - name: campfire + buildsystem: simple + build-commands: + - mkdir -p /app/lib/campfire + - install -Dm755 bundle/campfire /app/lib/campfire/campfire + - cp -r bundle/lib bundle/data /app/lib/campfire/ + - install -Dm755 campfire.sh /app/bin/campfire + - install -Dm644 com.cypherstack.campfire.desktop + /app/share/applications/com.cypherstack.campfire.desktop + - install -Dm644 com.cypherstack.campfire.metainfo.xml + /app/share/metainfo/com.cypherstack.campfire.metainfo.xml + - install -Dm644 com.cypherstack.campfire.png + /app/share/icons/hicolor/512x512/apps/com.cypherstack.campfire.png + sources: + - type: dir + path: . diff --git a/flatpak/com.cypherstack.stackduo.desktop b/flatpak/com.cypherstack.stackduo.desktop new file mode 100644 index 000000000..219c83506 --- /dev/null +++ b/flatpak/com.cypherstack.stackduo.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Name=Stack Duo +Comment=An open-source, multicoin wallet for everyone +Exec=stack_duo +Icon=com.cypherstack.stackduo +Type=Application +Categories=Finance; diff --git a/flatpak/com.cypherstack.stackduo.metainfo.xml b/flatpak/com.cypherstack.stackduo.metainfo.xml new file mode 100644 index 000000000..1e929dec2 --- /dev/null +++ b/flatpak/com.cypherstack.stackduo.metainfo.xml @@ -0,0 +1,16 @@ + + + com.cypherstack.stackduo + CC0-1.0 + GPL-3.0-only + Stack Duo + An open-source, multicoin wallet for everyone + +

+ Stack Duo is an open-source, non-custodial cryptocurrency wallet. +

+
+ https://stackwallet.com + https://github.com/cypherstack/stack_wallet/issues + +
diff --git a/flatpak/com.cypherstack.stackduo.yaml b/flatpak/com.cypherstack.stackduo.yaml new file mode 100644 index 000000000..195f67457 --- /dev/null +++ b/flatpak/com.cypherstack.stackduo.yaml @@ -0,0 +1,33 @@ +app-id: com.cypherstack.stackduo +runtime: org.freedesktop.Platform +runtime-version: '24.08' +sdk: org.freedesktop.Sdk +command: stack_duo + +finish-args: + - --share=network + - --share=ipc + - --socket=fallback-x11 + - --socket=wayland + - --device=dri + - --filesystem=~/.stackduo + - --talk-name=org.freedesktop.secrets + - --talk-name=org.freedesktop.Notifications + +modules: + - name: stack_duo + buildsystem: simple + build-commands: + - mkdir -p /app/lib/stack_duo + - install -Dm755 bundle/stack_duo /app/lib/stack_duo/stack_duo + - cp -r bundle/lib bundle/data /app/lib/stack_duo/ + - install -Dm755 stack_duo.sh /app/bin/stack_duo + - install -Dm644 com.cypherstack.stackduo.desktop + /app/share/applications/com.cypherstack.stackduo.desktop + - install -Dm644 com.cypherstack.stackduo.metainfo.xml + /app/share/metainfo/com.cypherstack.stackduo.metainfo.xml + - install -Dm644 com.cypherstack.stackduo.png + /app/share/icons/hicolor/512x512/apps/com.cypherstack.stackduo.png + sources: + - type: dir + path: . diff --git a/flatpak/stack_duo.sh b/flatpak/stack_duo.sh new file mode 100644 index 000000000..522eab523 --- /dev/null +++ b/flatpak/stack_duo.sh @@ -0,0 +1,2 @@ +#!/bin/sh +exec /app/lib/stack_duo/stack_duo "$@" From ae2fabe08e707cbbf0895f37521b7ae5b7268da3 Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Fri, 22 May 2026 15:34:30 -0700 Subject: [PATCH 08/12] ci: fix Rust toolchains and campfire flatpak icon for non-linux builds --- .github/workflows/build.yaml | 45 +++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 3036f0764..eaf23aefc 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -879,6 +879,12 @@ jobs: - name: Flutter doctor run: flutter doctor -v + - name: Install Rust toolchains + run: | + rustup toolchain install 1.85.1 + rustup toolchain install 1.89.0 + rustup default 1.89.0 + - name: Configure app run: | cd scripts @@ -959,6 +965,12 @@ jobs: with: go-version: '1.24.13' + - name: Install Rust toolchains + run: | + rustup toolchain install 1.85.1 + rustup toolchain install 1.89.0 + rustup default 1.89.0 + - name: Configure app run: | cd scripts @@ -1028,6 +1040,14 @@ jobs: with: go-version: '1.24.13' + - name: Install additional Rust toolchains + run: | + rustup toolchain install 1.85.1 + rustup toolchain install 1.89.0 + rustup default 1.89.0 + rustup target add aarch64-apple-ios --toolchain 1.89.0 + rustup target add x86_64-apple-ios --toolchain 1.89.0 + - name: Configure app run: | cd scripts @@ -1085,7 +1105,9 @@ jobs: - name: Stage bundle and icon run: | tar -xzf "campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" -C flatpak/ - cp asset_sources/icon/campfire/icon.png flatpak/com.cypherstack.campfire.png + convert -resize 512x512! \ + asset_sources/icon/campfire/icon.png \ + flatpak/com.cypherstack.campfire.png - name: Install Flatpak tools run: | @@ -1317,6 +1339,12 @@ jobs: - name: Flutter doctor run: flutter doctor -v + - name: Install Rust toolchains + run: | + rustup toolchain install 1.85.1 + rustup toolchain install 1.89.0 + rustup default 1.89.0 + - name: Configure app run: | cd scripts @@ -1397,6 +1425,13 @@ jobs: with: go-version: '1.24.13' + - name: Install Rust toolchains + run: | + rustup toolchain install 1.85.1 + rustup toolchain install 1.89.0 + rustup default 1.89.0 + rustup target add aarch64-apple-darwin --toolchain 1.89.0 + - name: Configure app run: | cd scripts @@ -1466,6 +1501,14 @@ jobs: with: go-version: '1.24.13' + - name: Install additional Rust toolchains + run: | + rustup toolchain install 1.85.1 + rustup toolchain install 1.89.0 + rustup default 1.89.0 + rustup target add aarch64-apple-ios --toolchain 1.89.0 + rustup target add x86_64-apple-ios --toolchain 1.89.0 + - name: Configure app run: | cd scripts From a31e0945f8502c0a065600bdc27fd880b0771bc4 Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Fri, 22 May 2026 15:44:38 -0700 Subject: [PATCH 09/12] ci: upgrade actions to latest major versions (setup-go v6, upload/download-artifact v7/v8, cache v5) --- .github/workflows/build.yaml | 78 ++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index eaf23aefc..ffca41d0e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -91,7 +91,7 @@ jobs: tar -czf "stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" \ -C build/linux/x64/release bundle - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz path: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz @@ -206,7 +206,7 @@ jobs: cp build/app/outputs/bundle/release/app-release.aab \ android-artifacts/stack_wallet-android-${VERSION}.aab - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_wallet-android-${{ steps.ver.outputs.version }} path: android-artifacts/ @@ -244,7 +244,7 @@ jobs: flutter-version: '3.38.1' channel: 'stable' - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version: '1.24.13' @@ -328,7 +328,7 @@ jobs: Compress-Archive -Path "build/windows/x64/runner/Release/*" ` -DestinationPath "stack_wallet-windows-x86_64-${{ steps.ver.outputs.version }}.zip" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_wallet-windows-x86_64-${{ steps.ver.outputs.version }}.zip path: stack_wallet-windows-x86_64-${{ steps.ver.outputs.version }}.zip @@ -363,7 +363,7 @@ jobs: flutter-version: '3.38.1' channel: 'stable' - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version: '1.24.13' @@ -405,7 +405,7 @@ jobs: zip -r "$GITHUB_WORKSPACE/stack_wallet-macos-aarch64-${{ steps.ver.outputs.version }}.zip" \ "Stack Wallet.app" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_wallet-macos-aarch64-${{ steps.ver.outputs.version }}.zip path: stack_wallet-macos-aarch64-${{ steps.ver.outputs.version }}.zip @@ -445,7 +445,7 @@ jobs: flutter-version: '3.38.1' channel: 'stable' - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version: '1.24.13' @@ -487,7 +487,7 @@ jobs: cp -r build/ios/iphoneos/Runner.app Payload/ zip -r "stack_wallet-ios-aarch64-${{ steps.ver.outputs.version }}.ipa" Payload/ - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_wallet-ios-aarch64-${{ steps.ver.outputs.version }}.ipa path: stack_wallet-ios-aarch64-${{ steps.ver.outputs.version }}.ipa @@ -551,7 +551,7 @@ jobs: tar -czf "campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" \ -C build/linux/x64/release bundle - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz path: campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz @@ -615,7 +615,7 @@ jobs: tar -czf "stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" \ -C build/linux/x64/release bundle - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz path: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz @@ -640,7 +640,7 @@ jobs: echo "version=${VERSION}" >> $GITHUB_OUTPUT - name: Download Linux bundle - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz @@ -658,7 +658,7 @@ jobs: run: flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - name: Cache Flatpak SDK - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.local/share/flatpak key: flatpak-freedesktop-24.08-v1 @@ -682,7 +682,7 @@ jobs: "stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak" \ com.cypherstack.stackwallet - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak path: stack_wallet-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak @@ -707,7 +707,7 @@ jobs: echo "version=${VERSION}" >> $GITHUB_OUTPUT - name: Download Linux bundle - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: stack_wallet-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz @@ -732,7 +732,7 @@ jobs: ARCH=x86_64 ./appimagetool --appimage-extract-and-run AppDir \ "stack_wallet-appimage-x86_64-${VERSION}.AppImage" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_wallet-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage path: stack_wallet-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage @@ -834,7 +834,7 @@ jobs: cp build/app/outputs/bundle/release/app-release.aab \ android-artifacts/campfire-android-${VERSION}.aab - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: campfire-android-${{ steps.ver.outputs.version }} path: android-artifacts/ @@ -872,7 +872,7 @@ jobs: flutter-version: '3.38.1' channel: 'stable' - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version: '1.24.13' @@ -926,7 +926,7 @@ jobs: Compress-Archive -Path "build/windows/x64/runner/Release/*" ` -DestinationPath "campfire-windows-x86_64-${{ steps.ver.outputs.version }}.zip" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: campfire-windows-x86_64-${{ steps.ver.outputs.version }}.zip path: campfire-windows-x86_64-${{ steps.ver.outputs.version }}.zip @@ -961,7 +961,7 @@ jobs: flutter-version: '3.38.1' channel: 'stable' - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version: '1.24.13' @@ -996,7 +996,7 @@ jobs: zip -r "$GITHUB_WORKSPACE/campfire-macos-aarch64-${{ steps.ver.outputs.version }}.zip" \ "Campfire.app" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: campfire-macos-aarch64-${{ steps.ver.outputs.version }}.zip path: campfire-macos-aarch64-${{ steps.ver.outputs.version }}.zip @@ -1036,7 +1036,7 @@ jobs: flutter-version: '3.38.1' channel: 'stable' - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version: '1.24.13' @@ -1073,7 +1073,7 @@ jobs: cp -r build/ios/iphoneos/Runner.app Payload/ zip -r "campfire-ios-aarch64-${{ steps.ver.outputs.version }}.ipa" Payload/ - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: campfire-ios-aarch64-${{ steps.ver.outputs.version }}.ipa path: campfire-ios-aarch64-${{ steps.ver.outputs.version }}.ipa @@ -1098,7 +1098,7 @@ jobs: echo "version=${VERSION}" >> $GITHUB_OUTPUT - name: Download Linux bundle - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz @@ -1118,7 +1118,7 @@ jobs: run: flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - name: Cache Flatpak SDK - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.local/share/flatpak key: flatpak-freedesktop-24.08-v1 @@ -1142,7 +1142,7 @@ jobs: "campfire-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak" \ com.cypherstack.campfire - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: campfire-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak path: campfire-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak @@ -1167,7 +1167,7 @@ jobs: echo "version=${VERSION}" >> $GITHUB_OUTPUT - name: Download Linux bundle - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz @@ -1192,7 +1192,7 @@ jobs: ARCH=x86_64 ./appimagetool --appimage-extract-and-run AppDir \ "campfire-appimage-x86_64-${VERSION}.AppImage" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: campfire-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage path: campfire-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage @@ -1294,7 +1294,7 @@ jobs: cp build/app/outputs/bundle/release/app-release.aab \ android-artifacts/stack_duo-android-${VERSION}.aab - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_duo-android-${{ steps.ver.outputs.version }} path: android-artifacts/ @@ -1332,7 +1332,7 @@ jobs: flutter-version: '3.38.1' channel: 'stable' - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version: '1.24.13' @@ -1386,7 +1386,7 @@ jobs: Compress-Archive -Path "build/windows/x64/runner/Release/*" ` -DestinationPath "stack_duo-windows-x86_64-${{ steps.ver.outputs.version }}.zip" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_duo-windows-x86_64-${{ steps.ver.outputs.version }}.zip path: stack_duo-windows-x86_64-${{ steps.ver.outputs.version }}.zip @@ -1421,7 +1421,7 @@ jobs: flutter-version: '3.38.1' channel: 'stable' - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version: '1.24.13' @@ -1457,7 +1457,7 @@ jobs: zip -r "$GITHUB_WORKSPACE/stack_duo-macos-aarch64-${{ steps.ver.outputs.version }}.zip" \ "Stack Duo.app" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_duo-macos-aarch64-${{ steps.ver.outputs.version }}.zip path: stack_duo-macos-aarch64-${{ steps.ver.outputs.version }}.zip @@ -1497,7 +1497,7 @@ jobs: flutter-version: '3.38.1' channel: 'stable' - - uses: actions/setup-go@v5 + - uses: actions/setup-go@v6 with: go-version: '1.24.13' @@ -1534,7 +1534,7 @@ jobs: cp -r build/ios/iphoneos/Runner.app Payload/ zip -r "stack_duo-ios-aarch64-${{ steps.ver.outputs.version }}.ipa" Payload/ - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_duo-ios-aarch64-${{ steps.ver.outputs.version }}.ipa path: stack_duo-ios-aarch64-${{ steps.ver.outputs.version }}.ipa @@ -1559,7 +1559,7 @@ jobs: echo "version=${VERSION}" >> $GITHUB_OUTPUT - name: Download Linux bundle - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz @@ -1577,7 +1577,7 @@ jobs: run: flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo - name: Cache Flatpak SDK - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ~/.local/share/flatpak key: flatpak-freedesktop-24.08-v1 @@ -1601,7 +1601,7 @@ jobs: "stack_duo-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak" \ com.cypherstack.stackduo - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_duo-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak path: stack_duo-flatpak-x86_64-${{ steps.ver.outputs.version }}.flatpak @@ -1626,7 +1626,7 @@ jobs: echo "version=${VERSION}" >> $GITHUB_OUTPUT - name: Download Linux bundle - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v8 with: name: stack_duo-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz @@ -1651,7 +1651,7 @@ jobs: ARCH=x86_64 ./appimagetool --appimage-extract-and-run AppDir \ "stack_duo-appimage-x86_64-${VERSION}.AppImage" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v7 with: name: stack_duo-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage path: stack_duo-appimage-x86_64-${{ steps.ver.outputs.version }}.AppImage From ab31e9c2e5e047e78ef151ced29fe484e564b555 Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Fri, 22 May 2026 15:53:56 -0700 Subject: [PATCH 10/12] fix: resize campfire icon to 512x512, revert flatpak CI workaround --- .github/workflows/build.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ffca41d0e..43722cf37 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1105,9 +1105,7 @@ jobs: - name: Stage bundle and icon run: | tar -xzf "campfire-linux-x86_64-${{ steps.ver.outputs.version }}.tar.gz" -C flatpak/ - convert -resize 512x512! \ - asset_sources/icon/campfire/icon.png \ - flatpak/com.cypherstack.campfire.png + cp asset_sources/icon/campfire/icon.png flatpak/com.cypherstack.campfire.png - name: Install Flatpak tools run: | From 05d4fabecc539a5369e3845463d249d11dfbd304 Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Fri, 22 May 2026 22:39:23 -0700 Subject: [PATCH 11/12] fix(ci): install cargo-lipo for stack_duo macOS build --- .github/workflows/build.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 43722cf37..462c52429 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -1429,6 +1429,7 @@ jobs: rustup toolchain install 1.89.0 rustup default 1.89.0 rustup target add aarch64-apple-darwin --toolchain 1.89.0 + cargo install cargo-lipo - name: Configure app run: | From 620ccce8c7b117f86f76e9c534bd88ea3c735d0e Mon Sep 17 00:00:00 2001 From: Dan Miller Date: Fri, 22 May 2026 22:41:06 -0700 Subject: [PATCH 12/12] fix: resize campfire icon to 512x512 --- asset_sources/icon/campfire/icon.png | Bin 53110 -> 28499 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/asset_sources/icon/campfire/icon.png b/asset_sources/icon/campfire/icon.png index bea9f072eeca32ad13487c086c38b68d68fce027..d0f2ad98a9a089d2681b63ed1edb45b9db19096b 100644 GIT binary patch literal 28499 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 literal 53110 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