name: Release on: push: branches: - feat.windows.support - feat/whisper.migration - feat/vulkan-support tags: - 'v*' workflow_dispatch: inputs: tag: description: 'Release tag (e.g., v0.0.6)' required: true type: string jobs: build: name: Build ${{ matrix.os == 'macos' && 'macOS' || 'Windows' }} (${{ matrix.arch }}) runs-on: ${{ matrix.runner }} strategy: matrix: include: - os: macos arch: arm64 runner: macos-latest - os: macos arch: x64 runner: macos-15-intel - os: windows arch: x64 runner: windows-2025 steps: - name: Checkout code uses: actions/checkout@v4 with: submodules: recursive - name: Verify architecture if: matrix.os == 'macos' run: | CURRENT_ARCH=$(uname -m) echo "Current shell architecture: $CURRENT_ARCH" echo "Target architecture: ${{ matrix.arch }}" echo "Arch command output: $(arch)" if [[ "${{ matrix.arch }}" == "x64" ]]; then if [[ "$CURRENT_ARCH" != "x86_64" ]]; then echo "ERROR: Expected x86_64 architecture but got $CURRENT_ARCH" exit 1 fi echo "✓ Architecture verified: Running as native x86_64 on Intel hardware" elif [[ "${{ matrix.arch }}" == "arm64" ]]; then if [[ "$CURRENT_ARCH" != "arm64" ]]; then echo "ERROR: Expected arm64 architecture but got $CURRENT_ARCH" exit 1 fi echo "✓ Architecture verified: Running as native arm64" fi - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: 10.15.0 - name: Setup Node.js uses: actions/setup-node@v4 with: # 24.2 to at least 24.6 (atm of writing this) has issues with symlink deref in nested directories node-version: '24.1.0' cache: 'pnpm' - name: Install Vulkan SDK if: matrix.os == 'windows' uses: humbletim/install-vulkan-sdk@v1.2 with: version: 1.3.290.0 cache: true - name: Log Node.js architecture and platform run: | echo "=== Node.js Process Information ===" node -e "console.log('process.arch:', process.arch)" node -e "console.log('process.platform:', process.platform)" echo "" - name: Install dependencies env: GGML_NATIVE: OFF # ensure postinstall builds avoid i8mm on CI runners run: pnpm install --frozen-lockfile - name: Build whisper wrapper JS run: pnpm --filter @amical/whisper-wrapper build - name: Build whisper native binaries env: GGML_NATIVE: OFF # CI mac runners lack i8mm support; keep CPU features conservative here run: pnpm --filter @amical/whisper-wrapper build:native - name: Build whisper native binaries (vulkan) if: matrix.os == 'windows' env: GGML_NATIVE: OFF run: pnpm --filter @amical/whisper-wrapper build:native:vulkan - name: Download Node.js binaries working-directory: apps/desktop run: pnpm download-node - name: Import Developer ID cert if: matrix.os == 'macos' uses: apple-actions/import-codesign-certs@v3 with: p12-file-base64: ${{ secrets.DEVELOPER_CERT_BASE64 }} p12-password: ${{ secrets.DEVELOPER_CERT_PASSPHRASE }} - name: List signing identities (debug) if: matrix.os == 'macos' run: security find-identity -v -p codesigning - name: Build artifacts (macOS) if: matrix.os == 'macos' working-directory: apps/desktop env: SKIP_CODESIGNING: false SKIP_NOTARIZATION: false APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_APP_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }} APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} CODESIGNING_IDENTITY: ${{ secrets.CODESIGNING_IDENTITY }} POSTHOG_HOST: https://app.posthog.com TELEMETRY_ENABLED: true POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} AUTH_CLIENT_ID: ${{ secrets.AUTH_CLIENT_ID }} AUTHORIZATION_ENDPOINT: ${{ secrets.AUTHORIZATION_ENDPOINT }} AUTH_TOKEN_ENDPOINT: ${{ secrets.AUTH_TOKEN_ENDPOINT }} API_ENDPOINT: ${{ secrets.API_ENDPOINT }} run: | echo "Building macOS ${{ matrix.arch }} artifacts" pnpm make:${{ matrix.arch }} - name: Build artifacts (Windows) if: matrix.os == 'windows' working-directory: apps/desktop env: POSTHOG_HOST: https://app.posthog.com TELEMETRY_ENABLED: true POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }} AUTH_CLIENT_ID: ${{ secrets.AUTH_CLIENT_ID }} AUTHORIZATION_ENDPOINT: ${{ secrets.AUTHORIZATION_ENDPOINT }} AUTH_TOKEN_ENDPOINT: ${{ secrets.AUTH_TOKEN_ENDPOINT }} API_ENDPOINT: ${{ secrets.API_ENDPOINT }} run: | echo "Building Windows x64 artifacts" pnpm make:windows - name: Get version from package.json id: package_version working-directory: apps/desktop shell: bash run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT - name: Upload artifacts (macOS) if: matrix.os == 'macos' uses: actions/upload-artifact@v4 with: name: macos-${{ matrix.arch }} path: | apps/desktop/out/make/*-${{ matrix.arch }}.dmg apps/desktop/out/make/zip/darwin/${{ matrix.arch }}/*.zip - name: Upload artifacts (Windows) if: matrix.os == 'windows' uses: actions/upload-artifact@v4 with: name: windows-${{ matrix.arch }} path: | apps/desktop/out/make/squirrel.windows/${{ matrix.arch }}/*.exe apps/desktop/out/make/squirrel.windows/${{ matrix.arch }}/*.nupkg apps/desktop/out/make/squirrel.windows/${{ matrix.arch }}/RELEASES release: name: Create Release needs: build runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Get version from package.json id: package_version working-directory: apps/desktop run: echo "version=$(node -p "require('./package.json').version")" >> $GITHUB_OUTPUT - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: List artifacts run: | echo "=== Full artifacts directory structure ===" find artifacts -type f \( -name "*.dmg" -o -name "*.zip" -o -name "*.exe" -o -name "*.nupkg" -o -name "RELEASES" \) | sort echo "" echo "=== Detailed file listing ===" find artifacts -type f \( -name "*.dmg" -o -name "*.zip" -o -name "*.exe" -o -name "*.nupkg" -o -name "RELEASES" \) -exec ls -la {} \; - name: Create Release uses: softprops/action-gh-release@v2 with: draft: true prerelease: true tag_name: ${{ github.event.inputs.tag || github.ref_name }} name: Amical Desktop v${{ steps.package_version.outputs.version }} body: | ## Amical Desktop v${{ steps.package_version.outputs.version }} ### What's New - Please update this section with actual changes ### Downloads #### macOS - **Apple Silicon (M1/M2/M3)**: Download the DMG or ZIP file for arm64 - **Intel**: Download the DMG or ZIP file for x64 #### Windows - **Windows (x64)**: Download the .exe installer for 64-bit Windows ### Installation **macOS**: - **DMG**: Download and open the DMG file, then drag Amical to your Applications folder - **ZIP**: Download and extract the ZIP file, then drag Amical to your Applications folder **Windows**: - Download and run the .exe installer - Follow the installation wizard - The app will be installed to your user AppData folder and a shortcut will be created The ZIP files are primarily for automatic updates. We recommend using the DMG files for initial installation on macOS. files: | artifacts/macos-arm64/*.dmg artifacts/macos-arm64/zip/darwin/arm64/*.zip artifacts/macos-x64/*.dmg artifacts/macos-x64/zip/darwin/x64/*.zip artifacts/windows-x64/*.exe artifacts/windows-x64/*.nupkg artifacts/windows-x64/RELEASES env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}