Author SHA1 Message Date
theupriser 1a8c75721a Merge pull request #25 from theupriser/feature/silent-steam-start
Sync git.upriser.nl mirror / sync (push) Skipped
feat: Steamify page: Start Steam silently, the icons under the conversion; steamify.nodownload
2026-10-02 14:11:20 +02:00
theupriser d70b238a06 docs: TODO: steamify.nodownload keeps the ISO's own Steamify (live session and first login)
Sync git.upriser.nl mirror / sync (push) Skipped
2026-10-02 14:06:44 +02:00
theupriser 0756626700 feat: steamify-install passes steamify.nodownload on to the installed system (its first login keeps the ISO's Steamify)
Sync git.upriser.nl mirror / sync (push) Skipped
2026-10-02 11:11:20 +02:00
theupriser 564f2a8dcd feat: Steamify page: the silent option is called "in desktop mode" in the fallback rows, and is no longer tied to Boot into
Sync git.upriser.nl mirror / sync (push) Skipped
2026-10-02 09:10:28 +02:00
theupriser 084b68d109 feat: steamify.nodownload (kernel command line) or STEAMIFY_NO_DOWNLOAD keeps the ISO's own Steamify instead of the newest release
Sync git.upriser.nl mirror / sync (push) Skipped
2026-10-02 08:33:43 +02:00
theupriser 7ee32f926b feat: Steamify page: Start Steam silently option (needs/hideWhen rules from --defaults --list)
Sync git.upriser.nl mirror / sync (push) Skipped
2026-10-02 07:37:13 +02:00
theupriser 46fa044ffb Merge pull request #24 from theupriser/docs/iso-todo-2
Sync git.upriser.nl mirror / sync (push) Skipped
docs: TODO: tick off what is done, say what is left
2026-10-01 15:36:08 +02:00
theupriser 05d2e2632d docs: remove the hand-written Steamify section of CHANGELOG.md (the release notes are generated), TODO updated
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 13:58:19 +02:00
theupriser 556f962a6f docs: TODO: the same-day replacement of a real release is proven by the official 2.9.6 build
Sync git.upriser.nl mirror / sync (push) Skipped
2026-09-30 13:56:56 +02:00
theupriser 8b1241af9d docs: TODO: retention code and the release notes filter done, names and badge items say what was already seen 2026-09-30 13:53:43 +02:00
6 changed files with 33 additions and 57 deletions

No files matched your search

-40
View File
@@ -26,46 +26,6 @@
* Correctly handle VM environments
* Correctly quote pacman arguments
## CachyOS with Steamify Live ISO
CachyOS 26.08 with Steamify built in: install CachyOS and turn the PC into a Steam Machine in one go.
Its version is the Steamify version on it plus the build date and time (UTC, when the release starts on GitHub; a release on `master` is `v<Steamify version>-<date>-<HHMM>`, e.g. `v2.9.3-2026.09.29-2015`). A new Steamify release starts one (a test build for now); by hand: Run workflow on "ISO 1/2 · Tag and release (GitHub)".
Releases: GitHub creates the tag and a release with the notes; the ISO itself (over GitHub's 2 GB limit) is built on the Gitea mirror and attached to its release for that tag (git.upriser.nl).
**Features:**
* **ISO:** named after its release tag (`steamify-cachyos-2.9.3-2026.09.29-2030-x86_64.iso`; built by hand, without a tag: `local`), labelled after the Steamify version on it and the build time (`STEAMIFY_2_9_1_20260929_1432`, was CachyOS's `COS_<year><month>`); CachyOS Hello installs it like CachyOS's own
release (the ISO's own release, its tag without the v, is in `/etc/steammachine-iso-build` and the boot menu)
* **Installer (CachyOS - Steamify Installer):**
* A Steamify page after the packages page: which Steam Machine parts to set up (rows from
`steamify.sh --defaults --list`, the newest Steamify fetched before Calamares starts) and where
the PC starts (gaming mode or the desktop)
* The Summary lists every chosen item and where the PC starts
* The new user's Steam Machine setup runs during the install (`steamify-install`, a Calamares step
before cleanup): the first boot is already a Steam Machine
* Only what Steamify supports is offered: KDE Plasma, and the boot loaders Limine, systemd-boot and
GRUB (not rEFInd)
* **Live session:** keeps CachyOS's own name; the power-off fix is built for the ISO's kernels, and
the login has the Vapor look
**Fixes:**
* **systemd-boot:** the installed system gets its "Linux Boot Manager" EFI boot entry, first in the
boot order. cachyos-installer runs `bootctl install` in a chroot, where bootctl leaves the EFI
variables alone, so the entry was missing: the PC could only boot through the disk's fallback path
(`\EFI\BOOT\BOOTX64.EFI`). Most PCs find it early and boot normally, but firmware that tries the
network first waits minutes on every boot (QEMU/OVMF: PXE, HTTP boot and the EFI shell come first),
and anything else that writes the fallback file (another OS) takes the boot over.
`steamify-install` now registers it with `efibootmgr` from the live system, with the ESP's real
disk and partition (bootctl in the chroot writes an entry without a partition, which the firmware
can't load); the output is in `/var/log/steamify-bootentry.log`
* **Installer:** Steamify's install-time logs (`/var/log/steamify-install.log`,
`steamify-bootentry.log`) are readable after the first boot: `/var/log` is its own btrfs subvolume
(`@log`) that wasn't mounted yet when Steamify ran, so they ended up hidden under it
* **Installer:** Steamify's setup never asks for a password (its sudo rule is read after CachyOS's
`%wheel` rule); Calamares starts with the Boost version it was linked against
* **Build:** finishes cleanly as root and reports no error after a successful build; the Steamify page's
Calamares module is built with the ISO and left out when Calamares' version differs
# 26.07
**Features:**
+15 -11
View File
@@ -11,18 +11,14 @@ Tick items off as they are done; the newest entries are at the top of each list.
Still to do: a Python job (e.g. `steamifychoice`, before `packages@online`) that normalizes either page's choice
(`packagechooser_steamifypage` GS key, or netinstall's packageOperations markers) into one `steamifyChoice`
GS key, so `shellprocess_steamify.conf` doesn't need to know which page ran.
- [ ] **Check the names after the next build**: the installer title, Hello and About this System say CachyOS (only the
- [ ] **Names, the live session**: the installed system's names were checked (2026-09-30: `os-release` and `lsb-release` are
CachyOS's, test B3). Still to look at: the installer title, Hello and About this System in the live session (only the
installer says Steamify).
- [ ] **Test on the real Steam Machine** from a USB stick (gamescope, LEDs, CEC, power-off) before calling the ISO usable.
- [ ] **Retention** (PR #22, at most 10 dev + 10 real releases, deleting the mirror's release with the ISO too): watch it
the first time there are more than 10 releases of a kind; until then it is untested.
- [ ] **Build badge**: the failed and cancelled states, and a build that is superseded by a newer one, haven't been seen
yet (only succeeded). A crashed runner leaves the badge on "running".
- [ ] **Same-day replacement on the mirror** of a real release (second `kind=release` build of one day): check that the
mirror's release gets the new ISO (new asset id) and notes.
- [ ] **CHANGELOG.md**: the hand-written section `## CachyOS with Steamify Live ISO` is no longer used (the release notes
are generated); delete it or turn it into something else.
- [ ] **Release notes**: the list of ISO changes is raw commit subjects (ci/docs left out); maybe filter or group them.
- [ ] **Retention, first clean-up**: the code is merged (PR #22: at most 10 dev + 10 real releases, the mirror's release with
its ISO is deleted first). Watch the first time there are more than 10 releases of a kind; it hasn't run yet.
- [ ] **Build badge, the other states**: succeeded was seen (`v2.9.6-260930`). Failed, cancelled and a build superseded by a
newer one haven't been seen; a crashed runner leaves the badge on "running".
- [ ] **Check with the CachyOS team** whether the installer branding and the ISO file name are fine with them.
- [ ] **Drop the Boost 1.91 workaround** in `steamify-prepare.sh` once `cachyos-calamares-next` is rebuilt against the repos' Boost.
@@ -36,13 +32,21 @@ Tick items off as they are done; the newest entries are at the top of each list.
- [x] **Always from `master`**: `iso-1-github-tag.yml` takes `kind` (release, dev, auto); steamify-cachyos' `bundle.yml` asks
for `release` (a version published from main) or `dev` (an unreleased version on a release branch).
- [x] **`steamify_ref`**: a release branch builds its dev ISO with its own Steamify (and VERSION) before it is released.
- [x] **`steamify.nodownload`** (kernel command line) or `STEAMIFY_NO_DOWNLOAD=1`: the live session keeps the ISO's own Steamify
(`calamares-online.sh` would replace it by the newest release), and `steamify-install` passes it on, so the installed system's
first login runs the ISO's bundle too. For testing an unreleased Steamify; tested with Steamify 2.11.0 (three installs).
- [x] **The mirror's build is started by dispatch** after the mirror has the new tag object (a replaced tag starts no run by
itself; the dispatch needs the full ref `refs/tags/<tag>`).
- [x] **Build badge** in the GitHub release: running, then succeeded / failed / cancelled (secret `GH_RELEASE_TOKEN` on the
mirror), linked to the public Gitea run.
- [x] **Generated release notes** and title (`CachyOS <base> with Steamify <version> (<date> UTC)`): base version, Steamify's
changelog section, commits since the previous release; the mirror's release uses the same text.
- [x] **Retention** of at most 10 dev and 10 real releases (PR #22 also deletes the mirror's release with its ISO).
- [x] **Retention** of at most 10 dev and 10 real releases, deleting the mirror's release with its ISO too (PR #22; first
clean-up still to be seen, above).
- [x] **Old hand-written `CHANGELOG.md` section** (`## CachyOS with Steamify Live ISO`) removed: the release notes are generated.
- [x] **Same-day replacement of a real release** (2026-09-30): the official build for `v2.9.6-260930` replaced the test build's
release on the mirror (ISO asset 42 -> 50, new title and generated notes, badge green with the public run link).
- [x] **Release notes** leave out the workflow and docs commits (`ci`, `docs`, `…(ci):`) in their list of ISO changes.
- [x] **The ISO is built on the Gitea mirror's runner** (`iso-2-gitea-build.yml`) and hosted there (over GitHub's 2 GB limit);
the VM tests run locally (`scripts/vmtest.sh --install` in steamify-cachyos-dev), not on the runners.
- [x] **Build in the test VM instead of on the Steam Machine**: superseded by the runner above.
@@ -69,14 +69,18 @@ EOF
# any, so "$sdir" would still be empty in the same one.
local sdir=/usr/local/share/steamify
local sbin="$sdir/steamify.sh" sqml="$sdir/qml"
# STEAMIFY_NO_DOWNLOAD=1 or `steamify.nodownload` on the kernel command line: keep the ISO's own
# copy, e.g. to test an unreleased Steamify (the newest release would replace it).
local nodl=
if [[ -n "${STEAMIFY_NO_DOWNLOAD:-}" ]] || grep -qw steamify.nodownload /proc/cmdline; then nodl=1; fi
local tmp; tmp="$(mktemp)"
if curl -fsSL --max-time 20 https://github.com/theupriser/steamify-cachyos/releases/latest/download/steamify.sh -o "$tmp" &&
if [[ -z "$nodl" ]] && curl -fsSL --max-time 20 https://github.com/theupriser/steamify-cachyos/releases/latest/download/steamify.sh -o "$tmp" &&
grep -q -- '--defaults' "$tmp"; then
sudo install -Dm755 "$tmp" "$sbin"
fi
rm -f "$tmp"
tmp="$(mktemp -d)"
if curl -fsSL --max-time 20 https://github.com/theupriser/steamify-cachyos/releases/latest/download/steamify-app.tar.gz |
if [[ -z "$nodl" ]] && curl -fsSL --max-time 20 https://github.com/theupriser/steamify-cachyos/releases/latest/download/steamify-app.tar.gz |
tar -xz -C "$tmp" --strip-components=2 ui/qml/Theme.qml ui/qml/Texts.qml 2>/dev/null; then
sudo cp "$tmp/Theme.qml" "$tmp/Texts.qml" "$sqml/"
fi
@@ -54,8 +54,12 @@ rule="$root/etc/sudoers.d/zz-steamify-install"
install -Dm755 /usr/local/share/steamify/steamify.sh "$root/var/tmp/steamify.sh"
printf '%s ALL=(ALL) NOPASSWD: ALL\n' "$user" > "$rule"
chmod 440 "$rule"
# steamify.nodownload on the live system's kernel command line (or STEAMIFY_NO_DOWNLOAD): the installed system
# keeps this ISO's Steamify at its first login too, instead of the newest release.
nodl=()
if [[ -n "${STEAMIFY_NO_DOWNLOAD:-}" ]] || grep -qw steamify.nodownload /proc/cmdline; then nodl=(STEAMIFY_NO_DOWNLOAD=1); fi
arch-chroot "$root" runuser -u "$user" -- env -i HOME="/home/$user" USER="$user" LOGNAME="$user" \
PATH=/usr/local/bin:/usr/bin TERM=dumb LANG=C.UTF-8 \
PATH=/usr/local/bin:/usr/bin TERM=dumb LANG=C.UTF-8 "${nodl[@]}" \
bash -c 'cd ~ && bash /var/tmp/steamify.sh --defaults --options "$0" --boot "$1" < /dev/null' "$options" "$boot" > "$log" 2>&1
echo "exit: $?" >> "$log"
rm -f "$rule" "$root/var/tmp/steamify.sh"
@@ -8,6 +8,7 @@ QtObject {
readonly property var rows: [
{ id: "gaming", label: "SteamOS conversion", hint: "boot into gaming mode, Steam on the desktop", kind: "toggle", parent: "", on: true, selectable: true },
{ id: "boot", label: "Boot into", hint: "", kind: "choice", parent: "gaming", on: false, selectable: true },
{ id: "silent", label: "Start Steam silently in desktop mode", hint: "in the tray at login on the desktop, no window", kind: "toggle", parent: "gaming", needs: "", on: true, selectable: true },
{ id: "theme", label: "Install SteamOS theme", hint: "Vapor look (cachyos-vapor)", kind: "toggle", parent: "", on: true, selectable: true },
{ id: "glyphs", label: "Install Steam Deck/Machine icons", hint: "Deck button icons in gaming mode", kind: "toggle", parent: "", on: true, selectable: true },
{ id: "single", label: "Single user mode", hint: "no password, lock screen or log out (SDDM)", kind: "toggle", parent: "", on: true, selectable: true },
@@ -35,7 +35,9 @@ Item {
function label(r) { return (Texts.items[r.id] || {}).label || r.label; }
function hint(r) { return (Texts.items[r.id] || {}).hint || r.hint; }
function shown(r) { return !r.parent || !!want[r.parent]; }
// `needs: "boot"` (an older Steamify's --defaults --list): only with Boot into Desktop.
function shown(r) { return (!r.parent || !!want[r.parent]) && (r.needs !== "boot" || boot === "desktop") &&
!(r.hideWhen && want[r.hideWhen]); }
// Steamify's own rules: a sub-option needs its parent (turning a parent
// off turns its sub-options off); single user mode needs the conversion.
@@ -46,7 +48,8 @@ Item {
var r = rows[i];
if (w[id] && r.id === id && r.parent) w[r.parent] = true;
if (!w[id] && r.parent === id && r.kind === "toggle") w[r.id] = false;
if (w[id] && r.parent === id && r.kind === "toggle") w[r.id] = true; // opt-out sub-options
if (w[id] && r.parent === id && r.kind === "toggle") w[r.id] = !(r.hideWhen && w[r.hideWhen]); // opt-out sub-options
if (w[id] && r.hideWhen === id) w[r.id] = false; // Big Picture and a silent start exclude each other
}
if (id === "single" && w.single) w.gaming = true;
if (id === "gaming" && !w.gaming) { w.single = false; boot = "gamescope"; }
@@ -56,7 +59,7 @@ Item {
function choice() {
var on = [];
for (var i = 0; i < rows.length; i++)
if (rows[i].kind === "toggle" && want[rows[i].id]) on.push(rows[i].id);
if (rows[i].kind === "toggle" && want[rows[i].id] && shown(rows[i])) on.push(rows[i].id);
if (want.gaming && boot === "desktop") on.push("boot");
// ", " (not ","): Calamares' packagechooser Summary step shows this
// value raw ("Install option: <value>"); steamify-install still