Skip to content

Releases

WindowCraft v1.4.1

Choose a tag to compare

@github-actions github-actions released this 13 Nov 18:38

WindowCraft 1.4.1

This release fixes option lists in the seven translated interface languages and seven smaller bugs found in a code review of 1.4.0 and one layout bug in the X-Ray Inspector, and moves the credit to WindowCraft Dev Team. No pages or extensions were added.

Option lists in translated languages

1.4.0 translated the catalog, including the labels of options. The option lists sent the shown label to the engine, which knows an option only by its English name. In every language except English this had three effects:

  • Multiplane overlay (MPO) on the Tweaks page: no translated option matched a registry value, so both values were deleted, which is the "Enabled" state, and the run was reported as done.
  • Reset Windows Update on the System page: "Agresywnie" and its other translations ran the standard reset.
  • DNS server: "Default" and "Fastest" in translation failed with a "not found" error. Provider names such as Google or Cloudflare are the same in every language and worked.

A profile with English option names was also refused when the window ran in another language, and the lists showed no current choice.

ChoiceOption keeps the English name in a value field when the label is translated, and the registry maps, profile checks and the engine use value(). The pick lists show the label and send the value. A test loads the catalog in every language and checks that each option of every tweak and feature keeps its English value and that a profile with English option names loads.

Other fixes

  • Installing AppX packages: three packages in the catalog have no Microsoft Store id (Xbox Speech To Text Overlay, Xbox TCUI and Solitaire Collection). Install skipped them but counted them as installed and unticked them. They now stay ticked and the notice names them.
  • Importing a profile from the dialog while a job runs is refused with the notice that another operation is running. Before, the end of the job removed its own ids from the newly imported toggles and options, so those choices were lost without running.
  • A Time Machine session in the Failed state has the Roll back button. A feature set such as WSL can fail after some of its Windows components were enabled, and those stayed on with no way to undo them from the window.
  • When a job ends, an open Time Machine session and the X-Ray Inspector load their values again. Before, they showed the values from before the job, and an undo button for a change that had just been undone.
  • ISO Studio splits an install.wim larger than 3.8 GB into install.swm, install2.swm and so on before it writes a USB stick. The parts stayed in work\media\sources afterwards, so a later ISO export packed them next to install.wim. They are deleted after the copy, whatever its result, and before a new split.
  • Startup folder items on the Autoruns tab of the System & Gaming Inspector always showed as on, because the scan did not read their StartupApproved\StartupFolder flag. Turning off an item of the common Startup folder under ProgramData wrote that flag to HKCU, where Windows ignores it for the common folder. The scan and the switch now use HKCU for the user's folder and HKLM for the common one, as Task Manager does.
  • A session rollback ran the undo steps of a tweak once for each separate run of its records in the session. Each tweak's undo steps now run once, in session order. The present code records a tweak's changes in one piece, so this is a safeguard more than a fix someone could hit.
  • The search field takes up to 460 px when the toolbar has room, and the placeholder is shorter in the seven translated languages. In a 1024 px window the full text is visible on every page in every language.
  • In the X-Ray Inspector the overlay scroll bar sits on the right edge of the drawer content and covered the last letters of a description line ("input" in the telemetry tweak) and the right border of the cards. The content keeps 12 px clear for it, as the introduction does.

Credit and contact

The credit reads "Made by WindowCraft Dev Team" in all eight languages. It left the sidebar and now ends every page, in small type on the right under the last group. Settings has a new About group with the support address, support@windowcraft.dev, which opens the mail program, and a button that opens https://windowcraft.dev. LICENSE, the installers, the exe version data and the Cargo manifests name WindowCraft Dev Team as the copyright holder and manufacturer. The README is rewritten: it is shorter, has new 1.4.1 screenshots drawn headless in the dark theme on the test sandbox, so they show no data of a real computer, and points to windowcraft.dev for the full description. The repository moved with the account to https://github.com/windowcraft/WindowCraft; the old address redirects, and every link in the repository, the installers and the site points to the new one.

Not changed in this release

  • Pinned versions for the downloaded tools (E14), with the plan from the 1.4.0 notes.
  • The Spanish, Italian and French grammar points of L11, and a review of the catalog translations by native speakers.
  • The per-item failure reasons inside the "Failed: N. First error: ..." notice still come from the engine in English.
  • Importing a WinUtil file skips packages under Install that the catalog does not have, without saying so.

Tested

cargo clippy --workspace --all-targets -- -D warnings has no warnings. cargo test --workspace passes 598 tests, 0 fail, and 27 are ignored: the live tests and the two screenshot renders (592 and 26 in 1.4.0). Each fix has a unit or sandbox test, except the reload after a job, which only queues two existing loads, and the rollback safeguard.

The interface was drawn headless with tiny-skia at 1024x720 in all eight languages, on the System and Inspector pages and on Settings, to check the search field, the credit and the About group.

A short pass ran in a VirtualBox VM with Windows 11 Home 26H2, build 26300, in Polish, from a clean snapshot. The upgrade from 1.4.0 with history and settings, WCLANGUAGE in all eight languages and the uninstall passed 64 of 64 checks. The fixes on the live system passed 12 of 12: with the window in Polish, a profile with "Fully Disabled" for multiplane overlay set OverlayTestMode to 5 and DisableOverlays to 1, and "Disabled (Compatibility)" kept 5 and removed DisableOverlays; the System page showed "Standardowo" in the reset list; the CLI help, the exe version data and the Installed apps entry name WindowCraft Dev Team. These packages were built before the X-Ray Inspector padding fix, which changes only the layout of the drawer.

Not checked on a live system: every page in every language and the introduction, which the full pass of 1.4.0 covered. The AppX install, the feature rollback, the Startup folder switch, a USB write with a split image and the mail and website buttons have not run on a real system.

Downloads

File Use
WindowCraft-1.4.1-x64-setup.exe Installer with a Start menu entry
WindowCraft-1.4.1-x64.msi For Intune, GPO or msiexec /qn
WindowCraft-1.4.1-x64-portable.exe Runs without installing
SHA256SUMS.txt Checksums
THIRD-PARTY-NOTICES.md Licenses of the bundled Rust crates and of LAME

WindowCraft v1.4.0

Choose a tag to compare

@github-actions github-actions released this 11 Nov 20:32

WindowCraft 1.4.0

The catalog now follows the interface language. This release also closes the rest of the 1.3.0 audit: a lock on the downloaded tools, a stronger disk check before ISO Studio erases a USB drive, and the removal of code nothing used.

The catalog in every language

Tweak, application, fix and update mode names and descriptions, tweak notices, AppX warnings, option labels and the application and AppX categories are translated into Polish, German, French, Spanish, Italian, Brazilian Portuguese and Ukrainian. The texts live in crates/windowcraft-config/catalog/i18n/<tag>.json, one file per language, keyed by catalog id. Only text is replaced; ids, registry paths, commands and presets stay the same in every language, and a test checks that. An item with no entry keeps its English text.

Changing the language in Settings reloads the catalog at once and clears the category filters, since their names change with the language. Application categories are sorted alphabetically in the chosen language; accents are ignored for the order, and the Ukrainian letters І, Ї, Є and Ґ come right after И, Е and Г, as in the Ukrainian alphabet. Search matches the translated words and the English ones, so "telemetry" still finds "Wyłącz telemetrię Windows" in Polish. Search results for tweaks and fixes show the tab or page name in the chosen language. On the Time Machine page, the name of a reverted tweak is shown in the chosen language.

The build fails when a language leaves a catalog item in English, names an id that does not exist, or drops a token such as %SystemRoot%\Temp or a registry path from a description. Windows error details and the CLI output stay in English.

Tools folder lock (E10)

The extensions download yt-dlp, ffmpeg and Deno to %LOCALAPPDATA%\WindowCraft\tools. Up to 1.3.1 that folder inherited the user profile's permissions, so any program running as the user could replace a tool that WindowCraft later started as an administrator.

