{"id":50953643,"url":"https://github.com/batu3384/sift","last_synced_at":"2026-06-18T04:02:37.506Z","repository":{"id":348592322,"uuid":"1198858055","full_name":"batu3384/sift","owner":"batu3384","description":"Review-first terminal cleaner for macOS and Windows with safer destructive flows.","archived":false,"fork":false,"pushed_at":"2026-04-27T23:13:57.000Z","size":2489,"stargazers_count":0,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-28T00:25:36.603Z","etag":null,"topics":["bubbletea","cleanup","cli","go","macos","terminal","tui","windows"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/batu3384.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["batu3384"]}},"created_at":"2026-04-01T20:34:59.000Z","updated_at":"2026-04-27T23:14:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/batu3384/sift","commit_stats":null,"previous_names":["batu3384/sift"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/batu3384/sift","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/batu3384%2Fsift","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/batu3384%2Fsift/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/batu3384%2Fsift/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/batu3384%2Fsift/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/batu3384","download_url":"https://codeload.github.com/batu3384/sift/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/batu3384%2Fsift/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34475375,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bubbletea","cleanup","cli","go","macos","terminal","tui","windows"],"created_at":"2026-06-18T04:02:36.631Z","updated_at":"2026-06-18T04:02:37.501Z","avatar_url":"https://github.com/batu3384.png","language":"Go","funding_links":["https://github.com/sponsors/batu3384"],"categories":[],"sub_categories":[],"readme":"# SIFT\n\n[![CI](https://github.com/batu3384/sift/actions/workflows/ci.yml/badge.svg)](https://github.com/batu3384/sift/actions/workflows/ci.yml)\n[![Release](https://github.com/batu3384/sift/actions/workflows/release.yml/badge.svg)](https://github.com/batu3384/sift/actions/workflows/release.yml)\n[![License](https://img.shields.io/github/license/batu3384/sift)](LICENSE)\n\nSIFT is a review-first terminal cleaner for macOS and Windows. It keeps the\nworkflow fast and terminal-native, but replaces shell-script cleanup logic with\na typed Go core, explicit safety policy, permission preflight, audit history,\nand a single full-screen TUI that carries destructive work from selection to\nexecution without context switching.\n\nRunning `sift` opens the application shell. From there you can move through\n`Home`, `Clean`, `Uninstall`, `Analyze`, `Status`, `Review`, `Permissions`,\n`Progress`, and `Result` in one routed interface.\n\n## Screenshots\n\nCurrent captured screens are checked into `docs/assets/screenshots`. `Progress`,\n`Permissions`, and `Result` captures are still release-readiness placeholders;\nsee [docs/SCREENSHOTS.md](docs/SCREENSHOTS.md) for the capture checklist before\npublishing a release page or store listing.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd width=\"33%\"\u003e\n      \u003cimg src=\"docs/assets/screenshots/home.png\" alt=\"SIFT home screen\" /\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"33%\"\u003e\n      \u003cimg src=\"docs/assets/screenshots/analyze.png\" alt=\"SIFT analyze screen\" /\u003e\n    \u003c/td\u003e\n    \u003ctd width=\"33%\"\u003e\n      \u003cimg src=\"docs/assets/screenshots/review.png\" alt=\"SIFT review screen\" /\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cstrong\u003eHome\u003c/strong\u003e\u003cbr /\u003e\n      Primary workflows, live state, and fast entry into cleanup or status.\n    \u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cstrong\u003eAnalyze\u003c/strong\u003e\u003cbr /\u003e\n      Explorer-style disk analysis with staged review handoff.\n    \u003c/td\u003e\n    \u003ctd valign=\"top\"\u003e\n      \u003cstrong\u003eReview\u003c/strong\u003e\u003cbr /\u003e\n      Planned deletions, protected findings, and explicit execution control.\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Why SIFT\n\n- Review-first destructive flows. Cleanup is previewed before it is applied.\n- Dry-run by default. Destructive non-interactive runs require both `--dry-run=false` and `--yes`.\n- Cross-platform core. One Go binary with platform adapters for macOS and Windows.\n- Explicit permission model. Admin, dialog, and native handoff requirements are shown before execution.\n- Auditable behavior. Plans, executions, diagnostics, and reports are written to local state and audit logs.\n- Task-native TUI. `clean`, `uninstall`, and staged `analyze` runs preload real preview plans so the selected work is visible before full review opens.\n\n## Current Trust Status\n\nThis repository is prepared for public validation, but release claims should stay\ntied to evidence:\n\n| Area | Current status | Release gate |\n| --- | --- | --- |\n| Local tests | `go test ./...` passed for the pushed `main` baseline | Re-run before release tagging |\n| Remote CI | `ci`, `codeql`, and `scorecard` pass on protected `main` | Keep required checks green on the release candidate |\n| macOS CI-safe smoke | Runs in GitHub Actions and is available locally through `make smoke` | Re-run on the release candidate |\n| Windows smoke | Runs in GitHub Actions on `windows-latest`; local script remains `make smoke-windows` | Re-run on Windows or a PowerShell-capable runner before public Windows claims |\n| Live macOS integration | Explicit opt-in only | Must pass with `SIFT_LIVE_INTEGRATION=1` before broad macOS trust claims |\n| Release artifacts | Local dry-run path exists | Must pass manifest preflight and tagged release workflow |\n\n## Core Workflows\n\n### Clean\n\nChoose a cleanup scope, review planned findings, then execute through\n`Review -\u003e Permissions -\u003e Progress -\u003e Result`.\n\nProfiles:\n\n- `safe`: temp files, logs, obvious stale caches\n- `developer`: safe plus developer and package-manager caches\n- `deep`: broader cleanup with stronger review warnings\n\n### Uninstall\n\nSearch installed apps, review remnants, optionally launch a native uninstall,\nand continue in the same session through remnant cleanup and aftercare.\n\n### Analyze\n\nInspect large directories and files, drill into folders, stage findings, and\nsend them into the standard cleanup review flow.\n\n### Optimize and Autofix\n\nUse the same reviewed execution model for safe maintenance actions and\nautofixable posture findings.\n\n## Install\n\n### Install Script\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/batu3384/sift/main/install.sh | sh\n```\n\nThis installs `sift` and the short wrapper `si` into `~/.local/bin` by default.\nSet `PREFIX=/custom/bin` to override the install location.\n\n### Go Install\n\n```bash\ngo install github.com/batu3384/sift/cmd/sift@latest\n```\n\n### Build From Source\n\n```bash\ngit clone https://github.com/batu3384/sift.git\ncd sift\ngo build -o ./sift ./cmd/sift\n```\n\n## Quick Start\n\n```bash\n# Launch the full-screen application shell\nsift\n\n# Open a reviewed cleanup plan for the safe profile\nsift clean safe\n\n# Analyze a path and stage items into cleanup review\nsift analyze ~/Downloads\n\n# Focused analysis helpers\nsift duplicates ~/Downloads --json\nsift largefiles ~/Downloads --min-size 100MB\n\n# Live status in plain text or JSON\nsift status --plain\nsift status --json\n\n# Local audit history and aggregate cleanup stats\nsift history\nsift stats --json\n\n# Posture audit and reviewed autofix flow\nsift check\nsift autofix\n```\n\n## Safety Model\n\n| Surface | Default posture | Explicit execution requirement |\n| --- | --- | --- |\n| `clean` | Preview plan first | TUI confirmation, or non-interactive `--dry-run=false --yes` |\n| `purge` | Scan/review before removal | Explicit rule/path plus confirmation for destructive runs |\n| `uninstall` | Plan app action and remnants first | Permission preflight plus explicit execution |\n| `optimize` | Reviewed maintenance plan | Confirmation before applying native/system changes |\n| `autofix` | Reviewed posture fixes | Confirmation before applying changes |\n| `remove` | Planned self-removal | Explicit confirmation |\n| `touchid` | Capability/preflight first | Explicit confirmation before system-level change |\n\nAdditional guardrails:\n\n- Interactive destructive flows stay in the TUI and require explicit confirmation.\n- Permission preflight summarizes admin, dialog, and native handoff requirements before execution.\n- Protected paths, protected data families, and command-scoped exclusions are enforced by the same policy engine used during execution.\n- Review and progress totals separate actionable cleanup from advisory-only and protected findings, so manual-review bytes are not presented as automatically reclaimable.\n- Advisory-only categories such as cloud-office sync stores and virtualization payloads are surfaced for review but are not deleted automatically.\n- Duplicate analysis uses full-file hashing after size grouping, avoiding first-chunk-only matches for same-size files.\n- Execution re-checks approved item fingerprints before removal and records audit persistence failures as plan/result warnings instead of hiding them.\n- Package-manager update guidance uses direct managed commands instead of shell command chains.\n- JSON and non-interactive destructive runs never proceed unless intent is explicit.\n\n## Platform and Command Matrix\n\n| Command family | macOS | Windows | Notes |\n| --- | --- | --- | --- |\n| `status`, `doctor`, `history`, `stats`, `report` | Supported | Supported | Uses platform adapters for diagnostics and persistence |\n| `analyze`, `duplicates`, `largefiles` | Supported | Supported | JSON output is available for automation |\n| `clean`, `purge`, `protect` | Supported | Supported | Protection policy is shared; roots are platform-specific |\n| `uninstall` | Supported with native handoff where available | Supported through Windows adapter behavior | Always review remnants before cleanup |\n| `optimize`, `autofix` | Supported where checks are implemented | Supported where checks are implemented | Command output should describe skipped platform actions |\n| `update`, `installer`, `remove`, `completion`, `version` | Supported | Supported | Package-manager availability depends on release artifacts |\n| `touchid` | macOS-specific | Not applicable | Should report unsupported on Windows |\n\nKnown validation gaps before a public release:\n\n- Remote GitHub Actions is passing on `main`; release tags should still be cut only from a freshly validated commit.\n- Windows smoke is covered by GitHub Actions on `windows-latest`; rerun it for every release candidate.\n- Live macOS integration requires opt-in host validation and should not be inferred from CI-safe smoke.\n\n## Command Surface\n\n```text\nsift analyze [targets...]\nsift duplicates [path]\nsift largefiles [path] [--min-size 100MB]\nsift check\nsift clean [profile]\nsift clean --whitelist [list|add \u003cpath\u003e|remove \u003cpath\u003e]\nsift autofix\nsift installer\nsift purge \u003crule-or-path\u003e\nsift purge scan [roots...]\nsift protect list\nsift protect add \u003cpath\u003e\nsift protect remove \u003cpath\u003e\nsift protect explain \u003cpath\u003e\nsift protect family list\nsift protect family add \u003cfamily\u003e\nsift protect family remove \u003cfamily\u003e\nsift protect scope list [command]\nsift protect scope add \u003ccommand\u003e \u003cpath\u003e\nsift protect scope remove \u003ccommand\u003e \u003cpath\u003e\nsift uninstall \u003capp\u003e\nsift optimize\nsift optimize --whitelist [list|add \u003cpath\u003e|remove \u003cpath\u003e]\nsift update\nsift remove\nsift status\nsift history\nsift stats\nsift doctor\nsift report [scan-id]\nsift version\nsift completion [shell]\nsift touchid\n```\n\n## Output and Automation Notes\n\n- `status`, `analyze`, and `check` automatically emit JSON when stdout is piped. Use `--plain` to force human-readable output.\n- `doctor --json` emits the same diagnostic set used by the TUI.\n- `analyze --json` emits a regular `ExecutionPlan`, matching interactive review.\n- `status --json` emits a structured `StatusReport`.\n- Set `SIFT_REDUCED_MOTION=1` to keep the TUI interactive while disabling spinner and pulse animation.\n\n## Configuration\n\nSIFT writes its user config to the platform config directory. See\n[config.example.toml](config.example.toml) for the supported shape.\n\nImportant keys:\n\n- `interaction_mode`: `auto`, `plain`, or `tui`\n- `trash_mode`: `trash_first` or `permanent`\n- `confirm_level`: `strict` or `balanced`\n- `disabled_rules`: suppress specific built-in rule IDs\n- `protected_paths`: never delete below these roots\n- `protected_families`: enable broader built-in protection groups\n- `command_excludes`: command-scoped exclusions such as `clean = [\"~/Projects/keep-me/build\"]`\n- `purge_search_paths`: default roots for `sift purge scan`\n- `diagnostics.redaction`: redact `$HOME` paths in debug bundles\n\n## Development\n\n```bash\ngo test ./...\nmake smoke\nmake quality-gate-full\n./hack/security_check.sh\n```\n\nOther useful targets:\n\n- `make integration-live-macos`\n- `make cross-build`\n- `make completions`\n- `make release-dry-run`\n- `make package-manifests TAG=v0.0.0-ci DIST_DIR=./.tmp/package-dist OUT_DIR=./.tmp/manifests`\n\nREADME screenshots are generated from deterministic fixture roots with:\n\n```bash\n./hack/capture_readme_screens.sh\n```\n\nFor docs-only changes, the minimum sanity pass is:\n\n```bash\ngo test ./...\nmarkdown link/reference sanity check for changed Markdown files\n```\n\n## Documentation\n\n- [CHANGELOG.md](CHANGELOG.md)\n- [CONTRIBUTING.md](CONTRIBUTING.md)\n- [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md)\n- [SECURITY.md](SECURITY.md)\n- [SECURITY_AUDIT.md](SECURITY_AUDIT.md)\n- [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)\n- [docs/RELEASE.md](docs/RELEASE.md)\n- [docs/ROADMAP.md](docs/ROADMAP.md)\n- [docs/SCREENSHOTS.md](docs/SCREENSHOTS.md)\n- [docs/TESTING.md](docs/TESTING.md)\n- [docs/MOLE_GAP_REPORT.md](docs/MOLE_GAP_REPORT.md)\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbatu3384%2Fsift","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbatu3384%2Fsift","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbatu3384%2Fsift/lists"}