Reports and logs
Every run writes under %USERPROFILE%\.windowsweep, never inside the npm cache or the repository, so history survives every npx invocation. Every run means every run: --scan and --dry-run write here too. --no-report skips the report, and --cleanup-logs deletes the log at exit.
%USERPROFILE%\.windowsweep\
config.json the developer answer and default windows
logs\windowsweep-<stamp>.log one log per run, every action recorded
reports\report-<stamp>.json one canonical report per run (schema 1)
reports\report-<stamp>.md|.html exports, on demand
reports\stale-builds-<stamp>.txt section 17 candidate list (also in dry-run)
reports\disk-usage-<stamp>.txt section 21 output
feedback\debug-bundle-<stamp>.zip --debug-bundle
feedback\crash-<stamp>.zip written on an unexpected exit
<stamp> is yyyy-MM-dd_HHmmss-<pid>, so concurrent runs never share a file.
The log
Plain text, one timestamped line per event: every path removed with its size, every path skipped as in use,
every refusal with its reason, every external command with its exit code, and a credit header naming the tool
version, mode, host, user, elevation and dry-run state. --cleanup-logs deletes this run's log at exit;
--prune-history N removes logs, reports and bundles older than N days.
The JSON report
{
"schema_version": 1,
"credits": { "tool": "windowsweep", "tool_version": "1.2.0", "author": { "name": "...", "email": "...", "website": "...", "linkedin": "..." } },
"meta": { "started_at": "...", "finished_at": "...", "duration_seconds": 217, "host": "...", "user": "...",
"os": "...", "powershell": "5.1.19041.7663", "mode": "all", "dry_run": false, "elevated": false,
"developer_mode": true, "idle_days": 100, "temp_days": 3, "log_file": "...", "launcher": "node", "via_npx": true },
"disk": { "before": [ { "drive": "C:", "size_bytes": 0, "free_bytes": 0 } ], "after": [ ] },
"steps": [ { "n": 1, "section": 1, "title": "...", "status": "ran", "freed_bytes": 0, "note": "" } ],
"totals": { "total_reclaimed_bytes": 0, "total_reclaimed_human": "0 B", "total_estimated_bytes": 0,
"total_estimated_human": "0 B", "steps_run": 0, "steps_skipped": 0 }
}
status is one of ran, dry-run, skipped, refused, failed. In a dry-run the estimate lives in
total_estimated_bytes and total_reclaimed_bytes stays 0.
Exports and history
windowsweep --reports # list, then: cm N | ch N | cb N | all | v N | o N | d N | q
windowsweep --export both latest # Markdown + HTML next to the JSON
windowsweep --export html all
windowsweep --stats # runs, dry-runs, total reclaimed, latest report
windowsweep --json --all --yes # one JSON line on stdout for scripts; human output on stderr
The HTML export is a single self-contained file that follows the system light/dark preference. No external tool is needed for any conversion. The file references nothing on the network.
Privacy
Logs and reports contain paths from your machine and a snapshot of cache sizes. Nothing is transmitted: the command-line tool makes no network calls of its own. Review a bundle before attaching it to an issue: the paths in it include your user name and your project folders.
targets[] in a --json scan
--scan --json fills targets[] with one entry per resolved path:
{"section":1,"label":"npm cache (_cacache)",
"path":"C:\\Users\\you\\AppData\\Local\\npm-cache\\_cacache",
"bytes":1580019157,"newest_write_utc":"2026-09-07T18:52:39Z"}
newest_write_utc (added in 1.2.0) is the newest of write, access and creation time found anywhere under
that target - the same rule the idle gate uses, which is why a cache whose own folder date looks stale can
still report a recent timestamp. It is null for a target that is absent or holds no files, rather than
a zero date that would sort as though it were real.
It costs no extra work: under --json the size pass already enumerates every file, so the timestamp comes
out of that same enumeration. A human --scan keeps the faster path and does not compute it.
Last Updated: 2026-09-08