Skip to content

Commit f646560

Browse files
authored
Merge pull request #160 from open-webui/main
0.0.15
2 parents 80e366a + 21e8a36 commit f646560

6 files changed

Lines changed: 105 additions & 46 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

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.0.15] - 2026-04-28
9+
10+
### Added
11+
12+
- **ARM64 Support for Linux and Windows.** Native ARM64 builds are now produced for Linux (.deb, AppImage) and Windows (NSIS installer), enabling support for Raspberry Pi, NVIDIA DGX Spark, Snapdragon laptops, and other ARM64 devices (#140).
13+
14+
### Fixed
15+
16+
- **Grey/Blank Screen on Linux.** Disabled GPU compositing entirely on Linux to prevent shared memory allocation crashes that caused a grey or blank screen on systems with restricted `/dev/shm` or `/tmp` permissions.
17+
- **Spotlight Dismiss Behavior.** Pressing Escape or the toggle shortcut to dismiss Spotlight no longer erroneously brings the main application window to the foreground (#158).
18+
819
## [0.0.14] - 2026-04-28
920

1021
### Fixed

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'

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "open-webui",
3-
"version": "0.0.14",
3+
"version": "0.0.15",
44
"license": "AGPL-3.0",
55
"description": "Open WebUI Desktop",
66
"main": "./out/main/index.js",

src/main/index.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,14 @@ if (process.platform === 'linux') {
106106
// to work (the portal is enabled by default in Chromium 134+ / Electron 33+).
107107
app.commandLine.appendSwitch('ozone-platform-hint', 'auto')
108108

109-
// Disable GPU compositing to prevent grey/blank webview rendering on
110-
// Linux systems with problematic Intel/NVIDIA drivers or certain Wayland
111-
// compositors. The GPU process may not crash (so the crash-recovery
112-
// marker never fires), but the compositor can fail silently — producing
113-
// a grey rectangle instead of rendered content. This is the standard
114-
// workaround used by VS Code and other Electron apps (#119).
115-
app.commandLine.appendSwitch('disable-gpu-compositing')
109+
// Disable GPU acceleration entirely on Linux. This prevents the GPU
110+
// process from spawning, which avoids shared-memory allocation failures
111+
// in /dev/shm or /tmp that crash the renderer on Ubuntu 24.04+, certain
112+
// Wayland compositors, and AppArmor-restricted environments. The lighter
113+
// --disable-gpu-compositing flag is insufficient because the GPU process
114+
// still starts and attempts shared-memory IPC. Users confirmed that
115+
// --disable-gpu resolves both the crash and grey/blank screen (#119, #157).
116+
app.commandLine.appendSwitch('disable-gpu')
116117
}
117118

118119
// ─── GPU Crash Recovery ─────────────────────────────────
@@ -319,18 +320,10 @@ function createSpotlightWindow(): BrowserWindow {
319320
spotlightWindow.on('blur', () => {
320321
if (blurArmed) {
321322
spotlightWindow?.hide()
322-
// Restore main window when spotlight dismisses
323-
if (mainWindow && !mainWindow.isDestroyed()) {
324-
mainWindow.show()
325-
}
326323
}
327324
})
328325

329326
spotlightWindow.on('closed', () => {
330-
// Restore main window if spotlight is closed
331-
if (mainWindow && !mainWindow.isDestroyed()) {
332-
mainWindow.show()
333-
}
334327
spotlightWindow = null
335328
})
336329

@@ -1486,17 +1479,15 @@ if (!gotTheLock) {
14861479

14871480
sendToRenderer('query', { query, connectionId: conn.id, url, files })
14881481

1489-
// Hide spotlight first (blur handler will restore main window)
14901482
spotlightWindow?.hide()
1491-
// Ensure main window is focused to receive the query
1483+
// Show main window so it can receive and display the submitted query
14921484
if (mainWindow && !mainWindow.isDestroyed()) {
14931485
mainWindow.show()
14941486
mainWindow.focus()
14951487
}
14961488
})
14971489
ipcMain.handle('spotlight:close', () => {
14981490
spotlightWindow?.hide()
1499-
// blur handler restores main window
15001491
})
15011492

15021493
// Persist bar offset within the fullscreen spotlight window

0 commit comments

Comments
 (0)