Sifty — an AI-assisted Windows maintenance CLI/TUI: sift junk, analyze disks, manage apps, updates and files. Recycle Bin only, dry-run by default.
Project description
Sifty
An AI-assisted Windows maintenance CLI + TUI that sifts the junk from the keep.
Clean junk, analyze disks, find duplicates, manage apps and startup programs, apply updates, prune dev artifacts and git worktrees, and organize files — from a scriptable CLI or a full-screen terminal UI. The optional AI assistant runs locally via Ollama: nothing leaves your machine, and it only ever sees file metadata (names, sizes, paths), never file contents.
Safety first
Sifty deletes files and changes system state, so it is built to be hard to misuse:
- Dry-run by default — every destructive command previews what it would do.
Real changes need an explicit
--apply. - Recycle Bin, never permanent delete — all removals go through one
trash()function backed by Send2Trash.sifty undorestores the last clean. - Protected paths —
C:\Windows,Program Files,ProgramData, the drive root and your profile root are refused even with--apply --yes. - Audit log — every applied deletion is recorded in
%APPDATA%\sifty\audit.log. - The AI never deletes anything — it is advisory; high-risk tool calls always require your approval.
How it compares
| Feature | Sifty | CCleaner | Revo Uninstaller | WinDirStat |
|---|---|---|---|---|
| Junk / cache cleaning | ✅ 11+ categories | ✅ | ➖ | ❌ |
| Disk usage analysis | ✅ top-N + volumes | ➖ | ❌ | ✅ treemap |
| Duplicate finder | ✅ SHA-256, NTFS-aware | ✅ (paid) | ❌ | ❌ |
| App uninstall + leftover scan | ✅ winget + leftovers | ✅ | ✅ + leftovers | ❌ |
| App updates | ✅ via winget | ✅ (paid) | ❌ | ❌ |
| Startup manager | ✅ reversible | ✅ | ✅ | ❌ |
| Dev artifact purge (node_modules, …) | ✅ | ❌ | ❌ | ❌ |
| Git worktree / WSL2 VHD cleanup | ✅ | ❌ | ❌ | ❌ |
| Local AI assistant | ✅ Ollama | ❌ | ❌ | ❌ |
| Scriptable (JSON output) | ✅ | ❌ | ❌ | ❌ |
| Recycle Bin + undo for everything | ✅ | ➖ | ➖ | n/a |
| Price | Free, MIT | Freemium | Freemium | Free |
Sifty is built developer-first: everything is scriptable, the engine is a reusable Python library, and it cleans the things developer machines actually accumulate (build artifacts, orphaned worktrees, bloated WSL2 disks).
Install
# from source (recommended while pre-PyPI)
git clone https://github.com/Vortrix5/sifty && cd sifty
pipx install --editable . # or: pip install .
sifty doctor # check admin rights, winget, Ollama
For development:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e ".[dev]"
.\.venv\Scripts\python.exe -m pytest -q
Usage
sifty checkup # one read-only scan of everything: junk, updates,
# orphans, stale files, disk space, startup
sifty tui # the full-screen interactive app
# Junk
sifty junk scan # show reclaimable space per category
sifty junk clean # preview removal (dry-run)
sifty junk clean --apply # send junk to the Recycle Bin (asks first)
# Disk
sifty disk volumes # used/free/total per volume
sifty disk analyze C:\Users # biggest folders/files under a path
sifty disk duplicates D:\ # find duplicate files and wasted space
# Apps & updates
sifty apps list --by-size # installed apps, largest first
sifty apps orphans # broken uninstall entries in the registry
sifty apps uninstall "App" # uninstall via winget (preview, then --apply)
sifty apps leftovers "App" # what the uninstaller left behind (then --apply)
sifty update check # available updates (winget)
sifty update apply # upgrade everything (asks first)
# Developer cleanup
sifty purge clean # node_modules, dist, __pycache__, target, …
sifty cleanup duplicates D:\Photos # de-duplicate (keeps one copy each)
sifty cleanup large C:\Users\you # biggest files under a path
sifty cleanup stale --days 180 # old items in Downloads
# Startup & services
sifty startup list # startup programs (enabled/disabled)
sifty startup disable "Spotify" # reversible (sifty startup enable …)
sifty services list # curated optional services + state
sifty --admin services disable DiagTrack # toggle one (needs admin)
# History & undo
sifty history # what was cleaned + total space reclaimed
sifty undo # restore the most recent clean from the Recycle Bin
# Organize files
sifty organize preview C:\Users\you\Downloads --by type
sifty organize apply C:\Users\you\Downloads --by date
sifty organize undo # put the last organize's files back
# Configuration
sifty config # all settings + which ones you've overridden
sifty config set ai.model "llama3.2:3b"
sifty config edit # open config.toml in your editor
# AI (requires Ollama running)
sifty ai status
sifty ai ask "what can I safely delete on my C drive?" --path C:\
# Scripting — JSON output on read-only commands (auto-enabled when piped)
sifty --json checkup
sifty --json disk volumes
sifty --json apps list --by-size
Some operations (Windows temp, update cache, certain uninstalls) need an
Administrator terminal — sifty doctor tells you if you're elevated, and
sifty --admin <cmd> relaunches elevated via UAC.
The TUI
sifty tui opens a full-screen app with a seven-section sidebar — Home,
Clean, Disk, Apps, Monitor, Reports, AI:
- Home — volume gauges and a Run checkup button that scans everything at once; findings come with buttons that fix them right there (clean junk, clean stale downloads, apply updates — each behind a confirm).
- Clean — Junk / Purge / Optimize / Smart cleanup under one roof (tabs).
- Apps — Installed / Updates / Startup / Services, with fuzzy filter, sorting, bulk uninstall, and an automatic leftover scan after uninstalling.
- AI — an agentic chat: tool runs it proposes show Run/Skip buttons inline in the conversation, and scan results carry follow-up action buttons.
Press Ctrl+P for the command palette (jump to any screen), F2 to elevate, Space to mark rows for bulk actions. The Reports screen shows space reclaimed over time with an Undo last clean button.
AI setup (optional)
- Install Ollama and start it.
- Pull the configured model:
ollama pull qwen2.5:3b. sifty ai statusshould report "running".
Configure in %APPDATA%\sifty\config.toml:
[ai]
host = "http://localhost:11434"
model = "qwen2.5:3b"
[safety]
extra_protected_paths = ["D:\\Important"]
[junk]
include_downloads_installers = false
Architecture
Layered — thin frontends over a reusable engine, OS specifics quarantined:
src/sifty/
├── cli/ # Typer entry point + one thin command module per group
├── tui/ # Textual full-screen app (views call core, not cli)
├── core/ # the engine: junk, disk, apps, updates, cleanup,
│ │ # startup, services, organize, checkup, history, …
│ └── safety.py # ★ protected paths, dry-run guard, trash(), audit log
├── windows/ # OS primitives: winget, registry, UAC, Recycle Bin, DISM
├── ai/ # Ollama client, advisor prompts, agentic tool loop
└── infra/ # TOML config + rotating diagnostics log
Frontends depend on core; core depends on windows/infra; nothing
imports upward. A GUI could call the same engine functions (junk.scan,
disk.find_duplicates, checkup.run_checkup) without a rewrite. See
docs/ARCHITECTURE.md for the design rationale.
Tests
.\.venv\Scripts\python.exe -m pytest -q # 160+ tests, ~20 s
The safety guardrails are the most heavily tested code in the repo; the Windows environment is mocked so the suite also runs on CI. See CONTRIBUTING.md to get involved.
License
MIT © Amine Zouaoui
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sifty-0.6.0.tar.gz.
File metadata
- Download URL: sifty-0.6.0.tar.gz
- Upload date:
- Size: 131.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
410e8c567ee277a779f13488580b4c8266d82a6a7f538b050763a5b2f31a7220
|
|
| MD5 |
07bc793b78c63dcbee30d35ea8e78ad5
|
|
| BLAKE2b-256 |
87ed684f3a8f60440a30d961c55322dc4675f928bbd47ca953ff546823329491
|
Provenance
The following attestation bundles were made for sifty-0.6.0.tar.gz:
Publisher:
release.yml on Vortrix5/sifty
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sifty-0.6.0.tar.gz -
Subject digest:
410e8c567ee277a779f13488580b4c8266d82a6a7f538b050763a5b2f31a7220 - Sigstore transparency entry: 1802250457
- Sigstore integration time:
-
Permalink:
Vortrix5/sifty@d66dfc4a3e44e67da6eff80f14dc4c6c8f310016 -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/Vortrix5
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d66dfc4a3e44e67da6eff80f14dc4c6c8f310016 -
Trigger Event:
release
-
Statement type:
File details
Details for the file sifty-0.6.0-py3-none-any.whl.
File metadata
- Download URL: sifty-0.6.0-py3-none-any.whl
- Upload date:
- Size: 144.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
19a18b7387bffea5adafeb6168b0b23ccf094cb14d96c0cb6c805fa845b8e2ee
|
|
| MD5 |
9e42338d4bac1f941b40374f84e74785
|
|
| BLAKE2b-256 |
71aaac38caa8c6c77097ee53c2245f0b2695b8eb6e1c89e52bf039e84893f04f
|
Provenance
The following attestation bundles were made for sifty-0.6.0-py3-none-any.whl:
Publisher:
release.yml on Vortrix5/sifty
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sifty-0.6.0-py3-none-any.whl -
Subject digest:
19a18b7387bffea5adafeb6168b0b23ccf094cb14d96c0cb6c805fa845b8e2ee - Sigstore transparency entry: 1802250590
- Sigstore integration time:
-
Permalink:
Vortrix5/sifty@d66dfc4a3e44e67da6eff80f14dc4c6c8f310016 -
Branch / Tag:
refs/tags/v0.6.0 - Owner: https://github.com/Vortrix5
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d66dfc4a3e44e67da6eff80f14dc4c6c8f310016 -
Trigger Event:
release
-
Statement type: