Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
7305d9d
Share the bundled .NET runtime download
Arkazzae Oct 28, 2026
7bd258e
Check .NET from inside the running app in smoke tests
Arkazzae Oct 28, 2026
aea1ee8
Build a Debian package for Debian and Ubuntu
Arkazzae Oct 28, 2026
a19a928
Build, test and publish the Debian package in CI
Arkazzae Oct 28, 2026
aed927f
Document the Debian package and bump pkgrel
Arkazzae Oct 28, 2026
55a1b25
Build an RPM package for Fedora and openSUSE
Arkazzae Oct 28, 2026
e095edb
Test the AppImage and the packages with one script
Arkazzae Oct 28, 2026
e960a0b
Share package metadata and AppStream setup between build scripts
Arkazzae Oct 28, 2026
83aea43
Build, test and publish the RPM package in CI
Arkazzae Oct 28, 2026
44c61a4
Document the RPM package
Arkazzae Oct 28, 2026
5f5e67c
Require a font in the RPM package
Arkazzae Oct 28, 2026
37ce718
Update Vortex to 2.10.0
Arkazzae Nov 4, 2026
dc0e049
Accept Vortex 2.10's redesigned pages in the UI check
Arkazzae Nov 4, 2026
8d95bfe
Check package libraries before installing the test harness
Arkazzae Nov 4, 2026
f608147
Accept newer ICU versions in the .deb and .rpm
Arkazzae Nov 4, 2026
8f83b62
Keep the import folder out of the mod list
Arkazzae Nov 4, 2026
b98fc23
Keep the Linux .NET location out of Wine processes
Arkazzae Nov 4, 2026
5b0d205
Repair old Linux deployment times and keep case-variant backups
Arkazzae Nov 4, 2026
61c1ff4
Read exe versions as upstream does outside Linux
Arkazzae Nov 4, 2026
c6cc9f9
Map extension fs calls into the prefix like vortex-api's fs
Arkazzae Nov 4, 2026
2803c05
Mention Vortex 2.10's Linux fixes in the README
Arkazzae Nov 4, 2026
b9e70a6
Remove games tested section from README
Arkazzae Nov 4, 2026
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
6 changes: 3 additions & 3 deletions .SRCINFO
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
pkgbase = vortex-linux
pkgdesc = Community build of Vortex with generic Linux compatibility patches
pkgver = 2.9.1
pkgver = 2.10.0
pkgrel = 1
url = https://github.com/Arkazzae/VortexLinux
install = vortex.install
Expand Down Expand Up @@ -43,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.9.1
provides = vortex=2.10.0
conflicts = vortex
conflicts = vortex-bin
conflicts = vortex-git
Expand All @@ -56,7 +56,7 @@ 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=c80326367cbe6d96621ad6cf4a5488ef49bac110
source = vortex::git+https://github.com/Nexus-Mods/Vortex.git#commit=d6c694982beab5ae53b9f8da13428cdfbc5b63ce
source = pnpm-11.10.0.tgz::https://registry.npmjs.org/pnpm/-/pnpm-11.10.0.tgz
source = 0001-linux-runtime-compatibility.patch
source = 0002-linux-path-and-executable-discovery.patch
Expand Down
13 changes: 9 additions & 4 deletions .github/workflows/build-version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,11 +81,13 @@ jobs:
env:
SOURCE_DIRECTORY: ${{ steps.prepare.outputs.source_directory }}
run: |
if [[ -f "$SOURCE_DIRECTORY/scripts/test-appimage.sh" ]]; then
# Older recipes ship test-appimage.sh instead of test-package.sh.
if [[ -f "$SOURCE_DIRECTORY/scripts/test-package.sh" || \
-f "$SOURCE_DIRECTORY/scripts/test-appimage.sh" ]]; then
echo 'supported=true' >> "$GITHUB_OUTPUT"
else
echo 'supported=false' >> "$GITHUB_OUTPUT"
echo 'AppImage runtime check skipped: the selected historical recipe does not provide scripts/test-appimage.sh.' \
echo 'AppImage runtime check skipped: the selected historical recipe provides neither scripts/test-package.sh nor scripts/test-appimage.sh.' \
>> "$GITHUB_STEP_SUMMARY"
fi

