Skip to content

Commit fcb32f9

Browse files
committed
feat: add ARM64 support for Linux and Windows
- Add ubuntu-24.04-arm and windows-11-arm to CI matrix - Linux ARM64 builds AppImage + deb (Raspberry Pi, DGX Spark) - Windows ARM64 builds NSIS installer (Snapdragon devices) - Add arch to NSIS and AppImage artifact names to prevent collisions - Add latest-linux.yml and latest.yml merge steps for auto-updater - Update README with ARM64 download links Closes #140
1 parent 48be8d0 commit fcb32f9

3 files changed

Lines changed: 84 additions & 27 deletions

File tree

.github/workflows/release.yml

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,12 @@ jobs:
4242
include:
4343
- os: ubuntu-latest
4444
arch: x64
45+
- os: ubuntu-24.04-arm
46+
arch: arm64
4547
- os: windows-latest
4648
arch: x64
49+
- os: windows-11-arm
50+
arch: arm64
4751
- os: macos-latest
4852
arch: x64
4953
- os: macos-latest
@@ -67,17 +71,17 @@ jobs:
6771
name: compiled-output
6872
path: out/
6973

70-
# ── Flatpak setup (Linux only) ──
74+
# ── Flatpak setup (Linux x64 only) ──
7175
- name: Cache Flatpak SDKs
72-
if: matrix.os == 'ubuntu-latest'
76+
if: runner.os == 'Linux' && matrix.arch == 'x64'
7377
uses: actions/cache@v4
7478
with:
7579
path: ~/.local/share/flatpak
7680
key: flatpak-sdk-23.08-electron2-${{ runner.os }}
7781

7882
- name: Install Flatpak build tools
7983
id: flatpak
80-
if: matrix.os == 'ubuntu-latest'
84+
if: runner.os == 'Linux' && matrix.arch == 'x64'
8185
continue-on-error: true
8286
run: |
8387
sudo apt-get update
@@ -113,12 +117,12 @@ jobs:
113117
# ── Platform packaging ──
114118
- name: Package for Windows
115119
id: win_build
116-
if: matrix.os == 'windows-latest'
120+
if: runner.os == 'Windows'
117121
continue-on-error: true
118122
run: npx electron-builder --win --${{ matrix.arch }} --publish never
119123

120124
- name: Package for Windows (unsigned fallback)
121-
if: matrix.os == 'windows-latest' && steps.win_build.outcome == 'failure'
125+
if: runner.os == 'Windows' && steps.win_build.outcome == 'failure'
122126
env:
123127
WIN_CSC_LINK: ''
124128
CSC_IDENTITY_AUTO_DISCOVERY: 'false'
@@ -147,9 +151,12 @@ jobs:
147151
npx electron-builder --mac --${{ matrix.arch }} --publish never
148152
149153
- name: Package for Linux
150-
if: matrix.os == 'ubuntu-latest'
154+
if: runner.os == 'Linux'
151155
run: |
152-
if [ "${{ steps.flatpak.outcome }}" == "success" ]; then
156+
if [ "${{ matrix.arch }}" == "arm64" ]; then
157+
# ARM64: deb + AppImage only (flatpak BaseApp not available for arm64)
158+
npx electron-builder --linux AppImage deb --${{ matrix.arch }} --publish never
159+
elif [ "${{ steps.flatpak.outcome }}" == "success" ]; then
153160
npx electron-builder --linux --${{ matrix.arch }} --publish never
154161
else
155162
echo "Flatpak not available, building without flatpak"
@@ -158,7 +165,7 @@ jobs:
158165
159166
# ── Windows code signing ──
160167
- name: Azure Trusted Signing (Windows Only)
161-
if: matrix.os == 'windows-latest'
168+
if: runner.os == 'Windows'
162169
continue-on-error: true
163170
uses: azure/trusted-signing-action@v0.5.1
164171
with:
@@ -239,6 +246,9 @@ jobs:
239246
pattern: '*-*'
240247
merge-multiple: false
241248

