From c2d82a133a0732024831527f2a904c5778b530ce Mon Sep 17 00:00:00 2001 From: katipally Date: Sat, 18 Jul 2026 01:03:25 -0700 Subject: [PATCH] Add Linux support (AppImage) to build + CI + release MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The one native piece — the sherpa-onnx voice-cloning addon — already has a Linux branch in pack-agent.cjs, and sherpa-onnx-linux-x64 prebuilds exist on npm, so the rest is wiring: - electron-builder.yml: linux AppImage (x64) target, icon from build/icon.png - release.yml: ubuntu-latest row in the build matrix + publish step + a Linux row in the release download table - ci.yml: a Linux build smoke test (install → typecheck → test → build unsigned AppImage) mirroring the Windows job - desktop + root package.json: build:linux / desktop:build:linux scripts - README, RELEASING, CHANGELOG (0.2.5) Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 30 ++++++++++++++++++++++++++++++ .github/workflows/release.yml | 9 +++++++++ CHANGELOG.md | 8 ++++++++ README.md | 2 ++ RELEASING.md | 5 +++-- apps/desktop/electron-builder.yml | 13 +++++++++++++ apps/desktop/package.json | 3 ++- package.json | 3 ++- 8 files changed, 69 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 84ff8c9..5e4c92a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,3 +59,33 @@ jobs: # pull_request runs and fails the job after a successful build. - name: Build Windows installer (unsigned) run: pnpm --filter @openlive/desktop exec electron-builder --win --publish never + + # Linux parity smoke test: prove the repo installs, typechecks, tests, and + # produces an unsigned AppImage on ubuntu-latest — same shape as the Windows job. + linux: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - uses: pnpm/action-setup@v6 + + - uses: actions/setup-node@v6 + with: + node-version: 22 + cache: pnpm + + - run: pnpm install --frozen-lockfile + + - name: Typecheck + run: pnpm typecheck + + - name: Test + run: pnpm test + + - name: Pack web + agent + run: | + pnpm --filter @openlive/desktop pack:web + pnpm --filter @openlive/desktop pack:agent + + - name: Build Linux AppImage (unsigned) + run: pnpm --filter @openlive/desktop exec electron-builder --linux --publish never diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0845fdd..2be48ba 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,6 +21,8 @@ jobs: name: mac - os: windows-latest name: win + - os: ubuntu-latest + name: linux runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v7 @@ -82,6 +84,12 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Build & publish (Linux — unsigned AppImage) + if: matrix.name == 'linux' + run: pnpm --filter @openlive/desktop exec electron-builder --linux --publish always + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Both platforms uploaded their assets to the draft release. Flip it to # published (and mark it "Latest") so it's downloadable. Runs only if every # build succeeded, so a half-built release never goes public. @@ -114,6 +122,7 @@ jobs: | --- | --- | | **macOS** (Apple Silicon + Intel) | [\`${TAG}\` Mac (.dmg)](${BASE}/OpenLive-${TAG#v}-mac.dmg) | | **Windows** (64-bit) | [\`${TAG}\` Windows (.exe)](${BASE}/OpenLive-${TAG#v}-windows.exe) | + | **Linux** (64-bit) | [\`${TAG}\` Linux (.AppImage)](${BASE}/OpenLive-${TAG#v}-linux.AppImage) | On first launch, macOS may take a few seconds to verify the app. That's normal. " diff --git a/CHANGELOG.md b/CHANGELOG.md index a865f98..995bdb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ All notable changes to OpenLive are recorded here. The newest version is on top. Releases before 0.1.9 predate this file — see the [GitHub releases](https://github.com/katipally/openlive/releases) for those. +## [0.2.5] - 2026-07-18 + +### Added +- **Linux support.** OpenLive now ships a Linux build (unsigned `.AppImage`, + 64-bit) alongside macOS and Windows — download, `chmod +x`, run. The release + and CI pipelines build and smoke-test all three platforms on their native + runners. + ## [0.2.4] - 2026-07-17 ### Fixed diff --git a/README.md b/README.md index 8e66bf9..1a7fea5 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,8 @@ Gemini Live, and OpenAI Realtime. [![Download for macOS](https://img.shields.io/badge/Download-macOS-0b0b0c?style=for-the-badge&logo=apple&logoColor=white)](https://github.com/katipally/openlive/releases/latest)   [![Download for Windows](https://img.shields.io/badge/Download-Windows-0b0b0c?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0id2hpdGUiPjxwYXRoIGQ9Ik0zIDVsNy0xdjdIM3ptMCAxNGw3IDF2LTdIM3ptOC0xNXY4aDEwVjNsLTEwIDF6bTAgMTZsMTAgMVYxM0gxMXoiLz48L3N2Zz4=&logoColor=white)](https://github.com/katipally/openlive/releases/latest) +  +[![Download for Linux](https://img.shields.io/badge/Download-Linux-0b0b0c?style=for-the-badge&logo=linux&logoColor=white)](https://github.com/katipally/openlive/releases/latest) diff --git a/RELEASING.md b/RELEASING.md index 48a704f..2df2d9f 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -8,8 +8,9 @@ CI typechecks every push and PR. A release is one tag, no manual version bump: git tag v0.2.0 && git push origin v0.2.0 ``` -The tag drives the version. CI builds the macOS (universal, signed and notarized) -and Windows installers, uploads them, and publishes the release with both downloads. +The tag drives the version. CI builds the macOS (universal, signed and notarized), +Windows, and Linux (unsigned AppImage) installers on their native runners, uploads +them, and publishes the release with all three downloads. Mac signing runs when these repo secrets are set: `MAC_CSC_LINK`, `MAC_CSC_KEY_PASSWORD`, `APPLE_ID`, `APPLE_APP_SPECIFIC_PASSWORD`, diff --git a/apps/desktop/electron-builder.yml b/apps/desktop/electron-builder.yml index 21ee486..e3f7b06 100644 --- a/apps/desktop/electron-builder.yml +++ b/apps/desktop/electron-builder.yml @@ -90,3 +90,16 @@ nsis: perMachine: false allowToChangeInstallationDirectory: true createDesktopShortcut: true + +# ── Linux ───────────────────────────────────────────────────────────────────── +# One AppImage (download → chmod +x → run) so users don't have to match a distro +# package format. Unsigned, like every Linux AppImage. The linux- sherpa +# package is shipped by pack-agent.cjs (its default branch). electron-builder +# derives the icon set from the 1024×1024 build/icon.png automatically. +linux: + target: + - target: AppImage + arch: [x64] + category: AudioVideo + artifactName: ${productName}-${version}-linux.${ext} + icon: build/icon.png diff --git a/apps/desktop/package.json b/apps/desktop/package.json index de6c0ec..03f9aa7 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -13,7 +13,8 @@ "pack": "node scripts/pack-web.cjs && node scripts/pack-agent.cjs", "build": "pnpm run pack && electron-builder", "build:mac": "pnpm run pack && electron-builder --mac", - "build:win": "pnpm run pack && electron-builder --win" + "build:win": "pnpm run pack && electron-builder --win", + "build:linux": "pnpm run pack && electron-builder --linux" }, "dependencies": { "electron-updater": "^6.8.9" diff --git a/package.json b/package.json index c69490a..ae37066 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "desktop:dev": "cross-env AGENT_PORT=47823 WEB_PORT=47824 concurrently -k --kill-others -n web,agent,app -c cyan,magenta,green \"pnpm --filter @openlive/web dev\" \"pnpm --filter @openlive/agent dev\" \"pnpm --filter @openlive/desktop start:dev\"", "desktop:build": "pnpm --filter @openlive/desktop build", "desktop:build:mac": "pnpm --filter @openlive/desktop build:mac", - "desktop:build:win": "pnpm --filter @openlive/desktop build:win" + "desktop:build:win": "pnpm --filter @openlive/desktop build:win", + "desktop:build:linux": "pnpm --filter @openlive/desktop build:linux" }, "devDependencies": { "concurrently": "^9.1.0",