When WindowCraft runs elevated, it now sets the folder's owner to Administrators and gives it a protected DACL: full control for SYSTEM and Administrators, and read and run rights for users. The DACL includes the OWNER RIGHTS entry, so the owner has no hidden right to change the DACL. A link in place of the folder is removed before the folder is created. Before a tool runs, WindowCraft checks that the folder is still locked and that every file the tool loads (for ffmpeg, every file in its folder) is owned by Administrators or SYSTEM and cannot be written by anyone else. A tool that fails the check counts as missing; it is deleted and downloaded again.

Tools that 1.3.1 or older downloaded sit in a folder users could write to, so the first use after the update deletes them and downloads them again. Without elevation the check is skipped, because the tools then run with the user's own rights.

USB disk identity (E11)

ISO Studio used to recognize the chosen USB disk by its number and model only. Before it erases the drive, it now also compares the serial number and the partition table id (the MBR signature or the GPT disk id) with the ones read when the disk was chosen. If another stick of the same model got the same disk number in the meantime, the write stops with a message. A disk that reports neither a serial number nor a partition table id is refused, since there is nothing to compare.

Removed code (D1 to D12)

  • The Close and Continue messages, from the enum and from all eight tables (D1). DriftResetFormat and DriftResetByUpdateFormat stay, because i18n::drift_summary uses them; the audit listed them as unused by mistake.
  • The English title() methods of pages, Tweaks tabs and Inspector tabs (D2).
  • project_momentum, relative_velocity and Spring2D in the physics crate (D3).
  • usb::volume_label and DiskFacts::removable (D4).
  • The English label() methods of session states, autorun sources, package managers, service run states, interrupt priorities and search kinds (D6). DeviceClass::label sorts the device list, TweakGroup::label is part of the search text and Engine::drift_summary writes the English CLI output, so those three stay.
  • The DriverInfo fields nothing read and MountedImage::path (D7).
  • The registry sandbox and the recording runner are built only for tests, behind the testing feature (D8).
  • MiscState is now ExtensionsState; the misc alias for old shortcuts stays (D9).
  • The ExpandString and MultiString catalog value types, which no catalog entry used (D10).
  • One copy each of copy_tree, the console and INF text decoder (it also reads UTF-16 with a BOM), the mounted-image check and the EBML Void writer (D11).

Catalog::load still does not call validate; the catalog is built into the binary and the tests run the validation, which a comment now says (D5). D12 was done in 1.3.1.

Live tests

The live VM test that applies and rolls back every reversible tweak (t14) skips the tweaks that download a list when the network is off and prints them as skipped. In 1.3.0 and 1.3.1 block-adobe-net failed offline for that reason.

Not changed in this release

  • Pinned versions for the downloaded tools (E14). The SHA-256 still comes from the same GitHub release API as the file. The plan is to pin ffmpeg and Deno with their hashes in the code, since they change rarely, and to keep yt-dlp on its latest release: YouTube changes often enough that a pinned yt-dlp would need a new WindowCraft release each time.
  • The Spanish, Italian and French grammar points of L11, and a review of the catalog translations by native speakers.
  • The per-item failure reasons inside the "Failed: N. First error: ..." notice still come from the engine in English.
  • The longer search placeholder is cut off at the end of the search field in a 1024 px window in some languages.

Tested

cargo clippy --workspace --all-targets -- -D warnings has no warnings. cargo test --workspace passes 592 tests, 0 fail, and 26 are ignored live tests (583 in 1.3.1). The tests that need elevation (the tools lock and the DACL read-back) skip on a normal shell and ran elevated in the VM.

Not checked on a live system: E11, because no Windows ISO was available for the ISO build and USB write tests (t08 and t09), and the translations by native speakers.

The x64 packages ran in a VirtualBox VM with Windows 11 Home 26H2, build 26300, in Polish, on a 1024x768 screen, each pass from a clean snapshot. The upgrade from 1.3.1 with history and settings, WCLANGUAGE in all eight languages and the uninstall passed 64 of 64 checks. Every page in every language, in light, dark and system mode, passed 168 of 168. The introduction and the tips in all eight languages passed 153 of 153. The edge cases (settings files with a BOM or broken JSON, wrong flags, a second start) passed 15 of 15 and the portable build 11 of 11, the same as 1.3.1.

The engine unit tests passed elevated in the VM, 257 of 257, including the tools lock tests. The extensions with real ffmpeg, yt-dlp and a real video passed 10 of 10: the tools were downloaded into the locked folder, which read back as owned by Administrators with a protected DACL, and yt-dlp and ffmpeg ran from it. The first YouTube download got "HTTP Error 403: Forbidden" from YouTube and passed when run again a few minutes later.

The live tests that change the system ran offline from a clean snapshot: tweaks, drift, services, AppX removal, DISM features, update modes, BitLocker decryption, the PowerShell profile, the scheduled check, the Standard preset and telemetry passed. The round trip of every reversible tweak (t14) passed for 53 tweaks and skipped block-adobe-net, which needs the network; in 1.3.1 that tweak made t14 fail offline. The click run showed the catalog in Polish, Spanish, French, Italian, German and Ukrainian, with the Ukrainian categories in alphabetical order.

The first pass ran on packages built before the category sort was fixed, so the rebuilt packages ran once more from a clean snapshot. Their SHA-256 sums matched, the upgrade from 1.3.1 and the uninstall passed 64 of 64, every page in every language 168 of 168 (with "Développement" now before "Documents" in French) and the portable build 11 of 11. The first try of that pass stopped on a Windows stop error (IRQL_NOT_LESS_OR_EQUAL in ntoskrnl.exe) while the harness read the edition, the BitLocker state and the AppX list, before any WindowCraft file ran; the run from a fresh snapshot did not show it again.

Downloads

File Use
WindowCraft-1.4.0-x64-setup.exe Installer with a Start menu entry
WindowCraft-1.4.0-x64.msi For Intune, GPO or msiexec /qn
WindowCraft-1.4.0-x64-portable.exe Runs without installing
SHA256SUMS.txt Checksums
THIRD-PARTY-NOTICES.md Licenses of the bundled Rust crates and of LAME

Audit items

ID Change in 1.4.0
L2 Translate catalog names, descriptions, notices, warnings, options and categories into the seven other languages
E10 Lock the tools folder to Administrators and SYSTEM and check owner and DACL before each tool runs
E11 Compare serial number and partition table id before erasing a USB disk
E14 Not changed; plan above
D1 to D11 Remove the unused code listed above; D5 gets a comment
t14 Skip network tweaks when the VM is offline

WindowCraft v1.3.1

Choose a tag to compare

@github-actions github-actions released this 10 Nov 19:24

WindowCraft 1.3.1

This release fixes what a full audit of 1.3.0 found across the engine, ISO Studio, the interface, profile handling and the eight interface languages. No new pages or extensions were added.

Engine and ISO Studio fixes

On a clean Windows 11 install, eight toggles whose Windows default state has no registry value (centered taskbar icons, Task View, Game Mode, Bing search, Start menu recommendations, the Settings home page, sign-in blur and Modern Standby network connectivity) read as off because the value was absent. Detection and drift checks now read the catalog's default_on flag when a value is missing, so those toggles show as on and are not reported as reverted. The three IPv6 tweaks (ipv46, teredo and disable-ipv6) now enforce their exclusive group in the interface and during profile validation.

Rolling back a tweak skips a catalog registry tree deletion when the rollback has just restored a value inside that tree, so rolling back disable-explorer-auto-discovery keeps an existing Bags\AllFolders\Shell\FolderType value. Registry tree deletions also run through the same registry scope as every other write, which covers right-click-menu and keeps sandboxed tests inside the sandbox.

In "Reset Windows Update components", every service that was stopped before an error or cancellation is started again before the job returns. In WMI method calls used by BitLocker decryption and IPv6 binding changes, invoke_all reads the ReturnValue property from the output object and returns a Win32 error when it is non-zero. The leftover-folder cleaner checks symlink_metadata so directory junctions and symbolic links in %APPDATA% and %LOCALAPPDATA% are skipped during scanning and never entered if passed to remove_orphan.

