diff --git a/.github/tools/bundle.sh b/.github/tools/bundle.sh
index 54ffb77..1fddd13 100755
--- a/.github/tools/bundle.sh
+++ b/.github/tools/bundle.sh
@@ -1,16 +1,16 @@
#!/bin/bash
# Build a single-file version of the wizard for `curl | bash` use:
-# .github/tools/bundle.sh [output] (default: dist/setup-gamescope-boot.sh)
+# .github/tools/bundle.sh [output] (default: dist/steamify.sh)
#
-# Inlines lib/*.sh in the order setup-gamescope-boot.sh sources them and
+# Inlines lib/*.sh in the order steamify.sh sources them and
# wraps the entry point's body in main(), so bash has read the whole file
# before anything runs. That lets the bundle reattach stdin to the terminal
# when it was piped in by curl, so the interactive menu still works.
set -euo pipefail
cd "$(dirname "$0")/../.."
-out="${1:-dist/setup-gamescope-boot.sh}"
-entry=setup-gamescope-boot.sh
+out="${1:-dist/steamify.sh}"
+entry=steamify.sh
mkdir -p "$(dirname "$out")"
# Library order, taken from the entry point's source loop.
@@ -23,15 +23,15 @@ version="v$(grep -oP '^VERSION=\K.*' "$entry"), $(git describe --always --dirty
# Header comment and `set` line of the entry point, up to the source loop.
sed -n '1,/^SCRIPT_DIR=/p' "$entry" | sed '$d'
echo "# Single-file build ($version), generated by .github/tools/bundle.sh - edit the"
- echo "# sources in the repository instead: https://github.com/theupriser/cachyos-gamescope-boot"
+ echo "# sources in the repository instead: https://github.com/theupriser/steamify-cachyos"
echo
for lib in $libs; do
echo "# ----- lib/$lib.sh -----"
# Drop each module's shebang and its "Sourced by ..." boilerplate.
- sed -e '1{/^#!/d}' -e '/^# Sourced by setup-gamescope-boot.sh/d' "lib/$lib.sh"
+ sed -e '1{/^#!/d}' -e '/^# Sourced by steamify.sh/d' "lib/$lib.sh"
echo
done
- echo "# ----- setup-gamescope-boot.sh -----"
+ echo "# ----- steamify.sh -----"
echo "main() {"
# Everything after the source loop is the entry point's body.
sed -n '/^for lib in /,$p' "$entry" | sed '1,/^done$/d' | sed 's/^/ /; s/^ $//'
diff --git a/.github/workflows/bundle.yml b/.github/workflows/bundle.yml
index 1fc7a7b..6e04be6 100644
--- a/.github/workflows/bundle.yml
+++ b/.github/workflows/bundle.yml
@@ -1,10 +1,12 @@
# Builds the single-file wizard (.github/tools/bundle.sh) and publishes it as a
-# release per version: tag v$VERSION (VERSION in setup-gamescope-boot.sh),
+# release per version: tag v$VERSION (VERSION in steamify.sh),
# with that version's CHANGELOG.md section as notes. A released version is
# never overwritten; the newest one is marked latest, and the "latest" tag and
# release are moved to it, so both of these always get the newest version:
-# curl -fsSL https://github.com/theupriser/cachyos-gamescope-boot/releases/latest/download/setup-gamescope-boot.sh | bash
-# curl -fsSL https://github.com/theupriser/cachyos-gamescope-boot/releases/download/latest/setup-gamescope-boot.sh | bash
+# curl -fsSL https://github.com/theupriser/steamify-cachyos/releases/latest/download/steamify.sh | bash
+# curl -fsSL https://github.com/theupriser/steamify-cachyos/releases/download/latest/steamify.sh | bash
+# The bundle is also published as setup-gamescope-boot.sh, its name before
+# 0.9.0, so older install commands keep working.
# Pull requests only build and check it, and warn when VERSION is already released.
name: Single-file build
@@ -26,29 +28,32 @@ jobs:
fetch-depth: 0 # for the version in the bundle's header
- name: Build
- run: .github/tools/bundle.sh dist/setup-gamescope-boot.sh
+ run: |
+ .github/tools/bundle.sh dist/steamify.sh
+ # Old name (before 0.9.0), for older install commands and links.
+ cp dist/steamify.sh dist/setup-gamescope-boot.sh
- name: Check
run: |
- bash -n dist/setup-gamescope-boot.sh
+ bash -n dist/steamify.sh
# SC2034/SC2154: variables used across the inlined modules.
- shellcheck -S warning -e SC2034,SC2154 dist/setup-gamescope-boot.sh
+ shellcheck -S warning -e SC2034,SC2154 dist/steamify.sh
- uses: actions/upload-artifact@v4
with:
- name: setup-gamescope-boot
- path: dist/setup-gamescope-boot.sh
+ name: steamify
+ path: dist/steamify.sh
- name: Version
id: version
env:
GH_TOKEN: ${{ github.token }}
run: |
- version="$(grep -oP '^VERSION=\K.*' setup-gamescope-boot.sh)"
+ version="$(grep -oP '^VERSION=\K.*' steamify.sh)"
echo "version=$version" >> "$GITHUB_OUTPUT"
if gh release view "v$version" >/dev/null 2>&1; then
echo "released=true" >> "$GITHUB_OUTPUT"
- echo "::warning::v$version is already released and won't be overwritten. Bump VERSION in setup-gamescope-boot.sh and add a CHANGELOG.md section to release this."
+ echo "::warning::v$version is already released and won't be overwritten. Bump VERSION in steamify.sh and add a CHANGELOG.md section to release this."
else
echo "released=false" >> "$GITHUB_OUTPUT"
fi
@@ -68,12 +73,12 @@ jobs:
notes="Single-file build of v$VERSION ($(git describe --always), $(git log -1 --format=%cs)).
Run the newest version with:
- curl -fsSL https://github.com/${{ github.repository }}/releases/latest/download/setup-gamescope-boot.sh | bash
+ curl -fsSL https://github.com/${{ github.repository }}/releases/latest/download/steamify.sh | bash
## Changes in v$VERSION
$changes"
- gh release create "v$VERSION" dist/setup-gamescope-boot.sh \
- --target "$GITHUB_SHA" --title "v$VERSION" --notes "$notes" --latest
+ gh release create "v$VERSION" dist/steamify.sh dist/setup-gamescope-boot.sh assets/steam-gaming-settings.svg \
+ --target "$GITHUB_SHA" --title "Steamify CachyOS v$VERSION" --notes "$notes" --latest
# "latest" follows the newest version tag, for the older install URL
# (.../releases/download/latest/...). Only moved when a new version
@@ -81,8 +86,8 @@ jobs:
git tag -f latest "$GITHUB_SHA" && git push -f origin latest
latest_notes="Always the newest version, currently v$VERSION (see its release for the changes)."
if gh release view latest >/dev/null 2>&1; then
- gh release edit latest --title "Latest (v$VERSION)" --notes "$latest_notes" --latest=false
+ gh release edit latest --title "Steamify CachyOS - latest (v$VERSION)" --notes "$latest_notes" --latest=false
else
- gh release create latest --title "Latest (v$VERSION)" --notes "$latest_notes" --latest=false
+ gh release create latest --title "Steamify CachyOS - latest (v$VERSION)" --notes "$latest_notes" --latest=false
fi
- gh release upload latest dist/setup-gamescope-boot.sh --clobber
+ gh release upload latest dist/steamify.sh dist/setup-gamescope-boot.sh assets/steam-gaming-settings.svg --clobber
diff --git a/AGENTS.md b/AGENTS.md
index 3094a4a..b37b470 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -5,14 +5,14 @@ for what the script does from a user's point of view.
## Project overview
-A bash wizard that makes CachyOS (KDE Plasma 6 + `plasma-login-manager`)
+**Steamify CachyOS**: a bash wizard that makes CachyOS (KDE Plasma 6 + `plasma-login-manager`)
boot into a SteamOS-style gamescope session, with working switching between
gamescope and the Plasma desktop. Primary target: the Valve Steam Machine
(DMI `Valve`/`Fremont`) running CachyOS Desktop edition.
## Layout
-- `setup-gamescope-boot.sh` - the only entry point. Pre-flight checks,
+- `steamify.sh` - the only entry point. Pre-flight checks,
sources `lib/*.sh`, runs the menu and applies the plan. No component
logic here.
- `lib/*.sh` - one file per responsibility, each defining functions only
@@ -59,7 +59,7 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine
- Comments explain *why* (the CachyOS/Plasma quirk being worked around),
not what the next line does.
-- **Versioning and releases.** SemVer in `VERSION` (`setup-gamescope-boot.sh`,
+- **Versioning and releases.** SemVer in `VERSION` (`steamify.sh`,
shown in the menu header and the bundle header).
- Every commit gets an entry in `CHANGELOG.md` under its version (short hash
+ subject; a commit can't contain its own hash, so fill it in with the
@@ -70,7 +70,7 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine
changelog section) and marks it latest. An existing version is never
overwritten: without a bump nothing is released, and pull requests show
a warning.
- - Users install through `releases/latest/download/setup-gamescope-boot.sh`
+ - Users install through `releases/latest/download/steamify.sh`
(GitHub's newest release). The `latest` tag and release follow the newest
version tag too (moved, asset replaced, when a new version is released),
so the older URL `releases/download/latest/...` keeps working.
@@ -149,6 +149,16 @@ gamescope and the Plasma desktop. Primary target: the Valve Steam Machine
- The entry point loops: menu, run, "back to the menu" (or `[m]`/`[r]` when a
restart is needed), until `q`; the restart question is asked once at the
end. Scripted input that runs out ends the loop like `q`.
+- Steamify shortcut (`launcher`): the icon runs `curl | bash` of
+ `releases/latest/download/steamify.sh` in Konsole, so it's
+ always the newest release. Its icon, `assets/steam-gaming-settings.svg`
+ (Valve's GPL-2.0 return icon with a gear), is a release asset too, and is
+ downloaded from there (Steam's icon if that fails). Desktop files are
+ written with their mode already set (`install_executable`): Plasma opens a
+ desktop icon it first saw non-executable in an editor.
+ The start script closes its window after a 10-second countdown on success
+ and waits for Enter after an error; it uses `pipefail`, or a failed
+ download would run an empty script and count as success.
- `Relogin=true` means a gamescope that fails to start is relaunched in a
tight loop; keep that in mind when changing session handling.
@@ -162,8 +172,8 @@ array (e.g. `g` in `lib/state.sh`), or CI's shellcheck on the bundle fails.
There is no test suite. At minimum:
```bash
-for f in setup-gamescope-boot.sh lib/*.sh; do bash -n "$f"; done
-shellcheck -S warning setup-gamescope-boot.sh lib/*.sh # if available
+for f in steamify.sh lib/*.sh; do bash -n "$f"; done
+shellcheck -S warning steamify.sh lib/*.sh # if available
```
Behaviour is verified in a CachyOS QEMU/KVM test VM. The VM scripts and a
@@ -172,5 +182,5 @@ the wizard with scripted menu input such as `printf '2\n\ny\nn\n'`, the
per-component checks; when stdin is not a terminal the menu falls back to a
numbered prompt, which is what scripted runs use, reboot checks, the full test matrix, `--fremont` to
fake Steam Machine hardware) live in
-[cachyos-gamescope-boot-dev-env](https://github.com/theupriser/cachyos-gamescope-boot-dev-env).
+[steamify-cachyos-dev](https://github.com/theupriser/steamify-cachyos-dev).
Gamescope itself and the real LED bar can only be verified on hardware.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 68ba3b0..21fba5f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,10 +2,43 @@
All notable changes, per version and per commit. Versions follow
[Semantic Versioning](https://semver.org/); the current one is `VERSION` in
-`setup-gamescope-boot.sh`. Versions before 0.7.0 were numbered afterwards,
+`steamify.sh`. Versions before 0.7.0 were numbered afterwards,
one per merged pull request.
-## 0.8.0 - 2026-09-24
+## 0.9.0 - 2026-09-24
+
+The wizard is now called **Steamify CachyOS**, and can put a shortcut to
+itself on the desktop.
+
+- `f01aa93` **feat: Wizard shortcut on the desktop and in the launcher**
+ - New menu item: a desktop icon and app launcher entry
+ that open the newest release of the wizard in Konsole (`curl | bash`).
+ - Its icon: Valve's Return to Gaming Mode icon with a gear instead of the
+ arrow (`assets/steam-gaming-settings.svg`), published with every release
+ and downloaded from there.
+ - Desktop files are written already executable, so Plasma runs them instead
+ of opening them in an editor.
+- `be874b8` **feat: Rename to Steamify CachyOS**
+ - Menu header, the shortcut ("Steamify CachyOS", menu item "Steamify
+ shortcut"), release titles, README and AGENTS.md.
+- `1c34a97` **chore: Repository renamed to steamify-cachyos**
+ - All URLs point to `github.com/theupriser/steamify-cachyos` (the old ones
+ redirect). The script keeps its name, `setup-gamescope-boot.sh`, so the
+ old download URL keeps working; internal names such as
+ `~/.local/state/cachyos-gamescope-boot` stay, so existing installs can
+ still be turned off.
+- `69a420b` **feat: The script is now steamify.sh**
+ - `setup-gamescope-boot.sh` is renamed to `steamify.sh`; releases publish the
+ bundle under both names, so `.../download/setup-gamescope-boot.sh` keeps
+ working. The Steamify shortcut runs `steamify.sh`.
+- `b0553ae` **docs: Shorter README intro**
+- **feat: The shortcut's window closes itself after a countdown**
+ - After the wizard ends, a 10-second countdown closes the Konsole window
+ (Enter closes it right away); after an error it stays open until Enter.
+ - A failed download now counts as an error (`pipefail`) instead of running
+ an empty script.
+
+## 0.8.0 - 2026-09-24 (#8)
An opt-in BIOS update for the Steam Machine, and a menu that comes back after
every run.
@@ -40,7 +73,7 @@ every run.
- "now F7F0107, newest F7F0108 (own risk)", "F7F0108 waits for a restart",
"F7F0107 is up to date"; shorter dry-run line.
- `99a95ab` **fix: Kernel legend only mentions the LEDs on a Steam Machine**
-- **docs: Last commit hash in the changelog; 0.7.0 was released on its own (#6, #7)**
+- `c0014ee` **docs: Last commit hash in the changelog; 0.7.0 was released on its own (#6, #7)**
## 0.7.0 - 2026-09-24 (#6, #7)
diff --git a/README.md b/README.md
index 87e49f7..8f880b3 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,10 @@
-# CachyOS Gamescope Boot Wizard
+# Steamify CachyOS
Turn a CachyOS desktop PC into a SteamOS-style console: it boots straight
into Steam's Big Picture (gamescope), and you can switch to the KDE Plasma
desktop and back whenever you like - just like on a Steam Deck or Valve's
Steam Machine.
-Out of the box, CachyOS doesn't quite manage this: the switch to the desktop
-can hang, and the PC doesn't reliably boot back into gaming mode. This
-script fixes that and sets everything up for you.
-
## What you get
The wizard is a menu: pick what you want, and it turns each part on or off.
@@ -24,10 +20,13 @@ Everything you turn off is put back the way it was.
4. **Single user mode** - like SteamOS: never a login or lock screen, no
user switching or logging out. Typing a password with a controller is no
fun. (Needs 1.)
-5. **Steam Machine support** - only shown on a Valve Steam Machine: the
+5. **Steamify shortcut** - a "Steamify CachyOS" icon on the desktop and in
+ the app launcher (the Steam logo with a gear) that opens the newest version
+ of Steamify in Konsole, so you don't need the install command again.
+6. **Steam Machine support** - only shown on a Valve Steam Machine: the
driver for the front LED bar, and the hardware settings in Steam (fan,
TV control over HDMI-CEC).
-6. **Update BIOS** - only on a Steam Machine, opt-in and at your own risk:
+7. **Update BIOS** - only on a Steam Machine, opt-in and at your own risk:
installs the newest Steam Machine BIOS from Valve (see
[BIOS updates](#bios-updates-steam-machine)).
@@ -41,17 +40,19 @@ Everything you turn off is put back the way it was.
Open **Konsole** on your Plasma desktop and run:
```bash
-curl -fsSL https://github.com/theupriser/cachyos-gamescope-boot/releases/latest/download/setup-gamescope-boot.sh | bash
+curl -fsSL https://github.com/theupriser/steamify-cachyos/releases/latest/download/steamify.sh | bash
```
-That downloads and runs the latest single-file version, and works in any
+(Before 0.9.0 the script was called `setup-gamescope-boot.sh`; that name
+still works in the download URL.) That downloads and runs the latest
+single-file version, and works in any
shell, including fish (CachyOS's default). Prefer to keep a copy, or to look
at the script first? Clone the repository instead:
```bash
-git clone https://github.com/theupriser/cachyos-gamescope-boot.git
-cd cachyos-gamescope-boot
-./setup-gamescope-boot.sh
+git clone https://github.com/theupriser/steamify-cachyos.git
+cd steamify-cachyos
+./steamify.sh
```
Run it as yourself, not as root. You'll see a checklist:
@@ -348,7 +349,7 @@ gamescope-session, ...) stay installed.
| File | Responsibility |
|---|---|
-| `setup-gamescope-boot.sh` | Entry point: checks, menu, apply, summary, restart |
+| `steamify.sh` | Entry point: checks, menu, apply, summary, restart |
| `lib/menu.sh` | The menu: detect, toggle, plan and apply changes |
| `lib/state.sh` | Undo journal for KDE settings (`kset`/`krevert`) |
| `lib/common.sh` | Output helpers, prompts, backups, plasmashell handling |
@@ -359,9 +360,10 @@ gamescope-session, ...) stay installed.
| `lib/vapor-theme.sh` | SteamOS theme: installs and switches to `cachyos-vapor` |
| `lib/steamos-extras.sh` | SteamOS desktop extras from Valve's package (Add to Steam, Nested Desktop, icon, keyboard rule, KWallet) |
| `lib/single-user.sh` | Single user mode: no lock screen, user switching or log out |
+| `lib/wizard-shortcut.sh` | Steamify shortcut: desktop icon and launcher entry that run the newest release |
| `lib/bios.sh` | Update BIOS (Steam Machine, opt-in): current/newest version, double confirmation, fwupd |
| `lib/steam-machine.sh` | Steam Machine support: LED driver, LED access, steamos-manager |
-| `.github/tools/bundle.sh` | Builds the single-file version (`dist/setup-gamescope-boot.sh`) |
+| `.github/tools/bundle.sh` | Builds the single-file version (`dist/steamify.sh`) |
| `.github/workflows/bundle.yml` | Builds and checks it on every push; publishes it on `main` |
The single-file version is generated: on every push to `main`, GitHub
diff --git a/assets/steam-gaming-settings.svg b/assets/steam-gaming-settings.svg
new file mode 100644
index 0000000..e0b94de
--- /dev/null
+++ b/assets/steam-gaming-settings.svg
@@ -0,0 +1,224 @@
+
+
+
diff --git a/lib/bios.sh b/lib/bios.sh
index 6889553..fc78057 100644
--- a/lib/bios.sh
+++ b/lib/bios.sh
@@ -3,7 +3,7 @@
# the newest Steam Machine BIOS from Valve's fremont-hw-support package with
# fwupd. It's an action, not an on/off component: never preselected, never
# re-applied, and there is nothing to turn off afterwards.
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
BIOS_REPO_PREFIX=holo
# WIZARD_BIOS_DRY_RUN=1 walks through the whole BIOS update (download,
diff --git a/lib/common.sh b/lib/common.sh
index c5701ec..4ad8495 100644
--- a/lib/common.sh
+++ b/lib/common.sh
@@ -1,6 +1,6 @@
#!/bin/bash
# Output helpers, prompts and small shared utilities.
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
c_reset="\033[0m"; c_bold="\033[1m"; c_green="\033[32m"; c_yellow="\033[33m"; c_red="\033[31m"; c_cyan="\033[36m"; c_dim="\033[2m"
diff --git a/lib/desktop-shortcut.sh b/lib/desktop-shortcut.sh
index b96bf8a..1779418 100644
--- a/lib/desktop-shortcut.sh
+++ b/lib/desktop-shortcut.sh
@@ -1,6 +1,6 @@
#!/bin/bash
# "Return to Gaming Mode" desktop shortcut and the sudoers rule it needs.
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
create_desktop_shortcut() {
# Determine the home directory of the target user
diff --git a/lib/login-manager.sh b/lib/login-manager.sh
index 6918f0a..ad81b51 100644
--- a/lib/login-manager.sh
+++ b/lib/login-manager.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Booting into gaming mode: autologin into gamescope with SDDM or
# plasma-login-manager (plus the session sync bridge the latter needs).
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
BASE_CONF="/etc/plasmalogin.conf"
diff --git a/lib/menu.sh b/lib/menu.sh
index 5c4b842..ab45c60 100644
--- a/lib/menu.sh
+++ b/lib/menu.sh
@@ -1,11 +1,11 @@
#!/bin/bash
# Interactive menu: detects which components are on, lets the user pick what
# they want, then turns components on or off to match.
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
# Menu order. Components are turned on in this order and off in reverse;
# gaming must come first (single user builds on it).
-COMPONENTS=(gaming theme glyphs single machine bios)
+COMPONENTS=(gaming theme glyphs single launcher machine bios)
# One-off actions rather than on/off components: never preselected, never
# re-applied, not listed as on or off.
ACTIONS=(bios)
@@ -15,6 +15,7 @@ declare -A LABEL=(
[theme]="Install SteamOS theme: Vapor look (cachyos-vapor)"
[glyphs]="Install Steam Deck/Machine icons: Deck button icons in gaming mode"
[single]="Single user mode: no password, lock screen or log out (SDDM)"
+ [launcher]="Steamify shortcut: desktop icon to run this again"
[machine]="Steam Machine support: LED bar driver, hardware settings in Steam"
[bios]="Update BIOS"
)
@@ -103,7 +104,7 @@ run_menu() {
draw_menu_tui() {
local cursor="$1" i=0 c box state line
printf '\033[H\033[2J'
- echo -e "${c_bold}CachyOS Steam Deck-style Gamescope Boot Wizard${c_reset} v$VERSION"
+ echo -e "${c_bold}Steamify CachyOS${c_reset} v$VERSION"
echo "Pick what you want. Anything you untick is put back the way it was."
echo
MENU_ITEMS=()
diff --git a/lib/packages.sh b/lib/packages.sh
index 5e45478..e1e2ae8 100644
--- a/lib/packages.sh
+++ b/lib/packages.sh
@@ -1,6 +1,6 @@
#!/bin/bash
# Required packages and AUR helper handling.
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
aur_noninteractive_flags() {
# Fully non-interactive install flags for the given AUR helper: no
diff --git a/lib/single-user.sh b/lib/single-user.sh
index 8a3ac8e..7be65db 100644
--- a/lib/single-user.sh
+++ b/lib/single-user.sh
@@ -3,7 +3,7 @@
# log out, since typing a password with a controller is miserable. Goes
# together with SDDM (see lib/login-manager.sh). All changes are journaled
# per user (lib/state.sh), so turning it off restores KDE's previous state.
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
single_status() {
[[ "$(kreadconfig6 --file kdeglobals --group "KDE Action Restrictions" --key action/lock_screen)" == false ]]
diff --git a/lib/state.sh b/lib/state.sh
index deaa4a4..1e87097 100644
--- a/lib/state.sh
+++ b/lib/state.sh
@@ -3,7 +3,7 @@
# off again exactly: the first time a component changes a key, the key's
# previous value is recorded, and reverting the component puts it back (or
# deletes the key if it didn't exist before).
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
STATE_DIR="${XDG_STATE_HOME:-$HOME/.local/state}/cachyos-gamescope-boot"
UNSET=$'\x01'
diff --git a/lib/steam-desktop.sh b/lib/steam-desktop.sh
index a032768..5284c73 100644
--- a/lib/steam-desktop.sh
+++ b/lib/steam-desktop.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# Steam in the Plasma desktop session: gamepad UI args, virtual keyboard,
# autostart. Part of the SteamOS conversion (gaming_enable/gaming_disable).
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
steam_enable() {
info "Applying non-optional SteamOS environment & keyboard fixes..."
diff --git a/lib/steam-machine.sh b/lib/steam-machine.sh
index d82c56d..58323e9 100644
--- a/lib/steam-machine.sh
+++ b/lib/steam-machine.sh
@@ -1,7 +1,7 @@
#!/bin/bash
# "Steam Machine support" menu item, only on Valve Fremont hardware: the
# front LED bar driver, LED access for Steam, and steamos-manager.
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
detect_valve_fremont() {
# Valve Steam Machine (Fremont) boards. The leds-valve driver's own DMI
diff --git a/lib/steamos-extras.sh b/lib/steamos-extras.sh
index 5f3d836..5e75205 100644
--- a/lib/steamos-extras.sh
+++ b/lib/steamos-extras.sh
@@ -6,7 +6,7 @@
# rule and an empty KWallet. Part of the SteamOS theme component
# (lib/vapor-theme.sh). System files go to /usr/local (nothing
# package-owned); per-user settings go through the undo journal.
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
VALVE_MIRROR="https://steamdeck-packages.steamos.cloud/archlinux-mirror"
NESTED_DIR=/usr/local/share/applications/steam/holo-nested-desktop
diff --git a/lib/vapor-theme.sh b/lib/vapor-theme.sh
index ae6d4b8..45e7c7e 100644
--- a/lib/vapor-theme.sh
+++ b/lib/vapor-theme.sh
@@ -1,6 +1,6 @@
#!/bin/bash
# SteamOS Vapor desktop theme, from CachyOS's cachyos-vapor package.
-# Sourced by setup-gamescope-boot.sh; not meant to be run on its own.
+# Sourced by steamify.sh; not meant to be run on its own.
VAPOR_LOOKANDFEEL=com.valve.vapor.desktop
VAPOR_DEFAULTS=/usr/share/plasma/look-and-feel/$VAPOR_LOOKANDFEEL/contents/defaults
diff --git a/lib/wizard-shortcut.sh b/lib/wizard-shortcut.sh
new file mode 100644
index 0000000..6a3a9fd
--- /dev/null
+++ b/lib/wizard-shortcut.sh
@@ -0,0 +1,90 @@
+#!/bin/bash
+# "Steamify shortcut" menu item: a desktop icon and an app launcher entry that
+# open the newest release of Steamify CachyOS in Konsole (curl | bash, like the
+# install command in the README), so it's never out of date.
+# Sourced by steamify.sh; not meant to be run on its own.
+
+WIZARD_RELEASE="https://github.com/theupriser/steamify-cachyos/releases/latest/download"
+WIZARD_URL="$WIZARD_RELEASE/steamify.sh"
+# Steam logo with a gear (assets/ in the repo, published with every release).
+WIZARD_ICON="${XDG_DATA_HOME:-$HOME/.local/share}/icons/hicolor/scalable/apps/cachyos-gamescope-boot-wizard.svg"
+WIZARD_LAUNCHER="${XDG_DATA_HOME:-$HOME/.local/share}/cachyos-gamescope-boot/run-wizard"
+WIZARD_DESKTOP_NAME="cachyos-gamescope-boot-wizard.desktop"
+WIZARD_APP_ENTRY="${XDG_DATA_HOME:-$HOME/.local/share}/applications/$WIZARD_DESKTOP_NAME"
+
+wizard_desktop_file() {
+ echo "$(xdg-user-dir DESKTOP 2>/dev/null || echo "$HOME/Desktop")/$WIZARD_DESKTOP_NAME"
+}
+
+install_executable() {
+ # install_executable : stdin to , with its mode set
+ # before it appears. Plasma treats a desktop icon it saw while it wasn't
+ # executable yet as untrusted and opens it in an editor.
+ local dest="$1" tmp
+ mkdir -p "$(dirname "$dest")"
+ tmp="$(mktemp "$(dirname "$dest")/.tmp.XXXXXX")"
+ cat > "$tmp"
+ chmod "$2" "$tmp"
+ mv -f "$tmp" "$dest"
+}
+
+launcher_status() {
+ [[ -x "$WIZARD_LAUNCHER" && -f "$WIZARD_APP_ENTRY" ]]
+}
+
+launcher_enable() {
+ info "Adding the Steamify shortcut (desktop icon and app launcher entry)..."
+ install_executable "$WIZARD_LAUNCHER" 755 << EOF
+#!/bin/bash
+# Installed by Steamify CachyOS: run its newest release.
+# pipefail: a failed download must count as a failure, not an empty script.
+set -o pipefail
+if ! curl -fsSL --max-time 30 "$WIZARD_URL" | bash; then
+ echo
+ echo "Couldn't download or run the wizard. Are you connected to the internet?"
+ echo
+ read -rp "Press Enter to close this window... " _
+ exit 1
+fi
+# Done: close the window after a countdown (Enter closes it right away).
+echo
+for (( i = 10; i > 0; i-- )); do
+ printf '\rClosing this window in %2d seconds (Enter to close now)... ' "\$i"
+ read -rs -t 1 _ && break
+done
+echo
+EOF
+
+ # The icon comes with the release; without it, Steam's own icon.
+ local icon=steam tmp
+ tmp="$(mktemp)"
+ if curl -fsSL --max-time 20 "$WIZARD_RELEASE/steam-gaming-settings.svg" -o "$tmp" && grep -q '