From 659f193ac25dbe3ac1150149b7c604f7ca536900 Mon Sep 17 00:00:00 2001 From: QuicksilverSlick Date: Mon, 28 Sep 2026 08:46:45 -0500 Subject: [PATCH 1/2] feat(release): say plainly which file to download, one version per page The release page now opens with a table: Windows PC, Mac with an Apple chip, Mac with an Intel chip, each linking its exact file, plus how to tell which Mac you have and step-by-step install for both. The text lives in scripts/dreamforge-release-notes.md; the publish job fills in the version and links, sets the title to "Dreamforge ", rewrites the notes on every publish, and after latest.json is uploaded removes the previous version's files so the page only ever shows one set. Co-Authored-By: Claude Opus 5.5 --- .../workflows/dreamforge-desktop-release.yml | 24 ++++++++++------- scripts/dreamforge-release-notes.md | 27 +++++++++++++++++++ 2 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 scripts/dreamforge-release-notes.md diff --git a/.github/workflows/dreamforge-desktop-release.yml b/.github/workflows/dreamforge-desktop-release.yml index 36d43dc9a80..d09ba97c851 100644 --- a/.github/workflows/dreamforge-desktop-release.yml +++ b/.github/workflows/dreamforge-desktop-release.yml @@ -286,17 +286,21 @@ jobs: cat latest.json - name: Upload to the rolling release - env: - NOTES: | - Dreamforge desktop installers. Take the newest version number. - - **Windows:** download `Dreamforge__x64-setup.exe` and run it. If SmartScreen says "Windows protected your PC", click **More info**, then **Run anyway**. - - **Mac:** download the DMG for your chip (`aarch64` for Apple Silicon, `x64` for Intel), open it and drag Dreamforge to Applications. The first launch is blocked because the app is not notarized: open **System Settings**, **Privacy & Security**, and click **Open Anyway**. - - Installed apps update themselves from `latest.json` here. run: | - gh release view "$TAG" > /dev/null 2>&1 || gh release create "$TAG" --target "$GITHUB_SHA" --title "Dreamforge desktop" --notes "$NOTES" + BASE="https://github.com/$GH_REPO/releases/download/$TAG" + # VERSION is plain x.y.z here: "Write latest.json" refused anything else. + sed -e "s/{VERSION}/$VERSION/g" -e "s#{BASE}#$BASE#g" scripts/dreamforge-release-notes.md > notes.md + ! grep -q '[{}]' notes.md || { echo "::error::unfilled placeholder in the release notes"; exit 1; } + gh release view "$TAG" > /dev/null 2>&1 || gh release create "$TAG" --target "$GITHUB_SHA" --title "Dreamforge $VERSION" --notes-file notes.md gh release upload "$TAG" dist/*.dmg dist/*.app.tar.gz dist/*.exe dist/*.sig --clobber # latest.json last, so apps only see the new version once every file it names is uploaded. gh release upload "$TAG" latest.json --clobber + gh release edit "$TAG" --title "Dreamforge $VERSION" --notes-file notes.md + # Remove the previous version's files: latest.json no longer names them, + # and a single set keeps "which file is mine" obvious on the page. + gh release view "$TAG" --json assets --jq '.assets[].name' | while read -r name; do + case "$name" in + latest.json|*"_${VERSION}_"*) ;; + *) gh release delete-asset "$TAG" "$name" --yes ;; + esac + done diff --git a/scripts/dreamforge-release-notes.md b/scripts/dreamforge-release-notes.md new file mode 100644 index 00000000000..7eee593df17 --- /dev/null +++ b/scripts/dreamforge-release-notes.md @@ -0,0 +1,27 @@ +## Download Dreamforge {VERSION} + +Pick the one line that matches your computer and click its file. You only download from this page once: after that, Dreamforge updates itself. + +| Your computer | Click this file | +|---|---| +| **Windows PC** | [Dreamforge_{VERSION}_x64-setup.exe]({BASE}/Dreamforge_{VERSION}_x64-setup.exe) | +| **Mac with an Apple chip** (M1, M2, M3, M4 or newer; most Macs from late 2020 on) | [Dreamforge_{VERSION}_aarch64.dmg]({BASE}/Dreamforge_{VERSION}_aarch64.dmg) | +| **Mac with an Intel chip** (older Macs) | [Dreamforge_{VERSION}_x64.dmg]({BASE}/Dreamforge_{VERSION}_x64.dmg) | + +**Not sure which Mac you have?** Click the Apple menu in the top-left corner, then **About This Mac**. If it says **Chip: Apple M1** (or M2, M3, M4), take the Apple chip file. If it says **Processor: Intel**, take the Intel file. + +### Install on Windows + +1. Open the downloaded file. +2. If Windows says "Windows protected your PC", click **More info**, then **Run anyway**. This appears because the installer isn't signed with a paid Microsoft certificate. +3. Follow the installer, then open Dreamforge from the Start menu. + +### Install on a Mac + +1. Open the downloaded file and drag **Dreamforge** into **Applications**. +2. Open Dreamforge from Applications. The first time, macOS blocks it because it isn't notarized by Apple. +3. Open **System Settings**, then **Privacy & Security**, scroll down, and click **Open Anyway** next to Dreamforge. Confirm once more, and it opens normally from then on. + +### You can ignore the other files + +The files ending in `.app.tar.gz` and `.sig`, and `latest.json`, are what Dreamforge downloads by itself to update. The "Source code" links are added by GitHub. You don't need any of them. From 34d7dd0b05928ddd88a4e1d9cda722201e32544a Mon Sep 17 00:00:00 2001 From: QuicksilverSlick Date: Mon, 28 Sep 2026 08:51:54 -0500 Subject: [PATCH 2/2] fix(release): review, safer publish order and fuller install steps Publish: the notes edit now runs before latest.json goes live, and the old-file cleanup after it only warns (a failure there used to turn a shipped release red, and a rerun is refused as not newer). The asset list is captured without a pipe, since the publish job's bash has no pipefail. The pre-publish check now also requires both DMGs the page links. Page: Mac steps say to click Done, not Move to Trash, that Open Anyway lasts about an hour, and that it asks for the login password; chip guidance covers A-series Macs and matches About This Mac's Chip and Processor lines; Windows steps cover Edge's isn't-commonly-downloaded prompt and Smart App Control; the certificate wording is corrected; and updates are described as the Ready to update! card they are. Co-Authored-By: Claude Opus 5.5 --- .../workflows/dreamforge-desktop-release.yml | 11 +++++++---- scripts/dreamforge-release-notes.md | 19 +++++++++++-------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/.github/workflows/dreamforge-desktop-release.yml b/.github/workflows/dreamforge-desktop-release.yml index d09ba97c851..72c13f13e2c 100644 --- a/.github/workflows/dreamforge-desktop-release.yml +++ b/.github/workflows/dreamforge-desktop-release.yml @@ -275,7 +275,7 @@ jobs: BASE="https://github.com/$GH_REPO/releases/download/$TAG" MAC="Dreamforge_${VERSION}" EXE="Dreamforge_${VERSION}_x64-setup.exe" - for f in "${MAC}_aarch64.app.tar.gz" "${MAC}_x64.app.tar.gz" "$EXE"; do + for f in "${MAC}_aarch64.app.tar.gz" "${MAC}_x64.app.tar.gz" "${MAC}_aarch64.dmg" "${MAC}_x64.dmg" "$EXE"; do [ -s "dist/$f" ] || { echo "::error::missing dist/$f"; exit 1; } done # --pubkey refuses signatures from any key but the one installed apps trust. @@ -293,14 +293,17 @@ jobs: ! grep -q '[{}]' notes.md || { echo "::error::unfilled placeholder in the release notes"; exit 1; } gh release view "$TAG" > /dev/null 2>&1 || gh release create "$TAG" --target "$GITHUB_SHA" --title "Dreamforge $VERSION" --notes-file notes.md gh release upload "$TAG" dist/*.dmg dist/*.app.tar.gz dist/*.exe dist/*.sig --clobber + # The notes only link files uploaded above, so the page may run ahead of the feed. + gh release edit "$TAG" --title "Dreamforge $VERSION" --notes-file notes.md # latest.json last, so apps only see the new version once every file it names is uploaded. gh release upload "$TAG" latest.json --clobber - gh release edit "$TAG" --title "Dreamforge $VERSION" --notes-file notes.md + # Live from here, and a rerun would be refused as "not newer": warn, never fail. # Remove the previous version's files: latest.json no longer names them, # and a single set keeps "which file is mine" obvious on the page. - gh release view "$TAG" --json assets --jq '.assets[].name' | while read -r name; do + names=$(gh release view "$TAG" --json assets --jq '.assets[].name') || echo "::warning::could not list release assets; remove old files by hand" + for name in $names; do case "$name" in latest.json|*"_${VERSION}_"*) ;; - *) gh release delete-asset "$TAG" "$name" --yes ;; + *) gh release delete-asset "$TAG" "$name" --yes || echo "::warning::could not delete $name; remove it by hand" ;; esac done diff --git a/scripts/dreamforge-release-notes.md b/scripts/dreamforge-release-notes.md index 7eee593df17..b32b567219a 100644 --- a/scripts/dreamforge-release-notes.md +++ b/scripts/dreamforge-release-notes.md @@ -1,26 +1,29 @@ ## Download Dreamforge {VERSION} -Pick the one line that matches your computer and click its file. You only download from this page once: after that, Dreamforge updates itself. +Pick the one line that matches your computer and click its file. You only download from this page once: after that, Dreamforge fetches new versions itself, and when **Ready to update!** appears in its sidebar, click it. | Your computer | Click this file | |---|---| | **Windows PC** | [Dreamforge_{VERSION}_x64-setup.exe]({BASE}/Dreamforge_{VERSION}_x64-setup.exe) | -| **Mac with an Apple chip** (M1, M2, M3, M4 or newer; most Macs from late 2020 on) | [Dreamforge_{VERSION}_aarch64.dmg]({BASE}/Dreamforge_{VERSION}_aarch64.dmg) | +| **Mac with an Apple chip** (M1, M2, M3, M4, M5, A18 Pro or newer; most Macs from late 2020 on) | [Dreamforge_{VERSION}_aarch64.dmg]({BASE}/Dreamforge_{VERSION}_aarch64.dmg) | | **Mac with an Intel chip** (older Macs) | [Dreamforge_{VERSION}_x64.dmg]({BASE}/Dreamforge_{VERSION}_x64.dmg) | -**Not sure which Mac you have?** Click the Apple menu in the top-left corner, then **About This Mac**. If it says **Chip: Apple M1** (or M2, M3, M4), take the Apple chip file. If it says **Processor: Intel**, take the Intel file. +**Not sure which Mac you have?** Click the Apple menu in the top-left corner, then **About This Mac**. If there is a line called **Chip** (Apple M1, M4, A18 Pro or any other Apple chip), take the Apple chip file. If there is a line called **Processor** that mentions **Intel**, take the Intel file. ### Install on Windows -1. Open the downloaded file. -2. If Windows says "Windows protected your PC", click **More info**, then **Run anyway**. This appears because the installer isn't signed with a paid Microsoft certificate. -3. Follow the installer, then open Dreamforge from the Start menu. +1. If your browser warns that the file "isn't commonly downloaded", keep it. In Edge, click **...** next to the download, then **Keep**, then **Show more**, then **Keep anyway**. +2. Open the downloaded file. +3. If Windows says "Windows protected your PC", click **More info**, then **Run anyway**. This appears because Dreamforge is new and its installer isn't signed with a paid code-signing certificate. +4. Follow the installer, then open Dreamforge from the Start menu. + +If Windows instead says **Smart App Control blocked an app**, there is no Run anyway button: Windows won't allow unsigned apps while Smart App Control is on. Ask whoever sent you this link for help before changing that setting. ### Install on a Mac 1. Open the downloaded file and drag **Dreamforge** into **Applications**. -2. Open Dreamforge from Applications. The first time, macOS blocks it because it isn't notarized by Apple. -3. Open **System Settings**, then **Privacy & Security**, scroll down, and click **Open Anyway** next to Dreamforge. Confirm once more, and it opens normally from then on. +2. Open Dreamforge from Applications. The first time, macOS says "Dreamforge" Not Opened, because it isn't notarized by Apple. Click **Done**, not Move to Trash. +3. Within the hour, open **System Settings**, then **Privacy & Security**, and scroll down to **Security**. Next to "Dreamforge" was blocked, click **Open Anyway**. Click **Open Anyway** again and enter your Mac login password (or use Touch ID). If the button isn't there, do step 2 again. From then on, Dreamforge opens normally. ### You can ignore the other files