249+
- name: Install js-yaml for manifest merging
250+
run: npm install --no-save js-yaml
251+
242252
- name: Merge macOS latest-mac.yml (x64 + arm64)
243253
run: |
244254
# Each macOS arch build produces its own latest-mac.yml with only
@@ -248,7 +258,6 @@ jobs:
248258
249259
if [ -f "$X64_YML" ] && [ -f "$ARM_YML" ]; then
250260
echo "Merging latest-mac.yml from both architectures"
251-
npm install --no-save js-yaml
252261
node -e "
253262
const fs = require('fs');
254263
const yaml = require('js-yaml');
@@ -259,13 +268,58 @@ jobs:
259268
fs.writeFileSync('$X64_YML', out);
260269
console.log(out);
261270
"
262-
# Remove duplicate so only one latest-mac.yml is uploaded
263271
rm -f "$ARM_YML"
264272
else
265273
echo "Skipping merge — need both $X64_YML and $ARM_YML"
266274
ls -la macos-latest-*/latest-mac.yml 2>/dev/null || true
267275
fi
268276
277+
- name: Merge Linux latest-linux.yml (x64 + arm64)
278+
run: |
279+
X64_YML="ubuntu-latest-x64/latest-linux.yml"
280+
ARM_YML="ubuntu-24.04-arm-arm64/latest-linux.yml"
281+
282+
if [ -f "$X64_YML" ] && [ -f "$ARM_YML" ]; then
283+
echo "Merging latest-linux.yml from both architectures"
284+
node -e "
285+
const fs = require('fs');
286+
const yaml = require('js-yaml');
287+
const x64 = yaml.load(fs.readFileSync('$X64_YML', 'utf8'));
288+
const arm = yaml.load(fs.readFileSync('$ARM_YML', 'utf8'));
289+
x64.files = [...(x64.files || []), ...(arm.files || [])];
290+
const out = yaml.dump(x64, { lineWidth: -1 });
291+
fs.writeFileSync('$X64_YML', out);
292+
console.log(out);
293+
"
294+
rm -f "$ARM_YML"
295+
else
296+
echo "Skipping merge — need both $X64_YML and $ARM_YML"
297+
ls -la ubuntu-*-*/latest-linux.yml 2>/dev/null || true
298+
fi
299+
300+
- name: Merge Windows latest.yml (x64 + arm64)
301+
run: |
302+
X64_YML="windows-latest-x64/latest.yml"
303+
ARM_YML="windows-11-arm-arm64/latest.yml"
304+
305+
if [ -f "$X64_YML" ] && [ -f "$ARM_YML" ]; then
306+
echo "Merging latest.yml from both architectures"
307+
node -e "
308+
const fs = require('fs');
309+
const yaml = require('js-yaml');
310+
const x64 = yaml.load(fs.readFileSync('$X64_YML', 'utf8'));
311+
const arm = yaml.load(fs.readFileSync('$ARM_YML', 'utf8'));
312+
x64.files = [...(x64.files || []), ...(arm.files || [])];
313+
const out = yaml.dump(x64, { lineWidth: -1 });
314+
fs.writeFileSync('$X64_YML', out);
315+
console.log(out);
316+
"
317+
rm -f "$ARM_YML"
318+
else
319+
echo "Skipping merge — need both $X64_YML and $ARM_YML"
320+
ls -la windows-*-*/latest.yml 2>/dev/null || true
321+
fi
322+
269323
- name: Create Release
270324
uses: softprops/action-gh-release@v2
271325
env:
@@ -277,18 +331,18 @@ jobs:
277331
draft: false
278332
prerelease: false
279333
files: |
280-
windows-latest-*/*.exe
281-
windows-latest-*/*.blockmap
282-
windows-latest-*/latest*.yml
334+
windows-*-*/*.exe
335+
windows-*-*/*.blockmap
336+
windows-*-*/latest*.yml
283337
macos-latest-*/*.dmg
284338
macos-latest-*/*.zip
285339
macos-latest-*/*.pkg
286340
macos-latest-*/*.blockmap
287341
macos-latest-*/latest*.yml
288-
ubuntu-latest-*/*.deb
289-
ubuntu-latest-*/*.rpm
290-
ubuntu-latest-*/*.AppImage
291-
ubuntu-latest-*/*.snap
292-
ubuntu-latest-*/*.flatpak
293-
ubuntu-latest-*/*.tar.gz
294-
ubuntu-latest-*/latest*.yml
342+
ubuntu-*-*/*.deb
343+
ubuntu-*-*/*.rpm
344+
ubuntu-*-*/*.AppImage
345+
ubuntu-*-*/*.snap
346+
ubuntu-*-*/*.flatpak
347+
ubuntu-*-*/*.tar.gz
348+
ubuntu-*-*/latest*.yml

