Created
April 12, 2025 04:14
-
-
Save PhoenixAceVFX/b307dd393f475c80f02da315f6d2265e to your computer and use it in GitHub Desktop.
Build Geforce Now locally for Linux
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
set -euox pipefail | |
APP_NAME="GeForceNOW" | |
APP_ID="geforcenow" | |
APP_DIR="$HOME/.local/share/$APP_ID" | |
LAUNCHER_PATH="$HOME/.local/bin/$APP_ID" | |
DESKTOP_FILE="$HOME/.local/share/applications/$APP_ID.desktop" | |
ICON_DIR="$HOME/.local/share/icons" | |
ICON_PATH="$ICON_DIR/$APP_ID.png" | |
ICON_URL="https://upload.wikimedia.org/wikipedia/commons/2/21/NVIDIA_GeForce_Now_Logo.png" # 512x512 PNG | |
REQUIRED_CMDS=("node" "npm" "jq" "wget" "xdg-desktop-menu" "kbuildsycoca5") | |
# Detect package manager | |
detect_package_manager() { | |
if command -v pacman &> /dev/null; then | |
echo "pacman" | |
elif command -v apt &> /dev/null; then | |
echo "apt" | |
elif command -v dnf &> /dev/null; then | |
echo "dnf" | |
elif command -v zypper &> /dev/null; then | |
echo "zypper" | |
else | |
echo "unknown" | |
fi | |
} | |
PACKAGE_MANAGER=$(detect_package_manager) | |
# Install missing dependencies | |
install_dependency() { | |
local dep=$1 | |
case "$PACKAGE_MANAGER" in | |
pacman) | |
sudo pacman -S --noconfirm "$dep" | |
;; | |
apt) | |
sudo apt update | |
sudo apt install -y "$dep" | |
;; | |
dnf) | |
sudo dnf install -y "$dep" | |
;; | |
zypper) | |
sudo zypper install -y "$dep" | |
;; | |
*) | |
echo "Unsupported package manager. Please install $dep manually." | |
exit 1 | |
;; | |
esac | |
} | |
echo ">>> Checking and installing dependencies..." | |
for cmd in "${REQUIRED_CMDS[@]}"; do | |
if ! command -v "$cmd" &> /dev/null; then | |
echo ">>> Missing: $cmd — installing..." | |
case "$cmd" in | |
node|npm) | |
install_dependency nodejs | |
install_dependency npm | |
;; | |
jq) | |
install_dependency jq | |
;; | |
wget) | |
install_dependency wget | |
;; | |
xdg-desktop-menu|xdg-utils) | |
install_dependency xdg-utils | |
;; | |
kbuildsycoca5) | |
case "$PACKAGE_MANAGER" in | |
pacman) install_dependency kservice ;; | |
apt) install_dependency plasma-workspace ;; | |
dnf) install_dependency plasma-workspace ;; | |
zypper) install_dependency plasma5-workspace ;; | |
*) echo "Install plasma workspace manually for $cmd"; exit 1 ;; | |
esac | |
;; | |
esac | |
else | |
echo ">>> Found: $cmd" | |
fi | |
done | |
# Create app directory | |
echo ">>> Creating app directory at $APP_DIR" | |
mkdir -p "$APP_DIR" | |
cd "$APP_DIR" | |
if [ ! -f package.json ]; then | |
echo ">>> Initializing Node.js project..." | |
npm init -y | |
fi | |
if ! npm list electron >/dev/null 2>&1; then | |
echo ">>> Installing Electron..." | |
npm install --save electron | |
else | |
echo ">>> Electron already installed." | |
fi | |
# Create Electron wrapper | |
echo ">>> Writing Electron main.js..." | |
cat > main.js <<EOF | |
const { app, BrowserWindow } = require('electron'); | |
function createWindow() { | |
const win = new BrowserWindow({ | |
width: 1280, | |
height: 720, | |
webPreferences: { | |
contextIsolation: true | |
}, | |
title: "GeForce NOW" | |
}); | |
win.loadURL("https://play.geforcenow.com/"); | |
} | |
app.whenReady().then(createWindow); | |
app.on("window-all-closed", () => { | |
if (process.platform !== "darwin") { | |
app.quit(); | |
} | |
}); | |
EOF | |
# Configure package.json | |
echo ">>> Updating package.json..." | |
jq '.main = "main.js" | .scripts.start = "electron ."' package.json > package.tmp.json && mv package.tmp.json package.json | |
# Create launcher | |
echo ">>> Creating launcher script at $LAUNCHER_PATH" | |
mkdir -p "$(dirname "$LAUNCHER_PATH")" | |
cat > "$LAUNCHER_PATH" <<EOF | |
#!/bin/bash | |
cd "$APP_DIR" && npm start | |
EOF | |
chmod +x "$LAUNCHER_PATH" | |
# Download icon | |
if [ ! -f "$ICON_PATH" ]; then | |
echo ">>> Downloading GeForce NOW icon..." | |
mkdir -p "$ICON_DIR" | |
wget -O "$ICON_PATH" "$ICON_URL" | |
else | |
echo ">>> Icon already exists." | |
fi | |
# Desktop entry | |
echo ">>> Creating desktop entry at $DESKTOP_FILE" | |
cat > "$DESKTOP_FILE" <<EOF | |
[Desktop Entry] | |
Name=GeForce NOW | |
Exec=$LAUNCHER_PATH | |
Icon=$ICON_PATH | |
Type=Application | |
Categories=Game;Network; | |
StartupWMClass=GeForceNOW | |
EOF | |
# Refresh KDE/Plasma menu | |
echo ">>> Updating KDE application database..." | |
xdg-desktop-menu forceupdate | |
kbuildsycoca5 > /dev/null || true | |
echo "✅ GeForce NOW installed!" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment