mirror of
https://github.com/open-webui/desktop.git
synced 2026-07-09 16:00:43 +00:00
Merge pull request #160 from open-webui/main
Some checks failed
Build and Release Electron App (electron-builder) / Compile (Typecheck + Vite Build) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (macos-latest-arm64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (ubuntu-24.04-arm-arm64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (windows-11-arm-arm64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (macos-latest-x64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (ubuntu-latest-x64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (windows-latest-x64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Create GitHub Release (push) Has been cancelled
Some checks failed
Build and Release Electron App (electron-builder) / Compile (Typecheck + Vite Build) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (macos-latest-arm64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (ubuntu-24.04-arm-arm64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (windows-11-arm-arm64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (macos-latest-x64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (ubuntu-latest-x64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Package (windows-latest-x64) (push) Has been cancelled
Build and Release Electron App (electron-builder) / Create GitHub Release (push) Has been cancelled
0.0.15
This commit is contained in:
commit
f646560df9
6 changed files with 105 additions and 46 deletions
94
.github/workflows/release.yml
vendored
94
.github/workflows/release.yml
vendored
|
|
@ -42,8 +42,12 @@ jobs:
|
|||
include:
|
||||
- os: ubuntu-latest
|
||||
arch: x64
|
||||
- os: ubuntu-24.04-arm
|
||||
arch: arm64
|
||||
- os: windows-latest
|
||||
arch: x64
|
||||
- os: windows-11-arm
|
||||
arch: arm64
|
||||
- os: macos-latest
|
||||
arch: x64
|
||||
- os: macos-latest
|
||||
|
|
@ -67,9 +71,9 @@ jobs:
|
|||
name: compiled-output
|
||||
path: out/
|
||||
|
||||
# ── Flatpak setup (Linux only) ──
|
||||
# ── Flatpak setup (Linux x64 only) ──
|
||||
- name: Cache Flatpak SDKs
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
if: runner.os == 'Linux' && matrix.arch == 'x64'
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.local/share/flatpak
|
||||
|
|
@ -77,7 +81,7 @@ jobs:
|
|||
|
||||
- name: Install Flatpak build tools
|
||||
id: flatpak
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
if: runner.os == 'Linux' && matrix.arch == 'x64'
|
||||
continue-on-error: true
|
||||
run: |
|
||||
sudo apt-get update
|
||||
|
|
@ -113,12 +117,12 @@ jobs:
|
|||
# ── Platform packaging ──
|
||||
- name: Package for Windows
|
||||
id: win_build
|
||||
if: matrix.os == 'windows-latest'
|
||||
if: runner.os == 'Windows'
|
||||
continue-on-error: true
|
||||
run: npx electron-builder --win --${{ matrix.arch }} --publish never
|
||||
|
||||
- name: Package for Windows (unsigned fallback)
|
||||
if: matrix.os == 'windows-latest' && steps.win_build.outcome == 'failure'
|
||||
if: runner.os == 'Windows' && steps.win_build.outcome == 'failure'
|
||||
env:
|
||||
WIN_CSC_LINK: ''
|
||||
CSC_IDENTITY_AUTO_DISCOVERY: 'false'
|
||||
|
|
@ -147,9 +151,12 @@ jobs:
|
|||
npx electron-builder --mac --${{ matrix.arch }} --publish never
|
||||
|
||||
- name: Package for Linux
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
if [ "${{ steps.flatpak.outcome }}" == "success" ]; then
|
||||
if [ "${{ matrix.arch }}" == "arm64" ]; then
|
||||
# ARM64: deb + AppImage only (flatpak BaseApp not available for arm64)
|
||||
npx electron-builder --linux AppImage deb --${{ matrix.arch }} --publish never
|
||||
elif [ "${{ steps.flatpak.outcome }}" == "success" ]; then
|
||||
npx electron-builder --linux --${{ matrix.arch }} --publish never
|
||||
else
|
||||
echo "Flatpak not available, building without flatpak"
|
||||
|
|
@ -158,7 +165,7 @@ jobs:
|
|||
|
||||
# ── Windows code signing ──
|
||||
- name: Azure Trusted Signing (Windows Only)
|
||||
if: matrix.os == 'windows-latest'
|
||||
if: runner.os == 'Windows'
|
||||
continue-on-error: true
|
||||
uses: azure/trusted-signing-action@v0.5.1
|
||||
with:
|
||||
|
|
@ -239,6 +246,9 @@ jobs:
|
|||
pattern: '*-*'
|
||||
merge-multiple: false
|
||||
|
||||
- name: Install js-yaml for manifest merging
|
||||
run: npm install --no-save js-yaml
|
||||
|
||||
- name: Merge macOS latest-mac.yml (x64 + arm64)
|
||||
run: |
|
||||
# Each macOS arch build produces its own latest-mac.yml with only
|
||||
|
|
@ -248,7 +258,6 @@ jobs:
|
|||
|
||||
if [ -f "$X64_YML" ] && [ -f "$ARM_YML" ]; then
|
||||
echo "Merging latest-mac.yml from both architectures"
|
||||
npm install --no-save js-yaml
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const yaml = require('js-yaml');
|
||||
|
|
@ -259,13 +268,58 @@ jobs:
|
|||
fs.writeFileSync('$X64_YML', out);
|
||||
console.log(out);
|
||||
"
|
||||
# Remove duplicate so only one latest-mac.yml is uploaded
|
||||
rm -f "$ARM_YML"
|
||||
else
|
||||
echo "Skipping merge — need both $X64_YML and $ARM_YML"
|
||||
ls -la macos-latest-*/latest-mac.yml 2>/dev/null || true
|
||||
fi
|
||||
|
||||
- name: Merge Linux latest-linux.yml (x64 + arm64)
|
||||
run: |
|
||||
X64_YML="ubuntu-latest-x64/latest-linux.yml"
|
||||
ARM_YML="ubuntu-24.04-arm-arm64/latest-linux.yml"
|
||||
|
||||
if [ -f "$X64_YML" ] && [ -f "$ARM_YML" ]; then
|
||||
echo "Merging latest-linux.yml from both architectures"
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const yaml = require('js-yaml');
|
||||
const x64 = yaml.load(fs.readFileSync('$X64_YML', 'utf8'));
|
||||
const arm = yaml.load(fs.readFileSync('$ARM_YML', 'utf8'));
|
||||
x64.files = [...(x64.files || []), ...(arm.files || [])];
|
||||
const out = yaml.dump(x64, { lineWidth: -1 });
|
||||
fs.writeFileSync('$X64_YML', out);
|
||||
console.log(out);
|
||||
"
|
||||
rm -f "$ARM_YML"
|
||||
else
|
||||
echo "Skipping merge — need both $X64_YML and $ARM_YML"
|
||||
ls -la ubuntu-*-*/latest-linux.yml 2>/dev/null || true
|
||||
fi
|
||||
|
||||
- name: Merge Windows latest.yml (x64 + arm64)
|
||||
run: |
|
||||
X64_YML="windows-latest-x64/latest.yml"
|
||||
ARM_YML="windows-11-arm-arm64/latest.yml"
|
||||
|
||||
if [ -f "$X64_YML" ] && [ -f "$ARM_YML" ]; then
|
||||
echo "Merging latest.yml from both architectures"
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const yaml = require('js-yaml');
|
||||
const x64 = yaml.load(fs.readFileSync('$X64_YML', 'utf8'));
|
||||
const arm = yaml.load(fs.readFileSync('$ARM_YML', 'utf8'));
|
||||
x64.files = [...(x64.files || []), ...(arm.files || [])];
|
||||
const out = yaml.dump(x64, { lineWidth: -1 });
|
||||
fs.writeFileSync('$X64_YML', out);
|
||||
console.log(out);
|
||||
"
|
||||
rm -f "$ARM_YML"
|
||||
else
|
||||
echo "Skipping merge — need both $X64_YML and $ARM_YML"
|
||||
ls -la windows-*-*/latest.yml 2>/dev/null || true
|
||||
fi
|
||||
|
||||
- name: Create Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
env:
|
||||
|
|
@ -277,18 +331,18 @@ jobs:
|
|||
draft: false
|
||||
prerelease: false
|
||||
files: |
|
||||
windows-latest-*/*.exe
|
||||
windows-latest-*/*.blockmap
|
||||
windows-latest-*/latest*.yml
|
||||
windows-*-*/*.exe
|
||||
windows-*-*/*.blockmap
|
||||
windows-*-*/latest*.yml
|
||||
macos-latest-*/*.dmg
|
||||
macos-latest-*/*.zip
|
||||
macos-latest-*/*.pkg
|
||||
macos-latest-*/*.blockmap
|
||||
macos-latest-*/latest*.yml
|
||||
ubuntu-latest-*/*.deb
|
||||
ubuntu-latest-*/*.rpm
|
||||
ubuntu-latest-*/*.AppImage
|
||||
ubuntu-latest-*/*.snap
|
||||
ubuntu-latest-*/*.flatpak
|
||||
ubuntu-latest-*/*.tar.gz
|
||||
ubuntu-latest-*/latest*.yml
|
||||
ubuntu-*-*/*.deb
|
||||
ubuntu-*-*/*.rpm
|
||||
ubuntu-*-*/*.AppImage
|
||||
ubuntu-*-*/*.snap
|
||||
ubuntu-*-*/*.flatpak
|
||||
ubuntu-*-*/*.tar.gz
|
||||
ubuntu-*-*/latest*.yml
|
||||
|
|
|
|||
11
CHANGELOG.md
11
CHANGELOG.md
|
|
@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
|
|||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [0.0.15] - 2026-04-28
|
||||
|
||||
### Added
|
||||
|
||||
- **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).
|
||||
|
||||
### Fixed
|
||||
|
||||
- **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.
|
||||
- **Spotlight Dismiss Behavior.** Pressing Escape or the toggle shortcut to dismiss Spotlight no longer erroneously brings the main application window to the foreground (#158).
|
||||
|
||||
## [0.0.14] - 2026-04-28
|
||||
|
||||
### Fixed
|
||||
|
|
|
|||
13
README.md
13
README.md
|
|
@ -18,11 +18,14 @@ Your AI, right on your desktop. [Open WebUI](https://github.com/open-webui/open-
|
|||
|----------|-----------|
|
||||
| macOS (Apple Silicon) | [**Download .dmg**](https://github.com/open-webui/desktop/releases/latest/download/open-webui-arm64.dmg) |
|
||||
| macOS (Intel) | [**Download .dmg**](https://github.com/open-webui/desktop/releases/latest/download/open-webui-x64.dmg) |
|
||||
| Windows x64 | [**Download .exe**](https://github.com/open-webui/desktop/releases/latest/download/open-webui-setup.exe) |
|
||||
| Linux (AppImage) | [**Download .AppImage**](https://github.com/open-webui/desktop/releases/latest/download/open-webui.AppImage) |
|
||||
| Linux (Debian/Ubuntu) | [**Download .deb**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_amd64.deb) |
|
||||
| Linux (Snap) | [**Download .snap**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_amd64.snap) |
|
||||
| Linux (Flatpak) | [**Download .flatpak**](https://github.com/open-webui/desktop/releases/latest/download/open-webui.flatpak) |
|
||||
| Windows x64 | [**Download .exe**](https://github.com/open-webui/desktop/releases/latest/download/open-webui-x64-setup.exe) |
|
||||
| Windows ARM64 | [**Download .exe**](https://github.com/open-webui/desktop/releases/latest/download/open-webui-arm64-setup.exe) |
|
||||
| Linux x64 (AppImage) | [**Download .AppImage**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_x64.AppImage) |
|
||||
| Linux x64 (Debian/Ubuntu) | [**Download .deb**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_amd64.deb) |
|
||||
| Linux x64 (Snap) | [**Download .snap**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_amd64.snap) |
|
||||
| Linux x64 (Flatpak) | [**Download .flatpak**](https://github.com/open-webui/desktop/releases/latest/download/open-webui.flatpak) |
|
||||
| Linux ARM64 (AppImage) | [**Download .AppImage**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_arm64.AppImage) |
|
||||
| Linux ARM64 (Debian/Ubuntu) | [**Download .deb**](https://github.com/open-webui/desktop/releases/latest/download/open-webui_arm64.deb) |
|
||||
|
||||
Internet required on first launch. After that, everything works offline. [All releases →](https://github.com/open-webui/desktop/releases)
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ asarUnpack:
|
|||
win:
|
||||
executableName: open-webui
|
||||
nsis:
|
||||
artifactName: ${name}-setup.${ext}
|
||||
artifactName: ${name}-${arch}-setup.${ext}
|
||||
shortcutName: ${productName}
|
||||
uninstallDisplayName: ${productName}
|
||||
createDesktopShortcut: always
|
||||
|
|
@ -63,7 +63,7 @@ deb:
|
|||
snap:
|
||||
artifactName: ${name}_${arch}.${ext}
|
||||
appImage:
|
||||
artifactName: ${name}.${ext}
|
||||
artifactName: ${name}_${arch}.${ext}
|
||||
flatpak:
|
||||
base: org.electronjs.Electron2.BaseApp
|
||||
baseVersion: '23.08'
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.0.14",
|
||||
"version": "0.0.15",
|
||||
"license": "AGPL-3.0",
|
||||
"description": "Open WebUI Desktop",
|
||||
"main": "./out/main/index.js",
|
||||
|
|
|
|||
|
|
@ -106,13 +106,14 @@ if (process.platform === 'linux') {
|
|||
// to work (the portal is enabled by default in Chromium 134+ / Electron 33+).
|
||||
app.commandLine.appendSwitch('ozone-platform-hint', 'auto')
|
||||
|
||||
// Disable GPU compositing to prevent grey/blank webview rendering on
|
||||
// Linux systems with problematic Intel/NVIDIA drivers or certain Wayland
|
||||
// compositors. The GPU process may not crash (so the crash-recovery
|
||||
// marker never fires), but the compositor can fail silently — producing
|
||||
// a grey rectangle instead of rendered content. This is the standard
|
||||
// workaround used by VS Code and other Electron apps (#119).
|
||||
app.commandLine.appendSwitch('disable-gpu-compositing')
|
||||
// Disable GPU acceleration entirely on Linux. This prevents the GPU
|
||||
// process from spawning, which avoids shared-memory allocation failures
|
||||
// in /dev/shm or /tmp that crash the renderer on Ubuntu 24.04+, certain
|
||||
// Wayland compositors, and AppArmor-restricted environments. The lighter
|
||||
// --disable-gpu-compositing flag is insufficient because the GPU process
|
||||
// still starts and attempts shared-memory IPC. Users confirmed that
|
||||
// --disable-gpu resolves both the crash and grey/blank screen (#119, #157).
|
||||
app.commandLine.appendSwitch('disable-gpu')
|
||||
}
|
||||
|
||||
// ─── GPU Crash Recovery ─────────────────────────────────
|
||||
|
|
@ -319,18 +320,10 @@ function createSpotlightWindow(): BrowserWindow {
|
|||
spotlightWindow.on('blur', () => {
|
||||
if (blurArmed) {
|
||||
spotlightWindow?.hide()
|
||||
// Restore main window when spotlight dismisses
|
||||
if (mainWindow && !mainWindow.isDestroyed()) {
|
||||
mainWindow.show()
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
spotlightWindow.on('closed', () => {
|
||||
// Restore main window if spotlight is closed
|
||||
if (mainWindow && !mainWindow.isDestroyed()) {
|
||||
mainWindow.show()
|
||||
}
|
||||
spotlightWindow = null
|
||||
})
|
||||
|
||||
|
|
@ -1486,9 +1479,8 @@ if (!gotTheLock) {
|
|||
|
||||
sendToRenderer('query', { query, connectionId: conn.id, url, files })
|
||||
|
||||
// Hide spotlight first (blur handler will restore main window)
|
||||
spotlightWindow?.hide()
|
||||
// Ensure main window is focused to receive the query
|
||||
// Show main window so it can receive and display the submitted query
|
||||
if (mainWindow && !mainWindow.isDestroyed()) {
|
||||
mainWindow.show()
|
||||
mainWindow.focus()
|
||||
|
|
@ -1496,7 +1488,6 @@ if (!gotTheLock) {
|
|||
})
|
||||
ipcMain.handle('spotlight:close', () => {
|
||||
spotlightWindow?.hide()
|
||||
// blur handler restores main window
|
||||
})
|
||||
|
||||
// Persist bar offset within the fullscreen spotlight window
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue