Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions .SRCINFO
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
pkgbase = vortex-linux
pkgdesc = Community build of Vortex with generic Linux compatibility patches
pkgver = 2.8.2
pkgrel = 4
pkgver = 2.9.0
pkgrel = 1
url = https://github.com/Arkazzae/VortexLinux
install = vortex.install
arch = x86_64
Expand All @@ -14,7 +14,6 @@ pkgbase = vortex-linux
makedepends = patchelf
makedepends = python
makedepends = python-setuptools
makedepends = rust
makedepends = yarn
depends = alsa-lib
depends = at-spi2-core
Expand Down Expand Up @@ -44,7 +43,7 @@ pkgbase = vortex-linux
depends = xdg-utils
optdepends = kde-cli-tools: native trash support on KDE Plasma
optdepends = pipewire: screen sharing under Wayland
provides = vortex=2.8.2
provides = vortex=2.9.0
conflicts = vortex
conflicts = vortex-bin
conflicts = vortex-git
Expand All @@ -57,9 +56,8 @@ pkgbase = vortex-linux
noextract = windowsdesktop-runtime-10.0.10-win-x64.zip
options = !debug
options = !strip
source = vortex::git+https://github.com/Nexus-Mods/Vortex.git#commit=e136d9c83492580b6a9b5d9e723964fa3dd56bfd
source = vortex::git+https://github.com/Nexus-Mods/Vortex.git#commit=e04093000d0f6ccf78994670599f7a42b361a038
source = pnpm-11.10.0.tgz::https://registry.npmjs.org/pnpm/-/pnpm-11.10.0.tgz
source = libloot-136f3983c3eec7d377f83a7e7e0b0129aa5c8fe1.tar.gz::https://codeload.github.com/loot/libloot/tar.gz/136f3983c3eec7d377f83a7e7e0b0129aa5c8fe1
source = 0001-linux-runtime-compatibility.patch
source = 0002-linux-path-and-executable-discovery.patch
source = 0003-linux-filesystem-and-deployment.patch
Expand Down Expand Up @@ -93,6 +91,8 @@ pkgbase = vortex-linux
source = 0032-linux-deployment-target-paths.patch
source = 0033-linux-symlinked-extension-paths.patch
source = 0034-linux-case-only-platform-paths.patch
source = 0035-linux-backslash-archive-paths.patch
source = 0036-linux-appimage-nxm-links.patch
source = vortex.sh
source = vortex.desktop
source = README.md
Expand All @@ -105,7 +105,8 @@ pkgbase = vortex-linux
source = windowsdesktop-runtime-10.0.10-win-x64.zip::https://builds.dotnet.microsoft.com/dotnet/WindowsDesktop/10.0.10/windowsdesktop-runtime-10.0.10-win-x64.zip
sha512sums = SKIP
sha512sums = 0b7f8b98060031904c017e3a41eb187a16d40eeb829b95c4f8cb03681761fc4ab53dd219115b9b447f4dce1a05a214764461e7d3703392a9f32f9511ce8c86c8
sha512sums = 4de893736611130d7b360e89ead5d27fb15b6ced9113a7d55604370c4db9db55cb8dca170d212b15be7f51bd40aca876dbea042e5f2a86e114b57cb905aaad99
sha512sums = SKIP
sha512sums = SKIP
sha512sums = SKIP
sha512sums = SKIP
sha512sums = SKIP
Expand Down
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,17 @@ publishes a new Vortex version, taking any pending notes with it.

## Unreleased

