Skip to content

v1.1.0: Codebase Audit, Self-Update & Live Theme Editing

Choose a tag to compare

@github-actions github-actions released this 20 Aug 01:24
· 17 commits to master since this release

The 2026-08-19 codebase audit, implemented, and the features it recommended. Deletion
outside the cleanup engine now goes through the same protected-path layer; the shipped
executable honours command-line arguments and carries an icon and version metadata; the
Storage view measures the tree once instead of three times; Linux gets real gaming and
GPU cache coverage. Crash dumps, storage snapshots, scheduled scans, verified in-place
updates, sub-commands and file-level review are new. Every colour pair the interface
draws now meets WCAG AA on every theme, and changing a theme is four and a half times
faster than it was, which is what makes editing one with the whole window following
along possible.

Fixed

  • Windows 11 was reported as Windows 10: Microsoft never changed the registry's ProductName, so it reads "Windows 10 Pro" on an 11 machine and both the PC Specs page and the About page repeated it. The build number is the only thing that distinguishes them, and it is already read.
  • The About page described a different application: four of its five facts were string literals. Platform said "Windows 10 / 11 / Linux (64-bit)" on every machine including the Linux ones, Python said 3.12 while the project supports 3.10 and up, and the toolkit row said "Fluent 2 Dark Theme" - written before the 44 themes and the Studio existed. It now reports what is running. "Zero Telemetry: 100% local" went too: opening that page asks GitHub for the contributor list. Nothing about the user is sent, which is the claim worth making, so it makes that one.
  • The contrast engine tries both directions: it chose to lighten or darken from the background's luminance and gave up if that direction could not reach the ratio. #3b82f6 sits at 0.22 luminance, just inside "dark", so white could only be lightened - it is already white - and the failing colour was returned unchanged. Text was also corrected against the single background it fared worst on, which is only sound while the correction can move one way; it is now moved to the nearest lightness that clears every background it is drawn on.
  • A duplicate group always keeps a copy: "Select All" in the duplicate review dialog checked every copy, and confirming recycled all of them - which removes the content itself, since a group only exists because those files are identical. Confirmation is refused while nothing is kept.
  • Duplicate and large-file deletion is validated: both views called the filesystem helpers directly, so the protected-path rules that guard category cleanup never ran. Discovery no longer offers protected content at all, and every deletion routes through one core helper that validates each path and reports what it refused.
  • Pattern-limited cleanup keeps non-matching files: a target such as Prefetch with *.pf deleted whole sub-directories outright, taking unrelated files with them and skipping the per-file safety check. Only matching files are removed, and a directory goes only if processing left it empty.
  • Windows service names cannot alter a command: start, stop, restart and startup-type changes interpolated the service name into a PowerShell command string. The name is passed through the environment instead, so a name containing a quote is data rather than syntax.
  • Memory actions say what they do: the standby purge documented one system call and made five; the working-set flush made an undocumented system-wide call, now removed. "Flush all available memory" reported success even when every step failed. The figure shown afterwards is the change in system-wide available memory, labelled as such and no longer clamped at zero.
  • Damaged settings are preserved: an unreadable config.json silently reset to defaults and was then overwritten, taking the user's exclusion list with it. The file is kept as config.json.corrupt and the window says so.
  • Cleanup preview totals are complete: the walk stopped at the 500-item display cap, so a category with 50 000 files reported the size of the first 500.
  • "Find big files" stops skipping game folders: the skip list was matched as a substring of the whole path, so Games\MyGame\WindowsNoEditor was skipped along with C:\Windows.
  • "Old files" returns the oldest files: it returned whichever files the traversal reached first, then sorted those.
  • Scans say when they were cut short: hitting the file budget silently capped the total, and the partial figure could be cached as if complete.
  • Hardlinks are not counted as reclaimable: additional names for one file were reported as duplicate copies whose deletion would free nothing.
  • The scan cache and history log are bounded: neither ever removed an entry.
  • The frozen executable honours arguments: the packaged launcher ignored sys.argv, so every documented command-line option opened the interface instead. It also shipped with no icon and no version metadata.

