diff --git a/.github/workflows/client-release.yml b/.github/workflows/client-release.yml
index 6dc41a2db..620e64fc3 100644
--- a/.github/workflows/client-release.yml
+++ b/.github/workflows/client-release.yml
@@ -130,6 +130,7 @@ jobs:
APPLE_SIGNING_IDENTITY: ${{ env.CERT_ID }}
NO_STRIP: true
with:
+ releaseId: ${{ github.event.release.id || '' }}
tagName: ${{ github.event.release.tag_name || inputs.tagName || 'v__VERSION__' }} # the action automatically replaces \_\_VERSION\_\_ with the app version.
releaseName: "Auto-release v__VERSION__"
releaseBody: "See the assets to download this version and install. This release was created automatically."
@@ -137,3 +138,68 @@ jobs:
prerelease: true
args: ${{ matrix.args }}
projectPath: "./desktop"
+
+ publish-aur:
+ needs: publish-tauri
+ runs-on: ubuntu-22.04
+ permissions:
+ contents: read
+ steps:
+ - uses: actions/checkout@v7
+
+ - name: Update and publish AUR packages
+ env:
+ AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ RELEASE_TAG: ${{ github.event.release.tag_name || inputs.tagName }}
+ run: |
+ # stop the script on errors and unset variables
+ set -euo pipefail
+
+ # require the ssh key used to publish to aur
+ if [[ -z "$AUR_SSH_PRIVATE_KEY" ]]; then
+ echo "AUR_SSH_PRIVATE_KEY is required to publish the AUR packages." >&2
+ exit 1
+ fi
+
+ # read the desktop version and choose the release tag
+ version="$(jq -r '.version' desktop/src-tauri/tauri.conf.json)"
+ tag="${RELEASE_TAG:-v${version}}"
+ [[ "$version" =~ ^[0-9]+(\.[0-9]+)*$ ]]
+ [[ "$tag" =~ ^[A-Za-z0-9._-]+$ ]]
+
+ # download the x86_64 deb package from the github release
+ deb_name="Drop.Desktop.Client_${version}_amd64.deb"
+ gh release download "$tag" \
+ --repo "$GITHUB_REPOSITORY" \
+ --pattern "$deb_name" \
+ --dir "$RUNNER_TEMP"
+ deb_path="$RUNNER_TEMP/$deb_name"
+
+ # configure ssh access to the aur git server
+ mkdir -p "$HOME/.ssh"
+ chmod 700 "$HOME/.ssh"
+ printf '%s\n' "$AUR_SSH_PRIVATE_KEY" > "$HOME/.ssh/aur"
+ chmod 600 "$HOME/.ssh/aur"
+ ssh-keyscan -H aur.archlinux.org >> "$HOME/.ssh/known_hosts"
+ eval "$(ssh-agent -s)"
+ ssh-add "$HOME/.ssh/aur"
+
+ # fill the release-specific values in both package recipes
+ node packages/update-aur-packages.mjs "$tag" "$version" "$deb_path"
+
+ # publish each updated recipe to its aur repository
+ for package in drop-oss-app-bin drop-oss-app; do
+ package_dir="$RUNNER_TEMP/$package"
+ git clone "ssh://aur@aur.archlinux.org/$package.git" "$package_dir"
+ cp "packages/$package/PKGBUILD" "$package_dir/PKGBUILD"
+ cp "packages/$package/.SRCINFO" "$package_dir/.SRCINFO"
+ git -C "$package_dir" config user.name "github-actions[bot]"
+ git -C "$package_dir" config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+ git -C "$package_dir" add PKGBUILD .SRCINFO
+ if ! git -C "$package_dir" diff --cached --quiet; then
+ # create and push a commit only when the recipe changed
+ git -C "$package_dir" commit -m "Update to $version"
+ git -C "$package_dir" push origin HEAD:master
+ fi
+ done
diff --git a/README.md b/README.md
index 74af78cf6..e9e9d14cf 100644
--- a/README.md
+++ b/README.md
@@ -16,6 +16,9 @@
Drop is an open-source game distribution platform, similar to GameVault or Steam. It's designed to distribute and share DRM-free games quickly, all while being incredibly flexible, beautiful, and fast.
+> [!NOTE]
+> Drop is in maintenance mode. Maintainers will not contribute new large features, but bugs will continue to be fixed and external contributions will continue to be merged.
+
diff --git a/desktop/.gitlab-ci.yml b/desktop/.gitlab-ci.yml
deleted file mode 100644
index 0fc3abe6f..000000000
--- a/desktop/.gitlab-ci.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-stages:
- - build
-
-build-linux:
- stage: build
- image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/rustlang/rust:nightly
- script:
- - apt-get update -y
- - apt-get install yarnpkg libsoup-3.0-0 libsoup-3.0-dev libatk-adaptor libgtk-3-dev libjavascriptcoregtk-4.1-dev libwebkit2gtk-4.1-dev -y
- - yarnpkg
- - export
- - export RUST_LOG=warn
- - yarnpkg tauri build
- - cp src-tauri/target/release/bundle/deb/*.deb .
- - cp src-tauri/target/release/bundle/rpm/*.rpm .
- - cp src-tauri/target/release/bundle/appimage/*.AppImage .
- artifacts:
- paths:
- - "*.{deb,rpm,AppImage}"
-
-build-windows:
- stage: build
- tags:
- - windows
- script:
- - yarn
- - yarn tauri build
- - cp src-tauri/target/release/bundle/nsis/*.exe .
- artifacts:
- paths:
- - "*.exe"
diff --git a/desktop/src-tauri/process/src/process_handlers.rs b/desktop/src-tauri/process/src/process_handlers.rs
index d3f343f25..9704e8b19 100644
--- a/desktop/src-tauri/process/src/process_handlers.rs
+++ b/desktop/src-tauri/process/src/process_handlers.rs
@@ -303,7 +303,7 @@ impl ProcessHandler for UMUNativeLauncher {
.map_or("", |v| v);
let game_id = if umu_id_override.is_empty() {
- &game_version.version_id
+ "umu-default"
} else {
umu_id_override
};
@@ -365,7 +365,7 @@ impl ProcessHandler for UMUCompatLauncher {
.map_or("", |v| v);
let game_id = if umu_id_override.is_empty() {
- &game_version.version_id
+ "umu-default"
} else {
umu_id_override
};
diff --git a/packages/drop-oss-app-bin/.SRCINFO b/packages/drop-oss-app-bin/.SRCINFO
new file mode 100644
index 000000000..0d6abe417
--- /dev/null
+++ b/packages/drop-oss-app-bin/.SRCINFO
@@ -0,0 +1,20 @@
+pkgbase = drop-oss-app-bin
+ pkgdesc = The client application for the open-source, self-hosted game distribution platform Drop
+ pkgver = DROP_PKG_VER
+ pkgrel = DROP_PKG_REL
+ url = https://droposs.org/
+ arch = any
+ license = LicenseRef-GPL-3.0
+ makedepends = libarchive
+ depends = glib2
+ depends = glibc
+ depends = gcc-libs
+ depends = webkit2gtk-4.1
+ depends = umu-launcher
+ depends = libappindicator
+ depends = libayatana-appindicator
+ conflicts = drop-oss-app
+ source = https://github.com/Drop-OSS/drop/releases/download/DROP_RELEASE_TAG/Drop.Desktop.Client_DROP_PKG_VER_amd64.deb
+ sha256sums = DROP_DEB_SHA256
+
+pkgname = drop-oss-app-bin
diff --git a/packages/drop-oss-app-bin/PKGBUILD b/packages/drop-oss-app-bin/PKGBUILD
new file mode 100644
index 000000000..a448a5e8f
--- /dev/null
+++ b/packages/drop-oss-app-bin/PKGBUILD
@@ -0,0 +1,24 @@
+# Maintainer: DecDuck
+# Maintainer: quexeky
+
+pkgname=drop-oss-app-bin
+pkgver=DROP_PKG_VER
+pkgrel=DROP_PKG_REL
+pkgdesc="The client application for the open-source, self-hosted game distribution platform Drop"
+arch=(any)
+conflicts=('drop-oss-app')
+url="https://droposs.org/"
+license=('LicenseRef-GPL-3.0')
+depends=('glib2' 'glibc' 'gcc-libs' 'webkit2gtk-4.1' 'umu-launcher' 'libappindicator' 'libayatana-appindicator')
+makedepends=('libarchive')
+source=("https://github.com/Drop-OSS/drop/releases/download/DROP_RELEASE_TAG/Drop.Desktop.Client_DROP_PKG_VER_amd64.deb")
+sha256sums=('DROP_DEB_SHA256')
+
+prepare() {
+ bsdtar -xf ./*.deb
+ bsdtar -xf data.tar.*
+}
+
+package() {
+ cp -r "$srcdir/usr" "$pkgdir"
+}
diff --git a/packages/drop-oss-app/.SRCINFO b/packages/drop-oss-app/.SRCINFO
new file mode 100644
index 000000000..41eee28c1
--- /dev/null
+++ b/packages/drop-oss-app/.SRCINFO
@@ -0,0 +1,22 @@
+pkgbase = drop-oss-app
+ pkgdesc = Desktop client for the Drop OSS project.
+ pkgver = DROP_PKG_VER
+ pkgrel = DROP_PKG_REL
+ url = https://droposs.org/
+ arch = any
+ license = AGPL-3.0-only
+ makedepends = pnpm
+ makedepends = cargo-nightly
+ makedepends = gcc
+ makedepends = pkgconf
+ depends = glib2
+ depends = glibc
+ depends = gcc-libs
+ depends = webkit2gtk-4.1
+ depends = umu-launcher
+ depends = libappindicator
+ depends = libayatana-appindicator
+ source = git+https://github.com/Drop-OSS/drop.git#tag=DROP_RELEASE_TAG
+ sha256sums = SKIP
+
+pkgname = drop-oss-app
diff --git a/packages/drop-oss-app/PKGBUILD b/packages/drop-oss-app/PKGBUILD
new file mode 100644
index 000000000..a935184a1
--- /dev/null
+++ b/packages/drop-oss-app/PKGBUILD
@@ -0,0 +1,48 @@
+# Maintainer: quexeky
+# Maintainer: DecDuck
+
+pkgname=drop-oss-app
+pkgver=DROP_PKG_VER
+pkgrel=DROP_PKG_REL
+pkgdesc="Desktop client for the Drop OSS project."
+arch=(any)
+url="https://droposs.org/"
+license=('AGPL-3.0-only')
+depends=('glib2' 'glibc' 'gcc-libs' 'webkit2gtk-4.1' 'umu-launcher' 'libappindicator' 'libayatana-appindicator')
+makedepends=('pnpm' 'cargo-nightly' 'gcc' 'pkgconf')
+source=("git+https://github.com/Drop-OSS/drop.git#tag=DROP_RELEASE_TAG")
+sha256sums=('SKIP')
+
+_desktop="
+[Desktop Entry]\n
+Type=Application\n
+Version=DROP_PKG_VER\n
+Name=Drop Desktop App\n
+Comment=Drop client for Linux\n
+Path=/usr/bin/\n
+Exec=drop-app\n
+Icon=drop-oss-app\n
+Terminal=false\n
+"
+
+prepare() {
+ echo "$_desktop" > drop-oss-app.desktop
+}
+
+build() {
+ cd drop
+ pnpm install
+ cd desktop
+ export RUSTUP_TOOLCHAIN=nightly
+ CFLAGS+=' -ffat-lto-objects'
+ pnpm tauri build --no-bundle
+}
+
+package() {
+ echo -e "$_desktop" > drop-oss-app.desktop
+ install -Dm0755 -t "$pkgdir/usr/share/applications" "drop-oss-app.desktop"
+ cd drop/desktop
+ cp src-tauri/icons/icon.png ./drop-oss-app.png
+ install -Dm0755 -t "$pkgdir/usr/share/pixmaps" "./drop-oss-app.png"
+ install -Dm0755 -t "$pkgdir/usr/bin" "src-tauri/target/release/drop-app"
+}
diff --git a/packages/update-aur-packages.mjs b/packages/update-aur-packages.mjs
new file mode 100644
index 000000000..58e1d316d
--- /dev/null
+++ b/packages/update-aur-packages.mjs
@@ -0,0 +1,52 @@
+import { createHash } from "node:crypto";
+import { readFile, writeFile } from "node:fs/promises";
+import { dirname, join } from "node:path";
+import { fileURLToPath } from "node:url";
+
+function replaceToken(text, token, value, expectedCount) {
+ const actualCount = text.split(token).length - 1;
+ if (actualCount !== expectedCount) {
+ throw new Error(`Expected ${expectedCount} ${token} tokens, found ${actualCount}`);
+ }
+ return text.replaceAll(token, value);
+}
+
+async function updateFile(path, transform) {
+ const original = await readFile(path, "utf8");
+ await writeFile(path, transform(original));
+}
+
+const [tag, version, debPath, ...extraArgs] = process.argv.slice(2);
+if (!tag || !version || !debPath || extraArgs.length > 0) {
+ throw new Error("usage: update-aur-packages.mjs TAG VERSION DEB_PATH");
+}
+if (!/^[A-Za-z0-9._-]+$/.test(tag)) {
+ throw new Error("Release tag contains unsupported characters");
+}
+if (!/^[0-9]+(?:\.[0-9]+)*$/.test(version)) {
+ throw new Error("Package version must contain numeric dot-separated components");
+}
+
+const packagesDir = dirname(fileURLToPath(import.meta.url));
+const checksum = createHash("sha256").update(await readFile(debPath)).digest("hex");
+const tokens = [
+ ["DROP_PKG_VER", version],
+ ["DROP_PKG_REL", "1"],
+ ["DROP_RELEASE_TAG", tag],
+ ["DROP_DEB_SHA256", checksum],
+];
+const files = [
+ { packageName: "drop-oss-app", fileName: "PKGBUILD", tokenCounts: [2, 1, 1, 0] },
+ { packageName: "drop-oss-app", fileName: ".SRCINFO", tokenCounts: [1, 1, 1, 0] },
+ { packageName: "drop-oss-app-bin", fileName: "PKGBUILD", tokenCounts: [2, 1, 1, 1] },
+ { packageName: "drop-oss-app-bin", fileName: ".SRCINFO", tokenCounts: [2, 1, 1, 1] },
+];
+
+for (const { packageName, fileName, tokenCounts } of files) {
+ await updateFile(join(packagesDir, packageName, fileName), (text) =>
+ tokens.reduce(
+ (updated, [token, value], index) => replaceToken(updated, token, value, tokenCounts[index]),
+ text,
+ ),
+ );
+}
\ No newline at end of file
diff --git a/server/.env.example b/server/.env.example
index dbd70e578..5567a5666 100644
--- a/server/.env.example
+++ b/server/.env.example
@@ -6,6 +6,10 @@ GIANT_BOMB_API_KEY=""
IGDB_CLIENT_ID=""
IGDB_CLIENT_SECRET=""
+# PCGamingWiki bot account credentials (create a bot password in MediaWiki)
+PCGAMINGWIKI_BOT_USERNAME=""
+PCGAMINGWIKI_BOT_PASSWORD=""
+
EXTERNAL_URL="http://localhost:3000"
NUXT_PORT=4000
diff --git a/server/package.json b/server/package.json
index 41a195ee2..f4f1ec453 100644
--- a/server/package.json
+++ b/server/package.json
@@ -5,7 +5,7 @@
"type": "module",
"license": "AGPL-3.0-or-later",
"engines": {
- "node": ">=22.16.0"
+ "node": ">=24.0.0"
},
"scripts": {
"build": "nuxt build",
diff --git a/server/pages/admin/library/index.vue b/server/pages/admin/library/index.vue
index 2f0f542b8..d36476744 100644
--- a/server/pages/admin/library/index.vue
+++ b/server/pages/admin/library/index.vue
@@ -496,19 +496,28 @@
-
+
+
+ ...
+
+
+