Repository navigation
v2.7.0
WinTUI v2.7.0 Release Notes
WinTUI v2.7.0 rebuilds the Cleanup tab around a registry-driven target
model, adds first-class export / import for moving package lists between
machines, and fixes a long-standing toast-body cosmetic bug.
Cleanup tab — registry-driven multi-target cleanup
The previous Cleanup tab was a single scanner over %TEMP% with a
global success/failure summary. v2.7.0 replaces it with a workspace
that mirrors the Packages tab: grouped bordered panels on the left,
per-target detail pane on the right, persistent per-row toggle state.
Targets
Seventeen registered targets across four groups, each with a stable ID
that's part of the on-disk contract (settings persist user opt-ins by
ID). Detect-if-present targets only appear when their resolved path
exists on the machine.
| Group | Default | What's in it |
|---|---|---|
| Core Temp | checked | %TEMP%, %WINDIR%\Temp, user crash dumps, WER queue, system minidumps |
| Caches | checked | DirectX shader cache, Explorer thumbnail cache (thumbcache_*.db glob) |
| Developer | unchecked, opt-in | npm cache, Go build cache, pip wheel cache, Yarn cache |
| GPU | unchecked, opt-in | NVIDIA DX/GL caches, AMD DX/GL caches, Intel shader cache |
%WINDIR%\Temp and system minidumps are flagged [suggests admin] —
they require elevation to clean cleanly. Cleanup routes them through
the existing elevated helper-pipe rather than spawning a fresh
elevation channel, so UAC fires once and Defender doesn't see a new
static surface.
Auto-scan policy
A new tri-state setting cleanup_auto_scan controls what gets sized
when you open the tab:
safe(default) — scan Core Temp, Caches, and any present GPU
vendor caches. Developer caches stay quiet until you check them.all— scan every present target on tab open.off— never auto-scan. Presssto size the focused row,rto
rescan everything visible.
Per-target scans run as background goroutines. You can cursor and
toggle freely while sizes land. Tabbing away cancels in-flight scans;
already-completed results persist for the session.
Confirm gate + admin framing
Pressing enter on the cleanup tab opens a centered confirm modal
listing only the checked targets that have a non-zero size. Slow
or unwanted scans don't block the action. When admin targets are in
the queue, the modal pre-emptively explains the UAC prompt and
includes the AV-FP disclosure: "If your antivirus flags this, that's
a known false positive on bulk file delete — WinTUI only touches the
listed paths."
Cleanup state machine: ready → confirming → executing → done with
an explicit partialFailure substate when any target reported
failures. The done view sorts results by freed-bytes desc so the
most impactful target appears first, and a generation token guards
against late-arriving stale scan results from cancelled goroutines.
Settings persistence
Default-checked targets are always on by design and never persisted —
that would be on-disk noise. Only positive opt-ins for non-default
rows go to settings.json under a new cleanup_enabled_targets
list. Toggling a Developer or GPU row writes the change immediately;
the next session opens with your selections intact.
Toast on completion
When toast notifications are enabled, a single Windows toast fires on
cleanup finish: "Freed X across N target(s)" or, on partial failure,
"Freed X; N targets had locked files."
Export / Import — portable package lists
Two new CLI commands move installed package lists across machines:
wintui export [--output PATH] [--with-versions]
wintui import <path> [--dry-run] [--all] [--json]wintui export writes a versioned JSON envelope (top-level object with
version, generator, created, host, packages fields). Versions
are excluded by default — restoring exact versions on a fresh machine
is a footgun. Stdout is reserved for clean JSON when no --output is
given, so wintui export | jq works as documented; warnings about
unrecoverable truncated IDs go to stderr.
The new envelope is the default writer; wintui import accepts both
the envelope and the legacy flat-array form for backward compatibility
with anything users hand-rolled before this shipped.
Three-category install plan
--dry-run prints the install plan without touching anything:
- Will install — packages not currently on the machine, canonical
IDs, no name collisions - Already installed — same ID match against the local list
- Review needed — entries whose normalized name matches a
different installed package (e.g. exportingGit.Gitwhen
Microsoft.Gitis already installed). Default-skipped; pass
--allto install them anyway - Non-canonical — MSIX hashes, ARP entries, and GUIDs that
winget --id --exactcan't restore
The Review needed category is the locked design's safety net for the
common cross-machine case where the same software exists under two
different package IDs. Preview with --dry-run and decide.
TUI integration on the Packages tab
e— exports the installed list to a dated, time-stamped file on
your Desktop (wintui-packages-2026-05-05_143022.json). Two presses
produce distinct files. Fires a toast and shows a transient status
line on success.Shift+I— opens the import overlay. It scans Desktop, home, and
cwd for*.jsonfiles, lets you toggle which entries to install
(collisions stay unchecked by default), then runs the install
through the existing batch flow. The package list reloads when the
overlay closes.
The import overlay was a half-built feature in earlier versions —
v2.7.0 finishes the wiring and brings the visual style up to the
current theme (titled panels, mint-cyan for intent, pink for
structure, centered confirm modal).
Truncated-ID safety
Long package IDs are sometimes truncated by winget list when the
output column hits its width limit. v2.7.0's export resolves any
truncated canonical IDs upfront via resolveTruncatedPackage, so
they don't round-trip into the export and fail at import time with
winget --id --exact returning 0x8a150014. Non-canonical IDs
(MSIX/GUID/Foo_hash) that report truncated are kept verbatim — the
import side classifies them as Non-canonical (can't restore)
rather than dropping them silently from the inventory.
Bug fixes
- Toast verb on uninstall batches said "upgraded" —
notifyBatchFinishhardcoded "upgraded" regardless of the batch's
operation. The toast now picksinstalled/uninstalled/
upgradedfrom the batch action and falls back tocompleted
on heterogeneous batches.
Settings
Two new keys in settings.json, both with sensible omit-empty
defaults so existing config files stay diff-clean:
| Key | Type | Default | Behavior |
|---|---|---|---|
cleanup_auto_scan |
safe / all / off |
safe (omitted) |
Controls what the Cleanup tab scans on open |
cleanup_enabled_targets |
string array | [] (omitted) |
Persisted opt-in list of advanced cleanup target IDs |
Both are exposed in the Settings tab UI as well as editable directly
in settings.json.
Notes
- No breaking changes. Existing
settings.jsonfiles, exported
package lists in the legacy flat-array format, and prior tab key
bindings all continue to work. - No new Win32 surface. Source-level import diff vs v2.6.1
confirms zero newsyscall/windows/golang.org/x/sys/windows
imports across the entire dev branch. The cleanup tab and
helper-pipecleanup_deleteaction both ride on top of the v2.6.1
elevation channel rather than opening a new one. Empirical
validation on a real Windows host confirmed UAC fires once and
Defender stays quiet on the new bulk-delete-via-elevated-helper
pattern. - WinTUI itself is included in
wintui export. On import it gets
marked already-installed automatically — by definition you must
have WinTUI installed to run import in the first place.
Verification
VirusTotal scans of the published artifacts for v2.7.0 (run 2026-05-06):
| Asset | SHA256 | Detections | Report |
|---|---|---|---|
wintui_2.7.0_windows_amd64.exe (6.8 MB) |
f20a5ba9e699… |
2/71 | VT report |
wintui_2.7.0_windows_amd64.zip (2.4 MB) |
5b4bce8ee534… |
0/68 | VT report |
wintui_2.7.0_windows_arm64.exe (6.3 MB) |
17728100a1ed… |
1/69 | VT report |
wintui_2.7.0_windows_arm64.zip (2.2 MB) |
868836d13a89… |
0/67 | VT report |
Microsoft Defender returns clean across all artifacts (engine
1.1.26030.3008, definitions 20260506). The Bkav and Trapmine entries
on amd64.exe are single-vendor low-signal ML noise — generic
novel-binary scoring rather than a named threat family. The McAfeeD
ti!<hash> flag on arm64.exe is a reputation-hash signal, the same
kind that appeared on prior cleared releases. No flag is reproducible on
live deployed Defender.
Full SHA256 hashes:
wintui_2.7.0_windows_amd64.exe:f20a5ba9e699f111867f7d3e6f531bbde2d31c7f64aa6775a01bf808aaa1e5c6wintui_2.7.0_windows_amd64.zip:5b4bce8ee534b024b5cb27597f6f91dd9301b6e31508e6d7cd6cac679ab50e2fwintui_2.7.0_windows_arm64.exe:17728100a1ed4042a3f0f5dd469408b1296515866b33fb03a86a8c9ea1add886wintui_2.7.0_windows_arm64.zip:868836d13a89df918ace21ac88691bc3fb2e55df04da4b41f26f286087c35b58