In ISO Studio, copy_media clears read-only attributes without following symlinks and deletes the existing work\media tree before copying a new ISO, so an older sources\install.wim cannot stay next to a newer install.esd. When driver injection is on and the staged media has sources\install.esd without install.wim, ISO Studio converts the selected edition to a one-image install.wim before injecting the install drivers, and matches edition_id on a later build so it finds the edition at index 1.

In Extensions, the MP3 metadata stripper validates that an APEv2 footer has a size of at least 32 bytes and fits within the remaining slice before subtracting it. A zero-sized or oversized tag looped forever before. The MP4 and Matroska remuxers use checked arithmetic for 64-bit box sizes and block header lengths and return an error on damaged input instead of panicking, which lets the converter fall back to ffmpeg when installed.

Interface, CLI and profile fixes

When a tweak batch is cancelled, the notice says "Cancelled after N of M." and only the tweaks that finished before cancellation are unticked. Across all queues, finishing a job removes only the items that were sent and completed, so items the user ticked while the job was running stay selected. A failed "Check now" on the Time Machine page shows a warning notice and leaves the current drift list and timestamp in place.

Importing a profile in the window stores toggles, segmented, update_mode and services. The toggles and segmented values count toward the Tweaks queue and run with "Run Tweaks", and exporting the selection writes all four fields back out. When an imported file contains update_mode or services, the notice explains that they are kept in exports and applied by windowcraft.exe --config <file> --run. JSON parsing strips a leading UTF-8 BOM for settings.json, profiles and WinUtil files. Every write to settings.json, including save_settings_language, uses an atomic temporary-file write and backs up an unreadable non-empty file to settings.json.bad. A WindowCraft profile without "version" reports the missing version field instead of a WinUtil error.

When a second instance starts while the window is open, it sends its working directory and arguments to the running window over WM_COPYDATA (crates/windowcraft-app/src/remote.rs) and restores the window only if it was minimized. The running window ignores --run, --check-drift, --export-report, --purge-data and --close-running from a hand-over, and --config only loads the selection to review. --inspect with an unknown id shows a notice instead of opening an empty drawer, and --export-report given a folder path writes windowcraft-report.json inside that folder.

Changing the language while an ISO is opening no longer drops the edition list when the job ends, because the job is tagged by kind instead of its translated label. Opening items in the X-Ray Inspector tags the loaded rows with the requested item and ignores late replies from an earlier click. Changes to the automatic drift check update the scheduled task one at a time, and the last choice wins. "Show the introduction again" and "Show the tips again" re-enable guided mode when the window was started with a deep link. Job failures carry a needs_elevation flag set before the error is formatted, so "Restart as Administrator" appears on the notice banner in every language. Action buttons and category chips on Applications and Tweaks wrap on narrow windows with the inspector open, and the Extensions notes state that the unpacked disk size of ffmpeg and the YouTube downloader tools is larger than the download size.

Translations and layout

The Cleaner scan rows format the file count and unit into Msg::FilesCountOne/Few/Many instead of printing {}. ISO Studio step messages, EngineError messages, cleaner target and group names, the three display toggles and the kernel timer labels on the Display tab of the System & Gaming Inspector are translated in all eight languages. Polish plural selection gives 1 the singular, numbers ending in 2 to 4 (except 12 to 14) the paucal form, and 21, 31 and 101 the plural form, while Ukrainian keeps its rule for numbers ending in 1. The CLI uses singular and plural forms for item counts. Msg::NoticeConverted, Msg::DriftResetFormat and Msg::NotifyDriftBody (L6) already used colon formats and needed no change.

The Ukrainian ISO configuration heading no longer contains a Latin f, the Polish Settings button says "Pokaż wprowadzenie ponownie" and the standard depth option says "Standardowo", the French inspector label says "Paquet", and the search placeholder in the seven non-English languages lists tweaks and registry keys like the English text. Tweaks tabs size themselves to the longest translated label, and the X-Ray Inspector compare label column is 110 px wide instead of 72 px. setup.exe translates its Windows 11 check message through #(loc.ConditionWindows11) in all eight installer language files; the MSI's own condition message stays in English because setup.exe runs the MSI without its internal UI.

Not changed in this release

  • Translation of the catalog: tweak, application and feature names and descriptions stay English in every language (L2).
  • Re-checking downloaded tools before each start (E10).
  • A stronger USB disk identity before formatting in ISO Studio (E11).
  • Pinned tool versions for external downloads (E14).
  • Dead code removal across the workspace (D1 to D12).
  • Making the t14 tweak round-trip test skip network tweaks when offline.
  • The Spanish, Italian and French grammar points of L11, which wait for native speakers.
  • A refused start of a private job while another job is running marks the running job as private.
  • The per-item failure reasons inside the "Failed: N. First error: ..." notice still come from the engine in English.
  • "Sticky Keys shortcut" and "Search button on the taskbar" still show as off on a clean Windows 11. There the values exist, with other data than the catalog's "on" value (Flags is not 506, SearchboxTaskbarMode is not 1), so default_on does not apply.
  • The longer search placeholder is cut off at the end of the search field in a 1024 px window in some languages.

Tested

cargo clippy --workspace --all-targets -- -D warnings has no warnings. cargo test --workspace --locked passes 583 tests, 0 fail, and 26 are ignored live tests (538 passed before the fixes). Each fix has its own unit or sandbox test.

Not checked on a live system: E3 and E7 (no Windows ISO was available) and the new translations by native speakers.

The x64 packages ran in a VirtualBox VM with Windows 11 Home 26H2, build 26300, in Polish, on a 1024x768 screen, each pass from a clean snapshot. verify-install found 0 failed checks. The upgrade from 1.3.0 with history and settings, WCLANGUAGE in all eight languages and the uninstall passed 64 of 64 checks. Every page in every language, in light, dark and system mode, passed 168 of 168. The introduction and the tips in all eight languages passed 153 of 153. The extensions with real ffmpeg, yt-dlp and a real video passed 10 of 10, the portable build 11 of 11, and the edge cases (settings files with a BOM or broken JSON, wrong flags, a second start) 15 of 15.

Seen in the VM: a second start with --open iso switched the running window to ISO Studio; a settings.json with a BOM and "language":"de" opened in German; a profile with a BOM loaded for review; --inspect with an unknown id showed a notice; the Cleaner rows read "System 1 plik"; the eight toggles listed above showed as on; the Ukrainian ISO heading is all Cyrillic.

The live tests that change the system ran offline: tweaks, drift, services, AppX removal, DISM features, update modes, BitLocker decryption, the PowerShell profile, the scheduled check, the Standard preset and telemetry passed. The round trip of every reversible tweak (t14) passed for 53 tweaks and failed only on block-adobe-net, which downloads its host list and cannot run offline, the same as in 1.2.0, 1.2.1 and 1.3.0.

Downloads