README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@ Your AI, right on your desktop. [Open WebUI](https://github.com/open-webui/open-
1818
|----------|-----------|
1919
| macOS (Apple Silicon) | [**Download .dmg**](https://github.com/open-webui/desktop/releases/latest/download/open-webui-arm64.dmg) |
2020
| macOS (Intel) | [**Download .dmg**](https://github.com/open-webui/desktop/releases/latest/download/open-webui-x64.dmg) |
21-
| Windows x64 | [**Download .exe**](https://github.com/open-webui/desktop/releases/latest/download/open-webui-setup.exe) |
22-
| Linux (AppImage) | [**Download .AppImage**](https://github.com/open-webui/desktop/releases/latest/download/open-webui.AppImage) |
23-
| Linux (Debian/Ubuntu) | [**Download .deb**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_amd64.deb) |
24-
| Linux (Snap) | [**Download .snap**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_amd64.snap) |
25-
| Linux (Flatpak) | [**Download .flatpak**](https://github.com/open-webui/desktop/releases/latest/download/open-webui.flatpak) |
21+
| Windows x64 | [**Download .exe**](https://github.com/open-webui/desktop/releases/latest/download/open-webui-x64-setup.exe) |
22+
| Windows ARM64 | [**Download .exe**](https://github.com/open-webui/desktop/releases/latest/download/open-webui-arm64-setup.exe) |
23+
| Linux x64 (AppImage) | [**Download .AppImage**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_x64.AppImage) |
24+
| Linux x64 (Debian/Ubuntu) | [**Download .deb**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_amd64.deb) |
25+
| Linux x64 (Snap) | [**Download .snap**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_amd64.snap) |
26+
| Linux x64 (Flatpak) | [**Download .flatpak**](https://github.com/open-webui/desktop/releases/latest/download/open-webui.flatpak) |
27+
| Linux ARM64 (AppImage) | [**Download .AppImage**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_arm64.AppImage) |
28+
| Linux ARM64 (Debian/Ubuntu) | [**Download .deb**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_arm64.deb) |
2629

2730
Internet required on first launch. After that, everything works offline. [All releases →](https://github.com/open-webui/desktop/releases)
2831

electron-builder.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ asarUnpack:
1919
win:
2020
executableName: open-webui
2121
nsis:
22-
artifactName: ${name}-setup.${ext}
22+
artifactName: ${name}-${arch}-setup.${ext}
2323
shortcutName: ${productName}
2424
uninstallDisplayName: ${productName}
2525
createDesktopShortcut: always
@@ -63,7 +63,7 @@ deb:
6363
snap:
6464
artifactName: ${name}_${arch}.${ext}
6565
appImage:
66-
artifactName: ${name}.${ext}
66+
artifactName: ${name}_${arch}.${ext}
6767
flatpak:
6868
base: org.electronjs.Electron2.BaseApp
6969
baseVersion: '23.08'

0 commit comments

Comments
 (0)