Added

  • See every file before it goes: Review files… in the cleanup confirmation lists the exact paths a cleanup would remove, and unticking one leaves it alone. The manifest engine and its per-item selection have existed since 1.0.3 and only the command line could reach them.
  • Crash dumps: application crash dumps and kernel MEMORY.DMP files are now a cleanup category and a command (crapcleaner crash-dumps), grouped by the application that wrote them. The analyzer was written and tested but unreachable; a full memory dump is routinely the largest removable file on a Windows system.
  • Changes since last scan: each storage scan is remembered, so the next one reports which folders grew and by how much - the question people actually arrive with. crapcleaner storage <path> --compare, or the new section in the Storage view.
  • On-disk size: an optional mode measuring what files occupy rather than their length, so totals line up with the free space the OS reports for compressed, sparse, and very small files. --allocated, or the checkbox in the Storage view.
  • Scheduled scans: Settings -> Scan Performance sets one up, or crapcleaner schedule enable --at 18:00 from the command line. Either registers a Task Scheduler entry or a systemd user timer, and the section reports what the operating system actually has registered rather than what was last asked for. A scheduled run only ever scans. core/scheduler.py was dead code; it is now the real thing.
  • Updates that update: Check for Updates now downloads the new release, verifies its SHA-256 against the published checksums, replaces the application, and starts it again. The running version is only replaced after the new one is downloaded and verified, the old binary is kept until the new one starts, and a failed swap restores it. Also available as crapcleaner update install.
  • Sub-commands: crapcleaner scan, clean, storage, update, schedule and the rest, with per-command help. Every existing flag still works exactly as before.
  • Saved themes are real themes: Save to Gallery… in the Custom Theme Studio writes the current colours to a theme file. It appears in the gallery under Custom, and right-clicking offers Show the theme file and Delete. Editing is done in the file, which reloads as it is saved.
  • A theme is yours unless we shipped it: provenance is decided by an explicit list of the themes CrapCleaner ships, not by which directory a file sits in or what its own category field says. Anything else appears under Custom and can be edited, shown, or deleted from the gallery.
  • Themes reload while you edit them: the application watches both theme directories, so saving a file in an editor restyles the window immediately. Editing a theme no longer means closing and reopening the application repeatedly. A file that cannot be parsed is skipped and the rest keep working; one naming a category that does not exist is filed under a category that does, rather than loading but being unreachable in the gallery.
  • Themes are data: the 44 palettes moved out of a 2 100-line module into JSON files. A file dropped into <config dir>/themes adds a theme with no code change, and an invalid one is skipped with a warning instead of breaking start-up.