Expand Down Expand Up @@ -198,5 +200,8 @@ jobs:
run: |
cd "$ARTIFACT_DIRECTORY"
sha256sum --check "$APPIMAGE_ARCHIVE.sha256"
bash "$GITHUB_WORKSPACE/$RECIPE_PATH/scripts/test-appimage.sh" \
"$ARTIFACT_DIRECTORY/$APPIMAGE_ARCHIVE"
test_script="$GITHUB_WORKSPACE/$RECIPE_PATH/scripts/test-package.sh"
if [[ ! -f "$test_script" ]]; then
test_script="$GITHUB_WORKSPACE/$RECIPE_PATH/scripts/test-appimage.sh"
fi
bash "$test_script" "$ARTIFACT_DIRECTORY/$APPIMAGE_ARCHIVE"
122 changes: 87 additions & 35 deletions .github/workflows/upstream-compatibility.yml
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,10 @@ jobs:
"Vortex-${package_version}-x86_64.AppImage"
"Vortex-${package_version}-x86_64.AppImage.sha256"
"Vortex-${package_version}-x86_64.AppImage.zsync"
"vortex-linux_${package_version}_amd64.deb"
"vortex-linux_${package_version}_amd64.deb.sha256"
"vortex-linux-${package_version}-x86_64.rpm"
"vortex-linux-${package_version}-x86_64.rpm.sha256"
)
release_needed=false
for required_asset in "${required_assets[@]}"; do
Expand Down Expand Up @@ -283,6 +287,10 @@ jobs:
appimage_archive: ${{ steps.appimage.outputs.appimage_archive }}
appimage_checksum: ${{ steps.appimage.outputs.appimage_checksum }}
appimage_zsync: ${{ steps.appimage.outputs.appimage_zsync }}
deb_archive: ${{ steps.distro.outputs.deb_archive }}
deb_checksum: ${{ steps.distro.outputs.deb_checksum }}
rpm_archive: ${{ steps.distro.outputs.rpm_archive }}
rpm_checksum: ${{ steps.distro.outputs.rpm_checksum }}
steps:
- name: Check out packaging repository
uses: actions/checkout@v6
Expand All @@ -308,9 +316,11 @@ jobs:
fi

pacman -Syu --needed --noconfirm "${build_dependencies[@]}"
# build-appimage.sh validates the AppStream metadata when appstreamcli
# is available; the package itself does not need it.
pacman -S --needed --noconfirm appstream
# build-appimage.sh and build-distro-packages.sh validate the
# AppStream metadata when appstreamcli is available, and build the
# Debian and RPM packages with dpkg-deb and rpmbuild. The Arch package
# needs none of them.
pacman -S --needed --noconfirm appstream dpkg rpm-tools
useradd --create-home --shell /bin/bash builder
chown -R builder:builder "$GITHUB_WORKSPACE"
df -h "$GITHUB_WORKSPACE"
Expand All @@ -335,6 +345,16 @@ jobs:
scripts/build-appimage.sh \
"dist/${{ steps.package.outputs.package_archive }}"

- name: Build Debian and RPM packages
id: distro
run: |
chown builder:builder "$GITHUB_OUTPUT" "$GITHUB_STEP_SUMMARY"
runuser --user builder -- env \
HOME=/home/builder \
XDG_CACHE_HOME=/home/builder/.cache \
scripts/build-distro-packages.sh \
"dist/${{ steps.package.outputs.package_archive }}"

- name: Upload release artifacts
uses: actions/upload-artifact@v4
with:
Expand All @@ -345,16 +365,35 @@ jobs:
dist/${{ steps.appimage.outputs.appimage_archive }}
dist/${{ steps.appimage.outputs.appimage_checksum }}
dist/${{ steps.appimage.outputs.appimage_zsync }}
dist/${{ steps.distro.outputs.deb_archive }}
dist/${{ steps.distro.outputs.deb_checksum }}
dist/${{ steps.distro.outputs.rpm_archive }}
dist/${{ steps.distro.outputs.rpm_checksum }}
if-no-files-found: error
compression-level: 0
retention-days: 30

test-appimage:
name: Test AppImage on clean Ubuntu
test-packages:
name: Test ${{ matrix.kind }} on ${{ matrix.image }}
needs: build-package
if: ${{ needs.build-package.result == 'success' }}
runs-on: ubuntu-latest
timeout-minutes: 20
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
- { kind: appimage, image: "ubuntu:24.04" }
- { kind: deb, image: "ubuntu:24.04" }
- { kind: deb, image: "ubuntu:26.04" }
- { kind: deb, image: "debian:13" }
- { kind: rpm, image: "fedora:43" }
- { kind: rpm, image: "fedora:44" }
- { kind: rpm, image: "opensuse/leap:16.0" }
- { kind: rpm, image: "opensuse/tumbleweed" }
env:
ARTIFACT: ${{ needs.build-package.outputs[format('{0}_archive', matrix.kind)] }}
CHECKSUM: ${{ needs.build-package.outputs[format('{0}_checksum', matrix.kind)] }}
steps:
- name: Check out packaging repository
uses: actions/checkout@v6
Expand All @@ -365,24 +404,24 @@ jobs:
name: vortex-linux-${{ needs.build-package.outputs.package_version }}
path: dist