- Vortex 2.9.0.
- LOOT uses the native binding that now comes with Vortex itself instead of
one built from libloot's sources, so building the package no longer needs
Rust. It is the same libloot version, 0.29.6.
- Mods whose archives use Windows backslashes between folders, such as
Appearance Runtime Plugin for Cyberpunk 2077, install into those folders
instead of as one file named after the whole path. (#16)
- The AppImage handles "Mod Manager Download" links from the Nexus Mods
website. With "Handle Nexus Links" on, it adds its own hidden desktop entry
for nxm:// links, since an AppImage installs none. (#18)

## 2.8.2-4 - 2026-10-16

- Extensions you install work when the Vortex settings folder is reached
Expand Down
43 changes: 21 additions & 22 deletions PKGBUILD
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Maintainer: Arkazzae <https://github.com/Arkazzae>

pkgname=vortex-linux
pkgver=2.8.2
pkgrel=4
pkgver=2.9.0
pkgrel=1
pkgdesc="Community build of Vortex with generic Linux compatibility patches"
arch=('x86_64')
url="https://github.com/Arkazzae/VortexLinux"
Expand Down Expand Up @@ -45,7 +45,6 @@ makedepends=(
'patchelf'
'python'
'python-setuptools'
'rust'
'yarn'
)

Expand Down Expand Up @@ -97,10 +96,8 @@ conflicts=('vortex' 'vortex-bin' 'vortex-git')
options=('!debug' '!strip')
install=vortex.install

_upstream_commit='e136d9c83492580b6a9b5d9e723964fa3dd56bfd'
_upstream_commit='e04093000d0f6ccf78994670599f7a42b361a038'
_pnpm='11.10.0'
_libloot_commit='136f3983c3eec7d377f83a7e7e0b0129aa5c8fe1'
_libloot_sha512='4de893736611130d7b360e89ead5d27fb15b6ced9113a7d55604370c4db9db55cb8dca170d212b15be7f51bd40aca876dbea042e5f2a86e114b57cb905aaad99'
_dotnet6='6.0.36'
_dotnet8='8.0.29'
_dotnet10='10.0.10'
Expand Down Expand Up @@ -138,12 +135,13 @@ _patches=(
'0032-linux-deployment-target-paths.patch'
'0033-linux-symlinked-extension-paths.patch'
'0034-linux-case-only-platform-paths.patch'
'0035-linux-backslash-archive-paths.patch'
'0036-linux-appimage-nxm-links.patch'
)

source=(
"vortex::git+https://github.com/Nexus-Mods/Vortex.git#commit=${_upstream_commit}"
"pnpm-${_pnpm}.tgz::https://registry.npmjs.org/pnpm/-/pnpm-${_pnpm}.tgz"
"libloot-${_libloot_commit}.tar.gz::https://codeload.github.com/loot/libloot/tar.gz/${_libloot_commit}"
"${_patches[@]}"
'vortex.sh'
'vortex.desktop'
Expand All @@ -170,7 +168,6 @@ sha512sums=(
'SKIP'
# pnpm is executed during the build, so keep its upstream archive verifiable.
'0b7f8b98060031904c017e3a41eb187a16d40eeb829b95c4f8cb03681761fc4ab53dd219115b9b447f4dce1a05a214764461e7d3703392a9f32f9511ce8c86c8'
"$_libloot_sha512"
# All following local files are versioned together with this PKGBUILD, so
# hashing them only duplicates Git integrity.
'SKIP'
Expand Down Expand Up @@ -210,6 +207,8 @@ sha512sums=(
'SKIP'
'SKIP'
'SKIP'
'SKIP'
'SKIP'
# Keep integrity checks for binaries downloaded outside this repository.
'935db5c6cee19f2c016e67168bfae7b491044735de76c673abb3b125dd325fd5e779d7efe12ba80178d46689ae70a25e558a3fa846417d44c5f4ca256e7f4bf2'
'e3f31d298a2b674b54c7fc89fb3f06d9645fc5879a54f2ebf2ea20e9ee7ae55f1bfe3284c1f90a591d6be2d6bcd251790ddc27771d65303e7a6a56d331df4632'
Expand Down Expand Up @@ -269,21 +268,10 @@ build() {
export npm_config_target='44.2.0'
export npm_config_disturl='https://electronjs.org/headers'

(
cd "$srcdir/libloot-$_libloot_commit"
LIBLOOT_REVISION="${_libloot_commit:0:8}" \
RUSTFLAGS='-C target-cpu=x86-64' \
cargo build --release --locked -p libloot-nodejs
)
export LIBLOOT_NODE_PATH="$srcdir/libloot-$_libloot_commit/target/release/libloot.node"
install -m755 "$srcdir/libloot-$_libloot_commit/target/release/liblibloot_nodejs.so" \
"$LIBLOOT_NODE_PATH"
strip --strip-unneeded "$LIBLOOT_NODE_PATH"

pnpm run build

local gamebryo_plugin
for gamebryo_plugin in gamebryo-archive-support gamebryo-savegame-management gamebryo-plugin-management; do
for gamebryo_plugin in gamebryo-archive-support gamebryo-savegame-management; do
if [[ ! -s "$srcdir/vortex/extensions/$gamebryo_plugin/dist/index.cjs" ]]; then
printf 'Gamebryo extension was not built for Linux: %s\n' "$gamebryo_plugin" >&2
return 1
Expand Down Expand Up @@ -349,6 +337,17 @@ build() {
--linux dir \
--x64 \
-c.compression=store

# copy-assets skips LOOT silently when node-loot failed to build.
local loot_release="$srcdir/vortex/dist/linux-unpacked/resources/app.asar.unpacked/assets/loot/build/Release"
if [[ ! -f "$loot_release/node-loot.node" || ! -f "$loot_release/libloot.so.0" ]]; then
printf 'LOOT is missing from the packaged app\n' >&2
return 1
fi
if ldd "$loot_release/node-loot.node" | grep -Fq 'not found'; then
printf 'LOOT has unresolved libraries\n' >&2
return 1
fi
}

package() {
Expand Down Expand Up @@ -389,8 +388,8 @@ package() {
"$pkgdir/usr/share/applications/com.nexusmods.vortex.desktop"
install -Dm644 assets/images/vortex.png \
"$pkgdir/usr/share/icons/hicolor/256x256/apps/vortex.png"
install -Dm644 "$srcdir/libloot-$_libloot_commit/LICENSE" \
"$pkgdir/usr/share/licenses/$pkgname/LIBLOOT-LICENSE.txt"
install -Dm644 src/renderer/node_modules/loot/LICENSE.md \
"$pkgdir/usr/share/licenses/$pkgname/LOOT-LICENSE.md"
install -Dm644 LICENSE.md "$pkgdir/usr/share/licenses/$pkgname/VORTEX-LICENSE.md"
install -Dm644 "$srcdir/LICENSE" \
"$pkgdir/usr/share/licenses/$pkgname/PATCHES-GPL-3.0.txt"
Expand Down
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ These are general Linux fixes, not per-game hacks. Game-specific Vortex extensio

Vortex itself is slowly becoming more Linux-friendly. Since 2.7.1, the extension API's `util.epicGamesLauncher` is a shim over `GameStoreHelper` instead of `undefined` everywhere except Windows, so our Epic API fallback patch is gone 🎊.

Every fix that lands upstream is one less patch to carry here, and the goal is for this repo to shrink.
2.9.0 goes further: Vortex now builds LOOT on Linux itself, with a libloot made for Linux, so we no longer compile libloot from source and our LOOT patch shrank to fixing file name casing and the Proton folder 🎉. Reading game versions from `.exe` files is plain TypeScript now too, so it works the same on every platform.

Every fix that lands upstream is one less patch to carry here, and the goal is for this repo to shrink.

## Games tested (confirmed working)

Expand Down Expand Up @@ -66,7 +68,7 @@ No FUSE 2 on your system? Run it as:
./Vortex-*.AppImage --appimage-extract-and-run
```

AppImages don't add themselves to your app menu or register as the `nxm://` handler. Gear Lever or AppImageLauncher handle that, or write a desktop entry yourself.
AppImages don't add themselves to your app menu; Gear Lever or AppImageLauncher handle that. For Nexus Mods download links, turn on "Handle Nexus Links" in Vortex: the AppImage then registers itself as the `nxm://` handler and keeps pointing at wherever the AppImage file is. This uses `xdg-settings` from xdg-utils, which desktop distributions ship with their browsers.

The AppImage embeds [AppImageUpdate](https://github.com/AppImageCommunity/AppImageUpdate) information pointing at this repository's latest release, so Gear Lever, AppImageLauncher and `appimageupdatetool` can check for and apply updates in place. Vortex also shows a notification when a newer Linux release is published; the older builds from `recipes/` stay pinned and never update.

Expand Down Expand Up @@ -102,7 +104,7 @@ cd dist/arch-build
makepkg -si
```

The build pins both Vortex and libloot to exact upstream commits and downloads the source, Node dependencies, Electron and the Microsoft runtime files. First build is a big one.
The build pins Vortex to an exact upstream commit and downloads the source, Node dependencies, Electron and the Microsoft runtime files. First build is a big one.

Patches live in `patches/`, in the order listed by `_patches` in `PKGBUILD`.
`prepare-arch-build.sh` copies the packaging files and patches into
Expand Down Expand Up @@ -146,7 +148,7 @@ What this does not cover: launching a real game, Steam login, Flatpak permission
```sh
scripts/test-appimage.sh dist/Vortex-*.AppImage # the AppImage check
scripts/check-upstream-compatibility.sh --ref latest --keep # patches against the newest Vortex
scripts/run-upstream-tests.sh /path/to/patched-vortex # the test suite (needs Rust for libloot)
scripts/run-upstream-tests.sh /path/to/patched-vortex # the test suite
```

`--ref pinned` checks the patches against the pinned version instead, and `--keep` keeps the prepared source for the test suite.
Expand Down
41 changes: 4 additions & 37 deletions patches/0001-linux-runtime-compatibility.patch
Original file line number Diff line number Diff line change
Expand Up @@ -50,53 +50,20 @@ index 000000000..891c1c20a
+ expect(getProductVersionLocalized("/games/Missing.exe")).toBe("");
+ });
+});
diff --git a/packages/exe-version/src/index.ts b/packages/exe-version/src/index.ts
index a290954d1..54a814ac3 100644
--- a/packages/exe-version/src/index.ts
+++ b/packages/exe-version/src/index.ts
@@ -8,28 +8,24 @@
import { readVersionInfo } from "./peVersion";

export function getFileVersion(exeFile: string): string {
- if (process.platform !== "win32") return "";
const info = readVersionInfo(exeFile);
if (info === undefined) return "";
return info.fileVersion.join(".");
}

export function getProductVersion(exeFile: string): string {
- if (process.platform !== "win32") return "";
const info = readVersionInfo(exeFile);
if (info === undefined) return "";
return info.productVersion.join(".");
}

export function getFileVersionLocalized(exeFile: string): string {
- if (process.platform !== "win32") return getFileVersion(exeFile);
const info = readVersionInfo(exeFile);
if (info === undefined) return "";
return info.fileVersionString;
}

export function getProductVersionLocalized(exeFile: string): string {
- if (process.platform !== "win32") return getProductVersion(exeFile);
const info = readVersionInfo(exeFile);
if (info === undefined) return "";
return info.productVersionString;
diff --git a/src/main/electron-builder.config.json b/src/main/electron-builder.config.json
index 080a0afb5..f1d0a19cf 100644
index 41318379e..eff9d3fb9 100644
--- a/src/main/electron-builder.config.json
+++ b/src/main/electron-builder.config.json
@@ -74,7 +74,6 @@
"assets/dotnetprobe*",
@@ -76,7 +76,6 @@
"assets/loot/**",
"assets/*.exe",
"assets/css/**",
- "**/*.node",
"duckdb-extensions"
],
"buildDependenciesFromSource": false,
diff --git a/src/main/package.json b/src/main/package.json
index f0f5b8bee..9e26507c3 100644
index f2d2269c5..cc855bc2a 100644
--- a/src/main/package.json
+++ b/src/main/package.json
@@ -3,7 +3,7 @@
Expand Down
Loading
Loading