Changed

  • Editing a theme restyles the whole window, not just the preview: the interface follows the edit a moment after the last change, so a theme is judged on the application rather than on a mockup of it. The preview keeps up in real time while a slider is moving and the window is restyled once, when the movement stops. Restyle the window as I edit turns it off.
  • Changing a theme is 4.6x faster: the stylesheet was set on the QApplication, which re-polishes every widget of every top-level at about 1.2ms each; the identical sheet set on the window costs 0.3ms - 243ms against 1115ms for the same 845 widgets. It is not the stylesheet's size, a one-rule sheet cost the same. Every dialog in the application is parented inside the window, so it inherits either way, and a test now fails if an unparented one appears.
  • The Studio keeps up while you drag: the colour maths ran about 1,200 times per edit on two dozen distinct values and is now cached (palette generation 3.57ms to 0.02ms), the preview restyled each of its mock widgets separately and is now one sheet like the application itself, and a drag redrew once per notch and is now capped at thirty a second with the value it ended on always landing. A full-range drag went from about 4.3 seconds of blocking to 18 milliseconds.
  • The Custom Theme Studio shows the application, not three boxes: the preview is a working miniature of the window - sidebar, header, figures, a list, badges and buttons - above every palette token with its value. The three tabs it replaces each hid two thirds of the preview behind a click and stretched whichever one was showing into empty space. The page fills the page: a trailing stretch in the settings layout was leaving the bottom half of the view blank whatever the card did.
  • Start from a theme you already have: any theme can be loaded into the Studio and edited. One saved from the Studio comes back exactly as it was saved, because the settings that produced it are recorded in the file. Anything else - the themes we ship, a file written by hand - has no recipe, so its accent and canvas are taken and the rest generated; the Studio says which of the two it did.
  • Readability, beside the controls: every colour pair the interface actually draws, rated against WCAG AA, updating as the theme is edited. The soft badge tints are translucent, so they are composited over the card they sit on before being measured - comparing the raw rgba() string against its own accent reported about 1:1 for every theme ever made.
  • A Fix button: where a pair falls short, it sweeps the three sliders and takes the combination nearest to what was set, then says which ones it moved - so the result is still the theme that was being designed, and Reset undoes it. It leaves the accent, canvas and mood alone: those are the design, the sliders are the tuning. Across 663 failing configurations it clears every one.
  • Background Depth is adjustable: every saved theme carries this value and the Studio had no control for it, so the only way to change it was to edit a theme file by hand.
  • Editing the Studio no longer has to restyle the whole window: every swatch click and slider release restyled the application and wrote settings to disk. It still does by default, because watching the real interface change is the point, but Restyle the window as I edit turns it off.
  • The window opens at the size the dashboard was laid out for: 1460x1160 rather than 1200x780, which clipped the drive cards and squashed the sidebar footer. It shrinks to fit a smaller screen and is centred on it. The minimum is 1200x660 - not the default, because 1160 pixels of height does not fit a 1080p display once the taskbar is accounted for, and a floor that tall would force the window off the screen on the most common resolution there is.
  • One way to share a theme: Copy JSON and Import… have gone from the Custom Theme Studio. A theme is a file now - Save to Gallery… writes it, and sharing one means sending it.
  • The Storage view measures the tree once: the hierarchy, the file-type breakdown and the old-file list each walked the same tree in turn. They now share one traversal - 2.6x faster on a warm 11k-file tree, 3.3x on a larger one - and drilling into a folder is served from what the scan already measured rather than walking it again (290 ms to 0.4 ms).
  • Linux gaming and GPU coverage: these categories built Windows paths that resolve under ~/.cache on Linux and matched nothing, so both groups always reported zero. Steam (native, .steam and Flatpak), Heroic, Lutris and Bottles are covered, along with the Mesa shader cache, NVIDIA GL and compute caches, and Steam/Proton shader caches.
  • Every built-in theme meets WCAG AA: the contrast engine was applied to generated custom themes and not to the 44 built-in palettes. Eleven had secondary text below AA on a hovered card, the worst at 1.21:1. Only text colours moved.
  • Start from a theme you already have: any theme can be loaded into the Studio and edited. One saved from the Studio comes back exactly as it was saved, because the settings that produced it are recorded in the file; anything else has no recipe, so its accent and canvas are taken and the rest generated - and the Studio says which of the two it did rather than implying a copy.
  • Button and badge labels are derived from what they sit on: the label on a coloured button was #ffffff whatever colour the button was, which fails on 37 of the 44 themes we ship and cannot be fixed from the Studio - darkening an accent enough for white to read breaks the accent badge instead. A badge label was the role's own colour on a 15% tint of itself: pale on pale, failing on 26 themes for the accent badge and 39 for the critical one. Both now come from the colour behind them, moving lightness only, so the label keeps its hue and every theme reads.
  • The About page no longer freezes the window: it fetched the contributor list and every avatar synchronously while the page was being built.
  • A log file, at last: crapcleaner.log in the config directory, --verbose for detail and --log-path to find it. Failures that used to disappear into a bare except: pass now leave a trace.
  • Releases are gated on the version matching the tag, rebuilt release assets get fresh checksums, and CI runs the built binary rather than only checking that the file exists.
  • A headless Linux session is reported rather than silently rendering the interface offscreen.