- name: Verify and start AppImage in a clean container
- name: Verify and test the artifact in a clean container
run: |
(
cd dist || exit 1
sha256sum --check "${{ needs.build-package.outputs.appimage_checksum }}"
sha256sum --check "$CHECKSUM"
)
scripts/test-appimage.sh "dist/${{ needs.build-package.outputs.appimage_archive }}"
scripts/test-package.sh "dist/$ARTIFACT" "${{ matrix.image }}"

finalize-source:
name: Record tested upstream release
needs:
- compatibility
- prepare-release
- build-package
- test-appimage
- test-packages
if: >-
${{
needs.test-appimage.result == 'success' &&
needs.test-packages.result == 'success' &&
github.ref == 'refs/heads/master' &&
needs.prepare-release.outputs.release_needed == 'true'
}}
Expand Down Expand Up @@ -460,7 +499,7 @@ jobs:
- compatibility
- prepare-release
- build-package
- test-appimage
- test-packages
- finalize-source
if: >-
${{
Expand All @@ -479,6 +518,10 @@ jobs:
APPIMAGE_ARCHIVE: ${{ needs.build-package.outputs.appimage_archive }}
APPIMAGE_CHECKSUM: ${{ needs.build-package.outputs.appimage_checksum }}
APPIMAGE_ZSYNC: ${{ needs.build-package.outputs.appimage_zsync }}
DEB_ARCHIVE: ${{ needs.build-package.outputs.deb_archive }}
DEB_CHECKSUM: ${{ needs.build-package.outputs.deb_checksum }}
RPM_ARCHIVE: ${{ needs.build-package.outputs.rpm_archive }}
RPM_CHECKSUM: ${{ needs.build-package.outputs.rpm_checksum }}
UPSTREAM_COMMIT: ${{ needs.compatibility.outputs.upstream_commit }}
SOURCE_COMMIT: ${{ needs.finalize-source.outputs.source_commit }}
steps:
Expand All @@ -490,7 +533,7 @@ jobs:

- name: Verify downloaded artifacts
working-directory: dist
run: sha256sum --check "$CHECKSUM_FILE" "$APPIMAGE_CHECKSUM"
run: sha256sum --check -- *.sha256

- name: Download release notes
uses: actions/download-artifact@v5
Expand Down Expand Up @@ -523,6 +566,27 @@ jobs:
sudo pacman -U ./${PACKAGE_ARCHIVE}
\`\`\`

## Debian and Ubuntu

For Ubuntu 24.04 or newer and Debian 13 or newer:

\`\`\`sh
sha256sum --check ${DEB_CHECKSUM}
sudo apt install ./${DEB_ARCHIVE}
\`\`\`

## Fedora and openSUSE

For Fedora 43 or newer, openSUSE Leap 16 and Tumbleweed:

\`\`\`sh
sha256sum --check ${RPM_CHECKSUM}
sudo dnf install ./${RPM_ARCHIVE}
\`\`\`

The package is not signed, so on openSUSE install it with
\`sudo zypper install --allow-unsigned-rpm ./${RPM_ARCHIVE}\`.

## Other x86_64 Linux distributions

Install Wine with your distribution's package manager, then:
Expand Down Expand Up @@ -560,13 +624,10 @@ jobs:
exit 1
fi

# The downloaded artifact holds exactly the release files.
assets=(dist/*)
if gh release view "$RELEASE_TAG" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then
gh release upload "$RELEASE_TAG" \
"dist/$PACKAGE_ARCHIVE" \
"dist/$CHECKSUM_FILE" \
"dist/$APPIMAGE_ARCHIVE" \
"dist/$APPIMAGE_CHECKSUM" \
"dist/$APPIMAGE_ZSYNC" \
gh release upload "$RELEASE_TAG" "${assets[@]}" \
--repo "$GITHUB_REPOSITORY" \
--clobber
gh release edit "$RELEASE_TAG" \
Expand All @@ -575,23 +636,14 @@ jobs:
--notes-file release-notes.md \
--latest
elif [[ -n "$target_tag_sha" ]]; then
gh release create "$RELEASE_TAG" \
"dist/$PACKAGE_ARCHIVE" \
"dist/$CHECKSUM_FILE" \
"dist/$APPIMAGE_ARCHIVE" \
"dist/$APPIMAGE_CHECKSUM" \
gh release create "$RELEASE_TAG" "${assets[@]}" \
--repo "$GITHUB_REPOSITORY" \
--verify-tag \
--title "Vortex for Linux ${PACKAGE_REVISION}" \
--notes-file release-notes.md \
--latest
else
gh release create "$RELEASE_TAG" \
"dist/$PACKAGE_ARCHIVE" \
"dist/$CHECKSUM_FILE" \
"dist/$APPIMAGE_ARCHIVE" \
"dist/$APPIMAGE_CHECKSUM" \
"dist/$APPIMAGE_ZSYNC" \
gh release create "$RELEASE_TAG" "${assets[@]}" \
--repo "$GITHUB_REPOSITORY" \
--target "$SOURCE_COMMIT" \
--title "Vortex for Linux ${PACKAGE_REVISION}" \
Expand All @@ -613,7 +665,7 @@ jobs:
- compatibility
- prepare-release
- build-package
- test-appimage
- test-packages
- finalize-source
- publish-package
if: ${{ always() && github.event_name == 'schedule' }}
Expand All @@ -632,7 +684,7 @@ jobs:
COMPATIBILITY_STATUS: ${{ needs.compatibility.result }}
PREPARE_STATUS: ${{ needs.prepare-release.result }}
BUILD_STATUS: ${{ needs.build-package.result }}
APPIMAGE_STATUS: ${{ needs.test-appimage.result }}
TEST_STATUS: ${{ needs.test-packages.result }}
FINALIZE_STATUS: ${{ needs.finalize-source.result }}
PUBLISH_STATUS: ${{ needs.publish-package.result }}
RUN_URL: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
Expand All @@ -650,7 +702,7 @@ jobs:
"$COMPATIBILITY_STATUS"
"$PREPARE_STATUS"
"$BUILD_STATUS"
"$APPIMAGE_STATUS"
"$TEST_STATUS"
"$FINALIZE_STATUS"
"$PUBLISH_STATUS"
)
Expand All @@ -666,7 +718,7 @@ jobs:
true)
required_statuses=(
"$BUILD_STATUS"
"$APPIMAGE_STATUS"
"$TEST_STATUS"
"$FINALIZE_STATUS"
"$PUBLISH_STATUS"
)
Expand Down Expand Up @@ -697,7 +749,7 @@ jobs:
"- Patch tests: \`${COMPATIBILITY_STATUS}\`" \
"- Metadata: \`${PREPARE_STATUS}\`" \
"- Package build: \`${BUILD_STATUS}\`" \
"- AppImage smoke test: \`${APPIMAGE_STATUS}\`" \
"- Package smoke tests: \`${TEST_STATUS}\`" \
"- Source update: \`${FINALIZE_STATUS}\`" \
"- Release publish: \`${PUBLISH_STATUS}\`" \
"- Workflow run: ${RUN_URL}" \
Expand Down
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,26 @@ publishes a new Vortex version, taking any pending notes with it.

## Unreleased

- Vortex 2.10.0. Some of our Linux fixes are part of Vortex itself now
(finding the drive a folder is on, suggesting a staging folder on a mounted
drive), so the patches that carried them got smaller.
- Choosing "import" for a file changed outside Vortex no longer leaves a
`.vortex-import` folder in the staging folder, which Vortex then offered to
add as a mod.
- Windows .NET programs started through Wine no longer inherit the location of
the Linux .NET runtime that the AppImage and the packages bring, which could
keep them from finding their own runtime.
- Game extensions that use Node's `fs` directly now find files in Documents
and `%APPDATA%` where Vortex's own file functions put them: in the game's
Proton prefix when the prefix has that folder. The Witcher 3 could not save
its load order (`mods.settings`) because of this.
- Native packages for Debian, Ubuntu, Fedora and openSUSE: releases now
include `vortex-linux_<version>_amd64.deb` for Ubuntu 24.04 or newer and
Debian 13 or newer, and `vortex-linux-<version>-x86_64.rpm` for Fedora 43 or
newer, openSUSE Leap 16 and Tumbleweed. apt, dnf or zypper install Vortex with
its dependencies and an app menu entry. Like the AppImage, the packages bring
their own .NET runtimes.

## 2.9.1-1 - 2026-10-27

Automatic update to Vortex 2.9.1, published after the usual checks passed. Upstream commit `c80326367cbe6d96621ad6cf4a5488ef49bac110`. The Linux patches and packaging are unchanged since 2.9.0-5.
Expand Down
4 changes: 2 additions & 2 deletions PKGBUILD
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Maintainer: Arkazzae <https://github.com/Arkazzae>

pkgname=vortex-linux
pkgver=2.9.1
pkgver=2.10.0
pkgrel=1
pkgdesc="Community build of Vortex with generic Linux compatibility patches"
arch=('x86_64')
Expand Down Expand Up @@ -96,7 +96,7 @@ conflicts=('vortex' 'vortex-bin' 'vortex-git')
options=('!debug' '!strip')
install=vortex.install

_upstream_commit='c80326367cbe6d96621ad6cf4a5488ef49bac110'
_upstream_commit='d6c694982beab5ae53b9f8da13428cdfbc5b63ce'
_pnpm='11.10.0'
_dotnet6='6.0.36'
_dotnet8='8.0.29'
Expand Down
Loading
Loading