Skip to content

Instantly share code, notes, and snippets.

@PhoenixAceVFX
Created April 12, 2025 04:14
Show Gist options
  • Save PhoenixAceVFX/b307dd393f475c80f02da315f6d2265e to your computer and use it in GitHub Desktop.
Save PhoenixAceVFX/b307dd393f475c80f02da315f6d2265e to your computer and use it in GitHub Desktop.
Build Geforce Now locally for Linux
#!/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