File Use
`Window...
Read more

WindowCraft v1.3.0

Choose a tag to compare

@github-actions github-actions released this 09 Nov 19:56

WindowCraft 1.3.0

This release adds an introduction on the first start and a short tip on each page. The catalogs, the installers and the extensions work as in 1.2.1.

Introduction

On the first start without command line options, four questions open over the window. Each has two to four answers and changes nothing on its own.

Question Answers What the answer changes
What do you want to do with WindowCraft? Fresh install, slimmed down / Privacy / Games and performance / General tidy-up A fresh install also marks the 14 default AppX packages for removal. A tidy-up opens the Cleaner tab instead of Tweaks & Privacy.
Do you want to keep your files? Yes / No, the system is new What the cleaner ticks after its first scan: temporary files, logs and minidumps, or those plus GPU shader and developer caches
Will you build your own Windows ISO? Yes / No Adds ISO Studio to the plan
How much should change? Carefully / Standard / Everything The Minimal (6), Standard (13) or Advanced (21) preset; Everything also marks the 14 AppX packages

The last screen lists the plan. Start puts it into the queues and opens the first page; nothing runs until you press Run Tweaks, Remove or Clean Selected. Skip, on every screen, and Escape close the questions for good. The keys 1 to 4 pick an answer and Enter starts.

After that, each page shows a tip once. Next opens the next page with an unread tip, in sidebar order, and the last tip has Done. Don't show again turns them all off, and a click outside a tip closes it without saving. Settings can show the introduction and the tips again.

A start with --open, --inspect, --config or --preset shows neither the questions nor the tips.

Tested

The unit and integration tests pass (538, clippy clean). New tests cover the saved state and what happens to a newer or broken one, Skip on each of the five screens and after a restart, Escape, the number keys and Enter, what Start ticks, each tip once, Next through every page, a click outside a tip, the Settings buttons, a settings file that cannot be written, and every new text in every language. A layout test puts each question screen and tip into windows of 878x425, 980x600 and 1280x800 in all eight languages and checks that Skip, Back, Start, Next and Don't show again lie fully inside.

The x64 packages, built locally with packaging/build.ps1, ran in VirtualBox on Windows 11 Home 26H2, build 26300, Polish, at 1024x768:

Test Result
verify-install.ps1 -Version 1.3.0 (MSI, MSI with WCLANGUAGE=pl, setup.exe) No failed checks, nothing left after uninstall
setup.exe of 1.3.0 over 1.2.1 with a recorded session and German dark settings One visible entry, the binary reports 1.3.0, history byte for byte the same, settings kept, uninstall leaves nothing
WCLANGUAGE unset and set to each of the eight languages The value lands in HKLM, the app opens in that language, uninstall removes the key
Every page in every language, plus dark and light 168 checks pass; no question or tip covers a page opened with --open
First start in each of the eight languages: answers by key, Start, eight real mouse clicks on Next and Done, then a second start 153 checks pass; each click saved one more tip in sidebar order, and the second start showed nothing and changed nothing
Escape on the first screen in each language, then a second start Saved as skipped; the questions did not show again
A click on a sidebar row while a tip is open The tip closed without saving and the page opened

Not tested: the answers picked with the mouse in the VM (they were picked with the number keys; unit tests cover the mouse path), the Settings buttons in the VM, ARM64 hardware and display scaling above 100 %. The texts in German, French, Spanish, Italian, Portuguese and Ukrainian were not read by native speakers.

Known bugs

ID Bug Workaround
SEC-3 OOSU10.exe and Autologon.exe have no pinned hash, because their vendors publish them at fixed "latest" URLs. They must pass Authenticode. None needed.

Known limitations

  • An upgrade from 1.2.x shows the questions once, because the older settings file has no record of them.
  • If settings.json cannot be written, the questions come back on the next start.
  • A tip covers the lower right corner of the page until it is closed.
  • The builds are not code-signed, so SmartScreen warns on the first run.
  • The other limitations of 1.2.0 still apply.

Downloads

File Use
WindowCraft-1.3.0-x64-setup.exe, WindowCraft-1.3.0-arm64-setup.exe Installer with a Start menu entry
WindowCraft-1.3.0-x64.msi, WindowCraft-1.3.0-arm64.msi For Intune, GPO or msiexec /qn
WindowCraft-1.3.0-x64-portable.exe, WindowCraft-1.3.0-arm64-portable.exe Runs without installing
SHA256SUMS.txt Checksums
THIRD-PARTY-NOTICES.md Licenses of the bundled Rust crates and of LAME

WindowCraft v1.2.1

Choose a tag to compare

@github-actions github-actions released this 08 Nov 21:31

WindowCraft 1.2.1

This release fixes what a full test of 1.2.0 found. Nothing new was added, and the catalogs, the installers and the extensions work as in 1.2.0.

What was tested in 1.2.0

The official 1.2.0 files from the Releases page ran in VirtualBox on Windows 11 Home 26H2, build 26300, Polish, at 1024x768. The run covered the checksums, verify-install.ps1 for the MSI and setup.exe (57 of 57), an upgrade from 1.1.0 with history and settings kept, WCLANGUAGE in all eight languages, every page in every language in light and dark, the extensions with real downloads and real files, clicks through the Polish interface, the portable build and the live system tests. These passed. The findings below are fixed in 1.2.1.

Fixes

Finding in 1.2.0 Fix in 1.2.1
A list jumped back to the top when a notice appeared or was dismissed, on every page after every job The drift banner and the notice keep a slot in the widget tree whether they show or not, so the page keeps its scroll position
The first window was 1280x800 centred on the whole monitor, so on 1024x768 and 1366x768 its bottom was under the taskbar It shrinks to the work area when needed and is centred in it
Inspector tabs were 100 px wide, and "Benchmark de DNS" (Portuguese) and "Esecuzione automatica" (Italian) wrapped onto two lines Tabs are as wide as the longest label; the Italian tab is "Avvio automatico"
YouTube files were named <title> [<video id>].<ext>, so the name carried the link Files are named <title>.<ext>, with " (2)" when the name is taken
The installed stripper and converter said that uninstalling deletes downloaded tools They say that they downloaded nothing
"Disable all updates" reported success while Windows had put wuauserv and BITS back to their old start type The start types are read back; when Windows reverted one, the mode is rolled back and the message names the service
A DISM error without text showed only the code, "(0x800F0975)" The message falls back to the Windows text, then to a pointer to Logs\DISM\dism.log
Writing hosts failed once with 0x80070020 while another process had it open The replace is tried again for about six seconds

The scroll problem came from iced: Column::push leaves out a child whose width or height is fixed at 0, and the empty banner place holders had a height of 0. A new headless test builds the real view, scrolls a page, shows and dismisses a notice and reads the scroll offset back. It fails on 1.2.0 and passes on 1.2.1.

Tested

The unit and integration tests pass (511, clippy clean). New tests cover the scroll position around notices, the first window size and position on five screen sizes, the tab width in every language, the YouTube file names, the update mode read-back, the DISM fallback text and a replace while the target is held open.

The x64 packages of 1.2.1, built locally with packaging/build.ps1, and the same binaries ran in the VM:

Test Result
verify-install.ps1 -Version 1.2.1 (MSI, MSI with WCLANGUAGE=pl, setup.exe) No failed checks, nothing left after uninstall
setup.exe of 1.2.1 over the published 1.2.0 with a recorded session and German dark settings One visible entry, the binary reports 1.2.1, history byte for byte the same, settings kept, the drift check reads the 1.2.0 history, uninstall leaves nothing
WCLANGUAGE unset and set to each of the eight languages, through the MSI and setup.exe The value lands in HKLM, the app opens in that language, uninstall removes the key
Every page in every language, maximized, plus English and Ukrainian dark and German light 168 checks pass; the screenshots were looked through
First window on 1024x768 with a 48 px taskbar Opens at 8,8 to 1016,712 inside the 1024x720 work area; 1.2.0 opened at 156,156 to 1452,995
Extensions page of the installed 1.2.1, scrolled, a notice dismissed and a new one shown by clicking The page stays where it was both times
Inspector in Italian, Portuguese, Ukrainian and English Every tab label on one line
A real YouTube video as MP3 and MP4 Saved as "Me at the zoo.mp3" and "Me at the zoo.mp4", with no id in the name and no metadata inside
Engine unit tests in the VM 241 pass
Update modes (t06) without network Pass
Every reversible tweak applied and rolled back (t14) without network 53 tweaks clean; the Adobe block list needs the network to fetch its list

Not tested: the update mode read-back while Windows really reverts a service. With the network on, Windows Update was busy and wuauserv did not stop within 10 seconds, so the mode was rolled back before the read-back, as in 1.2.0. The DISM fallback text was not seen in the VM, because the error appears only while Windows is servicing. ARM64 is untested on ARM hardware, as before.

Known bugs

ID Bug Workaround
SEC-3 OOSU10.exe and Autologon.exe have no pinned hash, because their vendors publish them at fixed "latest" URLs. They must pass Authenticode. None needed.

Known limitations

Names and descriptions of catalog entries stay in English in every language, so the Windows Update page is mostly English. The other limitations of 1.2.0 still apply.

Downloads

File Use
WindowCraft-1.2.1-x64-setup.exe, WindowCraft-1.2.1-arm64-setup.exe Installer with a Start menu entry
WindowCraft-1.2.1-x64.msi, WindowCraft-1.2.1-arm64.msi For Intune, GPO or msiexec /qn
WindowCraft-1.2.1-x64-portable.exe, WindowCraft-1.2.1-arm64-portable.exe Runs without installing
SHA256SUMS.txt Checksums
THIRD-PARTY-NOTICES.md Licenses of the bundled Rust crates and of LAME

WindowCraft v1.2.0

Choose a tag to compare

@github-actions github-actions released this 08 Nov 15:28

WindowCraft 1.2.0

This release adds the Extensions page: a metadata stripper, a file converter, additional formats through ffmpeg and a YouTube downloader. None of them is installed until you choose it. Tweaks, applications, ISO Studio, Time Machine and the installers work as in 1.1.0.

Extensions

The page is the last one in the sidebar, under System & Gaming Inspector, and --open extensions opens it. Each extension has its own Install button. The two whose code is part of WindowCraft carry a blue "Made by WindowCraft" badge.

Extension Downloads Notes
Metadata stripper Nothing Part of WindowCraft, works offline
File converter Nothing Part of WindowCraft, works offline
Additional formats (ffmpeg) ffmpeg, about 90 MB Used only for what WindowCraft cannot do itself
YouTube downloader yt-dlp, ffmpeg and Deno, about 150 MB Shares ffmpeg with Additional formats

Downloaded tools go to %LOCALAPPDATA%\WindowCraft\tools. Uninstall on the page deletes the tools that no other installed extension still uses; uninstalling WindowCraft deletes the whole folder.

Tools come from their own GitHub releases through the GitHub API. The SHA-256 is taken from the release asset, or from the checksum file of the release when the asset has none, and a file that does not match is not used. The plain release download links are the fallback. On 2026-11-08 those links answered "504 Gateway Timeout" for hours while the API worked, which is what stopped the YouTube downloader in the test builds. A failed download is now tried 4 times with longer waits, and the job shows each attempt. When GitHub still does not answer, the message says so and asks to try again later.

Metadata stripper

The stripper writes a copy with -clean in its name and leaves the original as it was. It removes GPS location, camera data, dates, author, title, comments, cover art, chapters, thumbnails and editing history. In video and audio it also clears creation dates, encoder names and track names, and a phone's separate GPS track in an MP4 goes with its data.

WindowCraft reads and writes these formats itself: JPEG, PNG, WebP, GIF, MP3, AAC, FLAC, MP4, M4A, M4V, MOV, 3GP, MKV, MKA, WebM, AVI, WAV, AIFF, Ogg, Opus, WMA, WMV and ASF. In video and audio files the picture and sound data stay byte for byte the same; only the metadata around them is blanked or removed. A JPEG keeps its color profile and, when the photo is rotated, only the orientation tag. MKV and WebM keep their font attachments, which subtitles need. FLV, OGV and TS need Additional formats.

File converter

The converter has 21 targets. The new file is saved next to the original, with a number added when the name is taken.

Kind Targets Done by WindowCraft Needs Additional formats
Picture PNG, JPG, WebP, AVIF, BMP, TIFF, GIF, ICO PNG, JPG, WebP (lossless), BMP, TIFF, GIF, ICO up to 256 px AVIF, HEIC input, animated GIF input
Video MP4, MKV, WebM, MOV, AVI MP4, MOV, MKV and WebM when the streams fit the target, without re-encoding AVI, re-encoding, for example H.264 to WebM or a clip to GIF
Sound MP3, M4A, FLAC, WAV, OGG, Opus, AIFF, WMA MP3 (LAME, VBR V0), FLAC, WAV, AIFF; AAC into M4A and Opus into Opus without re-encoding OGG, WMA, AAC from other codecs

Pictures are turned upright from their EXIF orientation, and a transparent picture saved as JPG gets a white background. Sound is decoded by Symphonia from MP3, AAC, ALAC, FLAC, Vorbis, PCM and ADPCM. The video remuxer handles H.264, HEVC, VP9 and AV1 with AAC, Opus, MP3, AC-3 or FLAC, plus SRT and MP4 text subtitles; WebM gets no subtitles. Fragmented MP4 goes to ffmpeg. With ffmpeg installed, a JPEG converted to WebP is saved lossy; without it, lossless.

Without Additional formats, the converter names each file it could not convert and says that it needs them.

YouTube downloader

The downloader saves one video as MP4 (video with sound, H.264 when YouTube has it) or MP3 (sound only), from youtube.com, youtu.be, music.youtube.com and youtube-nocookie.com links. yt-dlp runs without an account, cookies, cache or config files and writes no info JSON, description, thumbnail, subtitles or comments. Partial files stay in a private folder that is emptied after every download, also a cancelled one. yt-dlp is fetched again when the copy is older than 14 days, and the older copy is used when GitHub cannot be reached.

Every finished download goes through the metadata stripper. YouTube writes "ISO Media file produced by Google Inc." with a date into the track names of its MP4 files; the stripper blanks those too, so ffprobe shows only the language tag and the file type of the saved file.

None of the extensions writes file names or links to windowcraft.log, and their file dialogs keep their choices out of the Windows Recent list.

Size and licenses

windowcraft.exe is 18.2 MB, 3.3 MB more than 1.1.0, for the image crate, Symphonia, flacenc and LAME. LAME is compiled into the program and is under the LGPL; Symphonia is under the MPL-2.0. NOTICE.md says where their source code is, and THIRD-PARTY-NOTICES.md carries their license texts.

Tested

The unit and integration tests pass (504, clippy clean at -D warnings). New tests cover the downloads with retries and cancel, the GitHub API asset lookup, the install markers and which tools an uninstall keeps, every native stripper container, Ogg page checksums and continuation flags, and the MP4 and Matroska readers and writers.

These tests ran against real files and real downloads on the development PC:

Test Result
Stripper on 15 formats tagged with a title, artist, comment, creation date, encoder and GPS position, only FLV through ffmpeg None of the values and no XMP is left in any clean copy, and every copy decodes without errors
Converter, every one of the 21 targets with ffmpeg installed, WindowCraft first Every output decodes
Pictures and sound through every native format, without ffmpeg Same size and sample count after the round trip; what needs ffmpeg reports so
Remux of H.264, HEVC, VP9 and AV1 with AAC, Opus, MP3, AC-3 and FLAC between MP4, MOV, MKV, WebM, M4A and Opus Same packet count as the source, decodes without errors, subtitle times match
A real YouTube video as MP4 and MP3, tools fetched through the GitHub API Both saved; the MP4 shows only the language tag and file type
A JPEG with EXIF rotation converted to PNG Saved upright

The page was checked on screenshots of a development build of 1.2.0 with no extension, two and all four installed. The buttons were not clicked by hand.

Not tested: HEIC input, a video over 4 GB, the ARM64 build on ARM hardware (it compiles; LAME is compiled with the ARM64 toolchain) and the installers in the VM. The installers and the uninstaller did not change since 1.1.0, apart from the notice files they carry.

Known bugs

ID Bug Workaround
SEC-3 OOSU10.exe and Autologon.exe have no pinned hash, because their vendors publish them at fixed "latest" URLs. They must pass Authenticode. None needed.

Known limitations

ffmpeg and yt-dlp are fetched from their "latest" GitHub releases and checked against the SHA-256 that the same release publishes, so the check catches a broken download, not a compromised release.

The builds are not code-signed yet, so SmartScreen warns on first run. No ARM64 binary has run on ARM hardware. The other limitations of 1.1.0 still apply.

Downloads

File Use
WindowCraft-1.2.0-x64-setup.exe, WindowCraft-1.2.0-arm64-setup.exe Installer with a Start menu entry
WindowCraft-1.2.0-x64.msi, WindowCraft-1.2.0-arm64.msi For Intune, GPO or msiexec /qn
WindowCraft-1.2.0-x64-portable.exe, WindowCraft-1.2.0-arm64-portable.exe Runs without installing
SHA256SUMS.txt Checksums
THIRD-PARTY-NOTICES.md Licenses of the bundled Rust crates and of LAME

WindowCraft v1.1.0

Choose a tag to compare

@github-actions github-actions released this 07 Nov 19:56

WindowCraft 1.1.0

This release adds a Settings page with an optional scheduled check for reverted tweaks, replaces the text of every catalog entry, and fixes the installer and the Start menu entry. The registry values, services and operations of the tweaks are the same as in 1.0.3.

Settings

The gear at the bottom of the sidebar opens Settings. The language list moved there from the sidebar, next to the theme (follow Windows, dark or light) and the new check for reverted tweaks. The theme choice is kept between runs; in 1.0.3 every start followed Windows again. --open settings opens the page directly.

Checking for reverted tweaks

Windows updates and other programs sometimes set a value back after WindowCraft changed it. WindowCraft already showed this as configuration drift when it opened. Settings can now also check on a schedule: daily, every 7 days or every 30 days, and after the Windows build number changes, which happens with every cumulative update. Both options are off by default, and Check now runs the comparison straight away.

When one of them is on, WindowCraft registers a scheduled task named WindowCraft drift check (<user name>). It runs as that user, without elevation, three minutes after sign-in and at noon, and a missed noon run starts once the computer is on again. Each run reads settings.json, compares only when the interval has passed or the build changed, and exits at once otherwise. It reads the system and changes nothing. While the WindowCraft window is open it does nothing, because the window shows the same banner.

If a tweak was reverted, a Windows notification says how many, and clicking it opens Time Machine, where Re-apply puts the values back. When Windows notifications are turned off, a message box asks the same question. Turning both options off deletes the task, and the uninstaller deletes it for every user.

Catalog text

Every name and description in the catalogs is new: 239 applications, 68 tweaks, 33 System tools and 34 AppX packages. Names now say what happens, for example "Turn off activity history" for what was "Activity History - Disable", and application names lost their bracketed tags. Application and AppX categories have new names.

Profiles keep working, because the ids did not change. The ids that WinUtil uses in its exported configs now live in a separate table, winutil-import.json, and --config imports WinUtil files as before.

The presets are chosen anew:

Preset Tweaks
Minimal 6: restore point, telemetry, activity history, location, promoted app installs, device metadata downloads
Standard 13: Minimal plus Delivery Optimization, Store suggestions in search, folder type discovery, WPBT, services to manual, End task on the taskbar, temporary files
Advanced 21: Standard plus Widgets, Windows AI components, Edge promotions, background apps, the classic right-click menu, Home and Gallery, Razer and Logitech auto-installs

The default AppX selection has 14 packages instead of 18. Calculator, Clock, Sound Recorder and Sticky Notes are no longer in it. ISO Studio removes the same 14 packages plus Teams.

PowerShell profile

The System page no longer downloads the CTT PowerShell profile. It installs a profile that is part of WindowCraft: history search with the arrow keys, list suggestions from history, a prompt with the folder, the git branch (read from .git\HEAD, so the prompt never starts git) and an admin marker, and the commands which, ll, touch, mkcd, grep, df, uptime, flushdns, admin and reload. Lines that look like they contain a password or token stay out of the history file. The profile downloads nothing and updates nothing.

Two bugs in the old install and remove steps are fixed. Installing a second time replaced the backup of your own profile with the first WindowCraft profile, so removing it later could not bring yours back. And removing it deleted whatever profile was there, even one you wrote after installing.

Installer and Start menu

The first page of setup.exe has a checkbox, checked by default, that starts WindowCraft when setup finishes. The app starts as the signed-in user without elevation. With /quiet or /passive it never starts, and LaunchWindowCraft=0 on the command line clears the checkbox.

setup.exe now picks its language from the Windows display language. Before, it went by the regional format, so a Polish Windows with US date and number formats got the English pages.

The Start menu shortcut is a plain shortcut now. In 1.0.3 it was an advertised shortcut, which Windows ties to the MSI, and setup.exe hides that MSI from Installed apps. The setup.exe entry also carries an InstallLocation, which it had none of before.

Rollback fixes

"Turn off Windows telemetry" now writes AllowTelemetry as the Group Policy value, HKLM\SOFTWARE\Policies\Microsoft\Windows\DataCollection, which is the documented "Allow Diagnostic Data" policy (KB-15). Up to 1.0.3 it wrote the copy under HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection. That copy belongs to the DiagTrack service: in the VM, DiagTrack wrote back whatever value was last stored there within 10 seconds of a delete, and again after a restart. So a rollback deleted the value and Windows put 0 back, and diagnostic data stayed at its lowest level. The policy value is removed for good, also across a DiagTrack restart. A session recorded with 1.0.3 or earlier still points at the old copy, so rolling it back leaves that value; turning "Send optional diagnostic data" back on in Settings restores the level.

Rolling back "Turn off hibernation" failed on hardware without hibernation support, because powercfg /hibernate on exits with an error there (KB-16). WindowCraft now asks the firmware first and skips turning hibernation on when there is no S4 state.

Both came out of a new live test that applies and rolls back every tweak that can be undone, one at a time, and compares every registry value and service it touches 10 seconds later.

Interface

In grouped lists, the hover and press highlight of the first and last row followed a square outline and covered the rounded corners of the group. It now follows the corners. The one-pixel highlight line along the top of each group is gone too; it was drawn straight across and showed as a bar past the rounded corners. The hover highlight fades in and out over 110 ms, or appears at once when Windows animations are off.

Tested

The unit and integration tests pass (449, clippy clean at -D warnings). New tests cover the settings file, the check schedule, the scheduled task (registered and deleted for real on the development PC without elevation), the corner radii, the hover fade, the profile backup rules and the new presets.

In VirtualBox on Windows 11 Home 26H2, build 26300, Polish, from a clean snapshot:

Check Result
setup.exe /quiet of 1.0.3, then of 1.1.0 Exit 0; one visible entry "WindowCraft 1.1.0" with InstallLocation; the shortcut points at windowcraft.exe (it pointed into C:\Windows\Installer with 1.0.3); history byte for byte the same; the quiet install did not start the app
windowcraft.exe --scheduled-check with a reverted tweak Notifications did not show in the VM, so the message box appeared in Polish; Yes opened Time Machine with the drift banner; the run was recorded in settings.json and the language key kept; nothing on the system changed
A second run right after Exits within a second
Start, right-click on WindowCraft "Odinstaluj" is in the menu and opens Installed apps, where WindowCraft 1.1.0 is listed once
Uninstall through the setup.exe entry Exit 0; a drift check task created beforehand is gone, with the program folder, data folder, shortcut and every uninstall entry
setup.exe with its interface over 1.0.3 Pages in Polish, the launch checkbox checked; after the install WindowCraft opened without elevation ("Standard user") and the last page read "Instalacja zakończona pomyślnie"

A second VirtualBox run from the clean snapshot covered the rest of the app:

Phase Result
verify-install.ps1 on the MSI, the MSI with WCLANGUAGE=pl and setup.exe 57 of 57 passed
MSI upgrade from 1.0.3 with a recorded session, uninstall while the app runs, portable --purge-data All passed; history byte for byte the same
Command line: protected services, Disable ALL Updates, --run, --check-drift, --fix, --export-report All passed
Live tests t01 to t07: tweaks, drift, services, AppX for all users, optional features, update modes, BitLocker All passed
t10: the PowerShell profile installed twice over a profile of the user's own, loaded, removed Passed; the user's profile came back
t11: the scheduled check as Settings creates it, then started by Task Scheduler Passed; the task runs without elevation as the user, with 2 triggers, and its run was recorded
t12: the Standard preset applied and rolled back Passed, with a restore point created
t13: every value of the telemetry tweak after a rollback, and again 20 s later Passed; the Settings store copy is not touched
t14: each of the 54 tweaks that can be undone applied and rolled back on its own Found KB-15 and KB-16, then passed

ISO Studio and USB writing (t08, t09) did not run again; their code did not change since they passed for 1.0.1.

On the development PC the Settings page, the gear button and the rounded hover on the first and last row of a group were checked on screen with the GPU renderer and with ICED_BACKEND=tiny-skia. The notification there was dropped at once, because Windows notifications are turned off on that PC; that is the case the message box covers.

Not reproduced: in the VM, Uninstall in the Start menu opened Installed apps with 1.0.3 as well, so the failure seen with 1.0.3 did not happen ther...

Read more

WindowCraft v1.0.3

Choose a tag to compare

@github-actions github-actions released this 07 Nov 14:14

WindowCraft 1.0.3

This release fixes bugs. Nothing that changes the system is different from 1.0.2.

Control Panel buttons

On the System page, the buttons that open a Control Panel applet failed with a notice such as "ShellExecuteW failed for main.cpl" and error 0x0000001F. Ten buttons were affected: Mouse Properties, Network Connections, Power Panel, Programs and Features, Region, Security and Maintenance, Sound Settings, System Properties, Time and Date, and Windows Defender Firewall. WindowCraft asked Windows to open the .cpl file, and the cplfile type has no open verb; its default verb is cplopen. ShellExecute then returned code 31, which the notice showed with the unrelated system message for ERROR_GEN_FAILURE ("A device attached to the system is not functioning").

Applets now open through control.exe, which is how Windows itself starts them. Every other target, such as Computer Management or Windows Restore, opens with its default verb. When a launch does fail, the notice shows the real Windows message. Declining the UAC prompt for Windows Restore no longer shows an error.

Uninstall closes an open WindowCraft

Uninstalling while WindowCraft was open removed its files and data, and the window kept running until it was closed (KB-9). The uninstaller now closes it first. A window in the user's session cannot be asked to close from the Windows Installer service, which runs as SYSTEM in another session, so before it removes files the uninstaller runs windowcraft.exe --close-running. That ends every process started from the program folder, windowcraft-cli.exe included, and waits up to 10 seconds for each to exit. A copy of the portable build somewhere else keeps running.

An upgrade from 1.0.3 to a later version removes 1.0.3 the same way, so it closes the app too. An upgrade from 1.0.2 to 1.0.3 does not: 1.0.2 has no such step. A job that is still running when the app is closed stops as if the process had crashed.

Translations

The configuration drift banner and the drift details on the Time Machine page were in English in every language. They are translated into the other seven languages now.

Tested

The unit and integration tests pass (432, with clippy clean at -D warnings). On the development PC, Windows 11 Home 26H2, build 26300, Polish, the Mouse Properties applet opened through the new code path, and a test checks that every applet the System page opens exists in System32. The other nine applets go through the same path but were not clicked one by one.

In VirtualBox on the same Windows build, from a clean snapshot:

Check Result
verify-install.ps1 on the MSI, the MSI with WCLANGUAGE=pl and setup.exe 57 of 57 passed, including a window opened before the MSI and the setup.exe uninstall and closed by it
MSI uninstall while the app is open Exit 0, the window closed, data and program folder removed. The log shows 1 process closed 130 ms before the data was purged
MSI upgrade from 1.0.2 with a recorded session Exit 0, history byte for byte the same, one uninstall entry, 1.0.3 reads the 1.0.2 history
setup.exe of 1.0.2-rc1, then of 1.0.2 (two entries, KB-10), then of 1.0.3 Exit 0 each time; after 1.0.3 one entry is left, "WindowCraft 1.0.3", with one MSI product and the history byte for byte the same
Uninstall of that entry with the window open Exit 0, the window closed, no entry, program folder or data left
Portable --purge-data Data folder removed

KB-10 is gone with this release: setup.exe of 1.0.3 replaces both entries that 1.0.2-rc1 and 1.0.2 left. Not tested: an uninstall from Settings with the full MSI interface, where Windows may first show its own "files in use" dialog.

Known bugs

ID Bug Workaround
SEC-3 OOSU10.exe and Autologon.exe have no pinned hash, because their vendors publish them at fixed "latest" URLs. They must pass Authenticode. None needed.

Known limitations

Mica shows behind the sidebar only on the CPU path.

The builds are not code-signed yet, so SmartScreen warns on first run.

ARM64: the files build and have the right platform, but no ARM64 binary has run on ARM hardware, and the GPU path is untested there.

Everything else in the limitations of 1.0.1 still applies: Time Machine cannot restore removed packages, uninstalled apps or BitLocker decryption; an uninstall deletes Time Machine history for every user; the portable build has no uninstaller; and an ISO build installs oscdimg through WinGet when it is missing.

Downloads

File Use
WindowCraft-1.0.3-x64-setup.exe, WindowCraft-1.0.3-arm64-setup.exe Installer with a Start menu entry
WindowCraft-1.0.3-x64.msi, WindowCraft-1.0.3-arm64.msi For Intune, GPO or msiexec /qn
WindowCraft-1.0.3-x64-portable.exe, WindowCraft-1.0.3-arm64-portable.exe Runs without installing
SHA256SUMS.txt Checksums
THIRD-PARTY-NOTICES.md Licenses of the bundled Rust crates

WindowCraft v1.0.2

Choose a tag to compare

@github-actions github-actions released this 07 Nov 10:35

WindowCraft 1.0.2

This release makes scrolling and animation smooth. It moves drawing to the GPU and eases the mouse wheel. Nothing that changes the system is different from 1.0.1.

Smooth scrolling

A mouse wheel notch used to move a list by 60 pixels in one frame. The list now glides there in about 150 ms. A critically damped spring carries it: a new notch moves the target and keeps the current speed, so spinning the wheel fast gives one even motion instead of a jolt per notch, and a notch in the other direction turns the list on the next frame. A click stops the motion where it is. The distance per notch follows the "lines to scroll" setting in Windows, at 20 pixels a line, so the default is still 60. With Windows animations turned off, the wheel jumps as before.

Windows reports touchpad scrolling as small wheel notches, so touchpads are eased too.

Inside a scrolling list, Ctrl and the wheel over a drop-down now scroll the list. In 1.0.1 they changed the selected option, and on settings that apply at once that changed the system.

Drawing on the GPU

WindowCraft used to paint every frame on the CPU through tiny-skia. On a 2560 by 1440 window a scrolled frame took about 36 ms, so eased scrolling ran at roughly 25 frames per second and looked worse than the old jump. The interface now draws through wgpu on Direct3D 12. On the test PC, a GeForce RTX 2060 with a 164 Hz display, 152 frames of a fast wheel spin came 6.07 ms apart on average, with the slowest at 6.85 ms, so every refresh got a frame.

A computer without a Direct3D 12 GPU, for example a virtual machine without 3D acceleration, draws through tiny-skia as before. WindowCraft checks for such a GPU at startup instead of letting wgpu fall back to WARP, the software rasterizer of Direct3D. ICED_BACKEND=tiny-skia or ICED_BACKEND=wgpu picks the renderer by hand.

Animation frames follow the display refresh. The GPU waits for it on its own; on the CPU path a frame clock wakes just after each vertical blank that DWM reports, instead of drawing as fast as one core allows. Springs stop once they move less than a quarter of a pixel, so opening the inspector takes 34 frames instead of 63 and a page change 26 instead of 43. A new page or tab rises 8 pixels into place, and the WinGet and Chocolatey switch slides like the other segmented controls.

The price is memory and size. With the Applications page open, the GPU path had a 113 MB working set where the CPU path had 32 MB, and the x64 executable grew from 10.6 MB to 14.0 MB. wgpu is built with Direct3D 12 only; with Vulkan and GL as well it used 191 MB.

For developers

WINDOWCRAFT_SCROLL_TRACE=<file> writes one line per eased scroll frame: time, time since the previous frame, pixels moved, pixels left and speed. crates/windowcraft-app/tests/frame_bench.rs measures view, layout and painting of each page on the CPU renderer without a window; run it with cargo test --release -p windowcraft-app --test frame_bench -- --ignored --nocapture.

The MSI now installs over a build of the same version instead of beside it, and the release workflow publishes tags with a suffix, such as v1.0.2-rc1, as pre-releases.

Tested

On the PC above, the GPU path ran the wheel test and the memory figures. In VirtualBox on Windows 11 Home 26H2, build 26300, Polish, with 2 virtual CPUs and no 3D acceleration, from a clean snapshot:

Check Result
Renderer without a GPU tiny-skia on every page, 32 to 46 MB working set
verify-install.ps1 on the MSI, the MSI with WCLANGUAGE=pl and setup.exe 53 of 53 passed
MSI upgrade from 1.0.1 with a recorded session Exit 0, history byte for byte the same, one uninstall entry, 1.0.2 reads the 1.0.1 history
Uninstall while the app is open Exit 0, data and program folder removed; the window kept running (KB-9)
Portable --purge-data Data folder removed
Every page opened from --open The window opened and kept responding
Mouse wheel through SendInput, 20 notches Applications, Tweaks and System scrolled; only these three long pages were checked for movement
CPU with the window idle, before and after scrolling 0% on every page
setup.exe of 1.0.2 over setup.exe of 1.0.2-rc1 Exit 0 and one MSI product, but two entries in Installed apps (KB-10); removing the older one left 1.0.2 installed

Known bugs

ID Bug Workaround
KB-10 If 1.0.2-rc1 was installed with setup.exe, installing 1.0.2 with setup.exe leaves two "WindowCraft 1.0.2" entries in Installed apps. Both have the same version, and the WiX 3 bootstrapper keeps the older one. Uninstall 1.0.2-rc1 before you install 1.0.2; this also deletes its Time Machine history. If both entries are already there, WindowCraft 1.0.2 works and the extra entry can stay. Removing the entry installed first left 1.0.2 in place in the test; removing the other one was not tested.
KB-9 Uninstalling while WindowCraft is open removes the files and data, and the open window keeps running until it is closed. Close WindowCraft before you uninstall.
SEC-3 OOSU10.exe and Autologon.exe have no pinned hash, because their vendors publish them at fixed "latest" URLs. They must pass Authenticode. None needed.

Known limitations

Mica shows behind the sidebar only on the CPU path. wgpu presents through a Direct3D 12 swap chain without an alpha channel that DWM could blend, so on the GPU the sidebar is solid.

The builds are not code-signed yet, so SmartScreen warns on first run.

ARM64: the files build and have the right platform, but no ARM64 binary has run on ARM hardware, and the GPU path is untested there.

Everything else in the limitations of 1.0.1 still applies: Time Machine cannot restore removed packages, uninstalled apps or BitLocker decryption; an uninstall deletes Time Machine history for every user; the portable build has no uninstaller; and an ISO build installs oscdimg through WinGet when it is missing.

Downloads

File Use
WindowCraft-1.0.2-x64-setup.exe, WindowCraft-1.0.2-arm64-setup.exe Installer with a Start menu entry
WindowCraft-1.0.2-x64.msi, WindowCraft-1.0.2-arm64.msi For Intune, GPO or msiexec /qn
WindowCraft-1.0.2-x64-portable.exe, WindowCraft-1.0.2-arm64-portable.exe Runs without installing
SHA256SUMS.txt Checksums
THIRD-PARTY-NOTICES.md Licenses of the bundled Rust crates

WindowCraft v1.0.2-rc1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 06 Nov 22:34

WindowCraft 1.0.2-rc1

This is a pre-release of 1.0.2. It changes how the interface scrolls and animates and nothing that touches the system. If it holds up, this release becomes the stable 1.0.2 as it is, with the same files.

Scrolling and animation

A mouse wheel notch used to move a list by 60 pixels in one frame. The distance now arrives over about 150 ms, eased out, and a notch in the other direction cancels what is left. The distance per notch follows the "lines to scroll" setting in Windows, at 20 pixels a line, so the default is still 60. Touchpads that report pixels scroll as before. With Windows animations turned off, the wheel jumps the old way.

Animations now wait for the display. The software renderer presents through GDI, which never waits for the screen, so an animation used to draw as fast as one core allowed and its frames landed at uneven points between refreshes. Each animation frame now starts just after a vertical blank, timed from the refresh period that DWM reports, so every frame advances by the same step and an idle window still uses no CPU.

Springs stop once they move less than a quarter of a pixel. Before, they ran until the error was under 0.0005 units, which for the inspector drawer meant 63 frames, the last 33 of them invisible and each a full repaint. The drawer now takes 34 frames, and a page change 26 instead of 43.

A new page or tab rises 8 pixels into place over 220 ms. The transition runs inside its widget and only asks for redraws, so it never rebuilds the view. The WinGet and Chocolatey switch on Applications now slides like the other segmented controls.

Speed

Layout, text shaping and glyph rendering in Iced were built for size (opt-level = "z") and run on every animated frame. They are now built for speed, like the tiny-skia rasterizer already was. In a headless benchmark, building every crate for speed painted frames 10 to 15 percent faster; this release does that only for the crates on the frame path, and the x64 executable grew from 11.11 MB to 11.59 MB.

The fades at the top and bottom of every list are drawn as solid bands of falling opacity instead of a gradient, which tiny-skia paints through its slower high-precision path.

The benchmark that measured all of this is crates/windowcraft-app/tests/frame_bench.rs. It is ignored by default; run it with cargo test --release -p windowcraft-app --test frame_bench -- --ignored --nocapture. It showed that painting pixels, not building the view, takes over 90 percent of a frame, and most of that is text. Pages with long registry paths, such as Tweaks, cost the most.

Installers

The MSI accepts a build of the same version over the installed one instead of installing beside it. setup.exe does not: its WiX 3 bootstrapper keeps the entry of an older bundle with the same version, so a second build of 1.0.2 over the first left two entries in Installed apps. That is why this release turns stable without a rebuild. The release workflow accepts tags with a suffix such as v1.0.2-rc1 and publishes them as pre-releases; before, the version check rejected them.

Tested

In VirtualBox on Windows 11 Home 26H2, build 26300, Polish, 2 virtual CPUs and no 3D acceleration, from the clean snapshot used for 1.0.1:

Check Result
verify-install.ps1 on the MSI, the MSI with WCLANGUAGE=pl and setup.exe 52 of 52 passed
MSI upgrade from 1.0.1 with a recorded session Exit 0, history byte for byte the same, one uninstall entry, 1.0.2 reads the 1.0.1 history
Uninstall while the app is open Exit 0, data and program folder removed; the window kept running (KB-9, unchanged)
Portable --purge-data Data folder removed
Every page opened from --open The window opened and kept responding
Mouse wheel through SendInput, 20 notches Applications, Tweaks and System scrolled; only these three long pages were checked for movement
CPU with the window idle, before and after scrolling 0% on every page
CPU while scrolling 10 notches a second 93% of one core on Applications, 65% on System, 47% on Tweaks
Same version over itself The MSI replaced the first install; setup.exe left two entries

The VM has no GPU, so every frame is painted on a virtual CPU. In it, the frame benchmark took 21 ms for a frame of Applications at 100% scaling and 38 ms at 150%; about 10 and 20 ms of that is a copy into a screenshot buffer that the real window does not make. Faster hardware paints more frames in the same 150 ms of easing, and a slow one paints fewer, but the list lands in the same place in the same time.

Known bugs and limitations

Nothing changed here since 1.0.1; see the 1.0.1 release notes. SEC-3 and KB-9 are still open, and the builds are still not code-signed.

Downloads

File Use
WindowCraft-1.0.2-x64-setup.exe, WindowCraft-1.0.2-arm64-setup.exe Installer with a Start menu entry
WindowCraft-1.0.2-x64.msi, WindowCraft-1.0.2-arm64.msi For Intune, GPO or msiexec /qn
WindowCraft-1.0.2-x64-portable.exe, WindowCraft-1.0.2-arm64-portable.exe Runs without installing
SHA256SUMS.txt Checksums
THIRD-PARTY-NOTICES.md Licenses of the bundled Rust crates