Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions .github/workflows/release-candidate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,24 +58,24 @@ jobs:
name: snapmaker-studio-installer
path: rc

- name: Download the published v1.1.0 installer, verify its checksum
- name: Download the published v1.5.0 installer, verify its checksum
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
if ($env:GITHUB_ACTIONS -ne 'true' -or $env:RUNNER_ENVIRONMENT -ne 'github-hosted' -or [string]::IsNullOrWhiteSpace($env:ImageOS) -or $env:GITHUB_REPOSITORY -ne 'DVOpenLabs/snapmaker-studio' `
-or $env:ACT -or $env:WDAGUtilityAccount) { throw 'Disposable preflight failed.' }
$url = "https://github.com/DVOpenLabs/snapmaker-studio/releases/download/v1.1.0/Snapmaker.Studio_1.1.0_x64-setup.exe"
$dest = "old\Snapmaker.Studio_1.1.0_x64-setup.exe"
$url = "https://github.com/DVOpenLabs/snapmaker-studio/releases/download/v1.5.0/Snapmaker.Studio_1.5.0_x64-setup.exe"
$dest = "old\Snapmaker.Studio_1.5.0_x64-setup.exe"
New-Item -ItemType Directory -Force -Path old | Out-Null
Invoke-WebRequest -Uri $url -OutFile $dest
$hash = (Get-FileHash -Algorithm SHA256 $dest).Hash.ToLower()
$expected = "b41931774eac5586bc31746599d4a637e89eda195c620067dc1c756281b217ee"
$expected = "d443f64f5167239f1422c719882cf245cff5d00d40c55fb67fc5a1e497b84e82"
if ($hash -ne $expected) {
throw "Downloaded v1.1.0 installer hash $hash does not match the published $expected"
throw "Downloaded v1.5.0 installer hash $hash does not match the published $expected"
}
Write-Host "v1.1.0 installer verified: $hash"
Write-Host "v1.5.0 installer verified: $hash"

- name: Install v1.1.0 (default path), record its registration
- name: Install v1.5.0 (default path), record its registration
shell: pwsh
run: |
$ErrorActionPreference = "Stop"
Expand All @@ -90,14 +90,14 @@ jobs:
if ((Test-Path -LiteralPath $userKey) -or (Test-Path -LiteralPath $machine64Key) -or (Test-Path -LiteralPath $machine32Key) -or (Test-Path -LiteralPath $rememberedKey) -or (Test-Path `
-LiteralPath $manufacturerKey) -or (Test-Path -LiteralPath $defaultExe) -or (Get-Process -Name 'snapmaker-studio-desktop' -ErrorAction SilentlyContinue)) { throw `
'Initial exact production state is not clean.' }
$old = (Resolve-Path "old\Snapmaker.Studio_1.1.0_x64-setup.exe").Path
$old = (Resolve-Path "old\Snapmaker.Studio_1.5.0_x64-setup.exe").Path
$p = Start-Process -FilePath $old -ArgumentList '/S', '/NCRC' -PassThru -Wait
if ($p.ExitCode -ne 0) { throw "v1.1.0 silent install failed, exit $($p.ExitCode)" }
if ($p.ExitCode -ne 0) { throw "v1.5.0 silent install failed, exit $($p.ExitCode)" }
Start-Sleep -Seconds 2
$beforePath = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\Snapmaker Studio'
if (-not (Test-Path -LiteralPath $beforePath)) { throw 'Exact v1.1.0 registration is absent' }
if (-not (Test-Path -LiteralPath $beforePath)) { throw 'Exact v1.5.0 registration is absent' }
$beforeProps = Get-ItemProperty -LiteralPath $beforePath
if ($beforeProps.DisplayVersion -ne "1.1.0") { throw "v1.1.0 registration says DisplayVersion=$($beforeProps.DisplayVersion), expected 1.1.0" }
if ($beforeProps.DisplayVersion -ne "1.5.0") { throw "v1.5.0 registration says DisplayVersion=$($beforeProps.DisplayVersion), expected 1.5.0" }
# NSIS can write InstallLocation wrapped in literal quote
# characters (part of the string value itself, not just how it
# displays) — trim them unconditionally so every later
Expand All @@ -112,7 +112,7 @@ jobs:
if ($installLocation -ne (Join-Path $env:LOCALAPPDATA 'Snapmaker Studio')) { throw 'First install did not use the exact default path.' }
"owned_uninstaller=$ownedUninstaller" >> $env:GITHUB_ENV
"owned_uninstaller_sha256=$((Get-FileHash -LiteralPath $ownedUninstaller -Algorithm SHA256).Hash)" >> $env:GITHUB_ENV
Write-Host "v1.1.0 installed at $installLocation, DisplayVersion 1.1.0"
Write-Host "v1.5.0 installed at $installLocation, DisplayVersion 1.5.0"
pwsh -NoProfile -File .github/scripts/ci-assert-registry.ps1 -Action Assert -InstallDir $installLocation -OutFile $env:RUNNER_TEMP\rc-before.json
if ($LASTEXITCODE -ne 0) { throw 'Registry assertion failed.' }

Expand Down
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,37 @@ All notable changes to this project are documented here. The format is based on

## [Unreleased]

## [1.5.1] - 2026-10-09

**Clearer Prepare, easier spool choices, and controls that work from the keyboard and with a screen reader.**

### Added
- **Choose any spool from your inventory** (Project Materials). Each slot can open the provider's
whole spool list, searchable by vendor, material, colour or id, showing colour, vendor, material,
spool id, weight status and the status of the mapped Orca preset. When a spool is picked with no
Orca preset, the slot and the review say the project's existing filament preset will remain.
- **Forget saved mapping.** A mapping Studio remembered for one spool, or for similar spools, can be
forgotten from the slot. The confirmation says what is forgotten and what is not changed (your
inventory, your Orca presets and the project).
- **Why a setting changed.** The Prepare summary shows a short reason under each setting Studio
changed for the U1 and labels where the statement comes from: "Studio's check" or "Verify in
Snapmaker Orca". Lists Studio had to repair say exactly what was done.
- **User guide links.** Help and Get Started link to the task-first user guide, which shows where
each statement comes from and which Studio version it was checked against. Its screenshots were
captured from v1.5.0 and have not been retaken.

### Fixed
- **A saved-mappings file Studio could not read is no longer treated as damaged.** If another
program briefly holds the file, Studio waits and retries; if it still cannot read it, it changes
nothing and asks you to try again.
- **Printer-action confirmation is an accessible dialog.** Start, Cancel print and Emergency stop
now open a named, described dialog that starts on Cancel, is dismissed only by Escape or Cancel,
names the printer (and the file for Start), and is withdrawn if the printer changes or can no
longer take the action.
- **Tool tabs work from the keyboard.** The Compatibility / Source Check and Print Quality / First
Layer tab rows respond to the arrow keys, Home and End, show a focus outline and wrap on narrow
windows. Moving along the row does not open or re-run a tool.

## [1.5.0] - 2026-10-06

**Project Materials: pick the real spool, and the real Snapmaker Orca preset, for each colour (#39).**
Expand Down
82 changes: 48 additions & 34 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ changed. Snapmaker Orca still does the slicing.**
Free, open source, and local. No account, no cloud, nothing uploaded off your
local network. Your original file is never modified.

### [▶ Watch it work — 66 seconds](https://github.com/DVOpenLabs/snapmaker-studio/blob/main/docs/media/snapmaker-studio-demo.mp4) · [⬇ Download for Windows or Linux](https://github.com/DVOpenLabs/snapmaker-studio/releases/tag/v1.5.0) · [What it is, in 5 minutes](docs/innovation-fund/JUDGE_OVERVIEW.md)
### [▶ Watch it work — 66 seconds](https://github.com/DVOpenLabs/snapmaker-studio/blob/main/docs/media/snapmaker-studio-demo.mp4) · [⬇ Download for Windows or Linux](https://github.com/DVOpenLabs/snapmaker-studio/releases/tag/v1.5.1) · [What it is, in 5 minutes](docs/innovation-fund/JUDGE_OVERVIEW.md)

[![Watch the Snapmaker Studio demo](docs/media/demo-poster.jpg)](https://github.com/DVOpenLabs/snapmaker-studio/blob/main/docs/media/snapmaker-studio-demo.mp4)

Expand Down Expand Up @@ -71,30 +71,30 @@ recording, so it also shows what Studio says when it cannot reach one:

**Windows 10/11 (x64)** ✅ · **Linux x86_64 (.deb)** ✅ · **macOS** not supported.

**[⬇ Download for Windows](https://github.com/DVOpenLabs/snapmaker-studio/releases/tag/v1.5.0)**
**[⬇ Download for Windows](https://github.com/DVOpenLabs/snapmaker-studio/releases/tag/v1.5.1)**
— one click, no Python, runs offline.
**[⬇ Download for Linux](https://github.com/DVOpenLabs/snapmaker-studio/releases/tag/v1.5.0)**
**[⬇ Download for Linux](https://github.com/DVOpenLabs/snapmaker-studio/releases/tag/v1.5.1)**
— one `.deb`, no Python, no Node, no Rust. Install guide:
[docs/linux-install.md](docs/linux-install.md).

**v1.5.0 is the current stable release** — not a prerelease, so this is also what
**v1.5.1 is the current stable release** — not a prerelease, so this is also what
GitHub's [latest release](https://github.com/DVOpenLabs/snapmaker-studio/releases/latest)
points at. Every build ever published is on the
[Releases page](https://github.com/DVOpenLabs/snapmaker-studio/releases).

Verify it before you run it:

- Release: [v1.5.0](https://github.com/DVOpenLabs/snapmaker-studio/releases/tag/v1.5.0)
- Windows installer: `Snapmaker.Studio_1.5.0_x64-setup.exe`
— 21,944,474 bytes — SHA256: `d443f64f5167239f1422c719882cf245cff5d00d40c55fb67fc5a1e497b84e82`
- Linux package: `snapmaker-studio_1.5.0_amd64_5245cf9f9664.deb`
— 25,944,098 bytes — SHA256: `7fca28d9d4e2558f8a6bdc765b121e2290c54abd39e2a1b9b2efaeea6d923e5a`
- Release: [v1.5.1](https://github.com/DVOpenLabs/snapmaker-studio/releases/tag/v1.5.1)
- Windows installer: `Snapmaker.Studio_1.5.1_x64-setup.exe`
— 21,962,736 bytes — SHA256: `8955097365b12e9eb1405a098c1f6ab345d56d397681a67f0cb08257d1471be3`
- Linux package: `snapmaker-studio_1.5.1_amd64_abf20bf0f74d.deb`
— 25,954,272 bytes — SHA256: `c5766900437fa9826eefdb970c0ed21894b4f5f4b4795518993677ca6eeed08b`

```powershell
Get-FileHash -Algorithm SHA256 .\Snapmaker.Studio_1.5.0_x64-setup.exe
Get-FileHash -Algorithm SHA256 .\Snapmaker.Studio_1.5.1_x64-setup.exe
```
```bash
sha256sum snapmaker-studio_1.5.0_amd64_5245cf9f9664.deb
sha256sum snapmaker-studio_1.5.1_amd64_abf20bf0f74d.deb
```

Neither installer is code-signed yet, so Windows SmartScreen will show "Unknown
Expand Down Expand Up @@ -127,11 +127,11 @@ sliced job back**.

| The problem, named exactly | The fix, in a new copy — and where Studio says it can't tell |
|---|---|
| ![One object hangs 45 mm past the right edge](docs/screenshots/v1.5.0/problem.png) | ![The prepared copy, with what survived and what changed](docs/screenshots/v1.5.0/prepared.png) |
| ![One object hangs 45 mm past the right edge](docs/screenshots/v1.5.1/problem.png) | ![The prepared copy, with what survived and what changed](docs/screenshots/v1.5.1/prepared.png) |
| **Painted colour, read before slicing** | **What to load — and where Studio says it cannot tell** |
| ![Which filaments the painting uses, and what that means for four toolheads](docs/screenshots/v1.5.0/painted.png) | ![Each slot named, with the unknowns marked as unknown](docs/screenshots/v1.5.0/what-to-load.png) |
| ![Which filaments the painting uses, and what that means for four toolheads](docs/screenshots/v1.5.1/painted.png) | ![Each slot named, with the unknowns marked as unknown](docs/screenshots/v1.5.1/what-to-load.png) |

From the v1.5.0 build's own installed-application run: the problem and prepared views on the sample project in [`examples/demo_u1_showcase.3mf`](examples/demo_u1_showcase.3mf); the painted view on the acceptance harness's dedicated multi-colour fixture; the what-to-load view on a sliced-job fixture the harness supplies to exercise that screen. Reproduce them with [docs/innovation-fund/JUDGE_WALKTHROUGH.md](docs/innovation-fund/JUDGE_WALKTHROUGH.md). Submission package: [docs/innovation-fund/FINAL_SUBMISSION.md](docs/innovation-fund/FINAL_SUBMISSION.md).
From the v1.5.1 build's own installed-application run: the problem and prepared views on the sample project in [`examples/demo_u1_showcase.3mf`](examples/demo_u1_showcase.3mf); the painted view on the acceptance harness's dedicated multi-colour fixture; the what-to-load view on a sliced-job fixture the harness supplies to exercise that screen. Reproduce them with [docs/innovation-fund/JUDGE_WALKTHROUGH.md](docs/innovation-fund/JUDGE_WALKTHROUGH.md). Submission package: [docs/innovation-fund/FINAL_SUBMISSION.md](docs/innovation-fund/FINAL_SUBMISSION.md).

## Why this isn't a slicer, a dashboard, or a converter

Expand Down Expand Up @@ -165,7 +165,7 @@ its licence in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).

## Evidence

Everything below was run against the v1.5.0 release-candidate build — the
Everything below was run against the v1.5.1 release-candidate build — the
same application and Linux package published on the release page, checked by
SHA256 — not against a development build. The Windows installed-application
run used an acceptance copy of the release-candidate installer (same application
Expand All @@ -179,24 +179,26 @@ counts come from the source at the release commit, not from the installer. Comma

| What | Result |
|---|---|
| Installed-application acceptance, driven through the real UI | **45/45** |
| Read-only checks against a real Snapmaker U1, from the Windows-installed app | **58/58** |
| Installed-application acceptance, driven through the real UI | **50/50** |
| Read-only checks against a real Snapmaker U1, from the Windows-installed app, with Spoolman and Bambuddy | **76/76** |
| Linux clean-image validation, Ubuntu 22.04 + 24.04 | **49/49** each |
| Regression tests against genuine OrcaSlicer / BambuStudio / PrusaSlicer projects | **36 tests** |
| End-to-end pipeline self-check (`u1convert selfcheck`) | **27/27** |
| Backend / desktop / TypeScript / Rust | 2804 · 725 · clean · clean |
| Backend / desktop / TypeScript / Rust | 2927 · 852 · clean · clean |

The installed-application acceptance count (45/45) is a different total from
v1.2.0's: this release adds two checks for the SpoolEase provider and
three checks that the test lane itself leaves nothing behind, and drops one
older bookkeeping check — see [docs/TRUST_STATUS.md](docs/TRUST_STATUS.md).
The installed-application acceptance count (50/50) is a different total from
the previous release's: this run is the upgrade variant, started from the previous
release's installer, and adds five checks that the previous version installs, leaves its state
to migrate, and that the upgrade keeps your data and registers the new version — see
[docs/TRUST_STATUS.md](docs/TRUST_STATUS.md).

The real-U1 verification for this release ran read-only through the
Windows-installed application itself, 58/58, with no printer-control action
called. The Spoolman/Bambuddy-seeded provider-on-hardware checks were not run
this release, no real SpoolEase device has been tested yet, this printer's four
toolheads all carry the same 0.4 mm nozzle, and the Linux-installed app was not
run against the real printer. Full detail:
Windows-installed application itself, 76/76, with no printer-control action
called. Both Spoolman (0.27.0) and Bambuddy (1.2.5.7) took part, as disposable
local containers seeded with anonymous spools, and the provider-on-hardware checks
for each ran and none were skipped. No real SpoolEase device has been tested yet,
this printer's four toolheads all carry the same 0.4 mm nozzle, and the
Linux-installed app was not run against the real printer. Full detail:
[docs/TRUST_STATUS.md](docs/TRUST_STATUS.md).

Reproduce any of it yourself:
Expand All @@ -208,6 +210,25 @@ files produced structurally valid U1 profile copies ([PROOF.md](PROOF.md)); that
number measures structure, not print success, and the checks above are the
stronger evidence.

## What's new in v1.5.1

**Clearer Prepare, easier spool choices, and controls that work from the keyboard and with a screen reader.**

- **Choose any spool from your inventory.** Each slot can open your provider's whole spool list,
searchable by vendor, material, colour or id. If you pick a spool but no Orca preset, the slot and
the review say the project's existing filament preset will remain.
- **Forget a saved mapping.** A remembered spool-to-preset mapping now has a **Forget saved mapping**
button; the confirmation says what is forgotten and what is not changed.
- **A saved-mappings file that is briefly locked is no longer treated as damaged.** Studio retries,
and if it still cannot read the file it changes nothing and asks you to try again.
- **Prepare says why a setting changed**, and whether the statement is Studio's own check or advice to
verify in Snapmaker Orca.
- **Accessible printer-action confirmation and tool tabs.** The Start, Cancel print and Emergency stop
confirmation is a proper dialog that starts on Cancel; the tool tab rows work with the arrow keys,
Home and End.
- **User guide links** from Help and Get Started. The guide's screenshots were captured from v1.5.0
and have not been retaken.

## What's new in v1.5.0

**Project Materials: the real spool and the real Snapmaker Orca preset, for each colour.**
Expand All @@ -225,13 +246,6 @@ Presets you made yourself can be found and mapped, but are shown as **"Confirmed
**"Manual check in Orca required"**: in testing Snapmaker Orca kept the project's own values for such
a preset, so Studio does not say Orca will apply them. Check the filament in Orca before slicing.

| Suggested spools, nothing selected | Review before Prepare | Orca's presets and yours, told apart |
|---|---|---|
| ![Project Materials: top spool candidates with reasons, no spool selected](docs/screenshots/v1.5.0/pm-1-recommendations.png) | ![Review: each slot mapped, what changed, what the preset controls](docs/screenshots/v1.5.0/pm-3-fidelity-review.png) | ![A user preset marked Manual check in Orca required, next to a built-in preset](docs/screenshots/v1.5.0/pm-5-system-vs-user.png) |

From the v1.5.0 release-candidate build's own installed-application run, against anonymised
disposable spools and presets.

## What's new in v1.4.1

**A readable spool picker.** Settings → Materials provider now has a Studio list in place of the
Expand Down
2 changes: 1 addition & 1 deletion backend/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "snapmaker-studio"
version = "1.5.0"
version = "1.5.1"
description = "Snapmaker Studio engine — a local-first workflow platform for modern 3D printing: understand, validate, and prepare designs print-ready (Bambu/Orca/STL today; Snapmaker U1 as the first printer target)."
readme = "README.md"
requires-python = ">=3.13"
Expand Down
Loading
Loading