Skip to content

Commit 5cbe885

Browse files
file recovery support as well
1 parent 2293a56 commit 5cbe885

44 files changed

Lines changed: 2773 additions & 363 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

Lines changed: 120 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
[workspace]
22
resolver = "2"
3-
members = ["crates/aerosol_core", "crates/aerosol_cli", "src-tauri"]
3+
members = [
4+
"crates/aerosol_core",
5+
"crates/aerosol_recovery",
6+
"crates/aerosol_cli",
7+
"src-tauri",
8+
]
49

510
[workspace.package]
611
edition = "2021"

README.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Aerosol
22

3-
**Aerosol** is a desktop disk utility for **macOS**, **Windows**, and **Linux**. It scans common clutter (caches, logs, package managers, developer artifacts), classifies findings with **risk levels**, and lets you **preview** or **clean** in batches — with optional **Trash** instead of permanent delete. Everything runs **on your machine**; there is no cloud account or upload of your file list.
3+
**Aerosol** is a desktop disk utility for **macOS**, **Windows**, and **Linux**. It scans common clutter (caches, logs, package managers, developer artifacts), classifies findings with **risk levels**, and lets you **preview** or **clean** in batches — with optional **Trash** instead of permanent delete. A separate **File recovery** mode performs **read-only** scans of a folder you choose (including volume mount points), finds files by type signatures, supports **image and video previews**, and **copies** selections into a destination folder — without writing to the source tree. Everything runs **on your machine**; there is no cloud account or upload of your file list.
44

55
- **Source:** [github.com/januscaler/aerosol](https://github.com/januscaler/aerosol)
66
- **Public docs / landing:** [aerosol.januscaler.com](https://aerosol.januscaler.com)
@@ -9,17 +9,26 @@
99
| ------ | ----- |
1010
| UI | [React](https://react.dev/) 19 + [TypeScript](https://www.typescriptlang.org/) + [Tailwind CSS](https://tailwindcss.com/) + [Vite](https://vitejs.dev/) |
1111
| Shell | [Tauri](https://tauri.app/) 2 |
12-
| Engine | Rust workspace: [`aerosol_core`](crates/aerosol_core), [`aerosol_cli`](crates/aerosol_cli), [`src-tauri`](src-tauri) |
12+
| Engine | Rust workspace: [`aerosol_core`](crates/aerosol_core), [`aerosol_recovery`](crates/aerosol_recovery), [`aerosol_cli`](crates/aerosol_cli), [`src-tauri`](src-tauri) |
1313
| Docs | [VitePress](https://vitepress.dev/) site in [`website/`](website/) |
1414

1515
## Features
1616

1717
- **Filters** — Browse all findings, **safe**, or **review** buckets; paginated lists for large scans.
1818
- **Cleanup** — Dry-run preview, **select all safe**, merged delete roots (fewer prompts), progress during deletion, optional **Move to Trash**.
19+
- **File recovery** — Second app mode: scan a path (typed, browsed, or volume shortcuts), **Quick** (metadata + magic) or **Deep** (adds carving in the first portion of each file), filter by type (PNG, JPEG, ZIP, PDF, MP4, SQLite, JSON), paginated hits, **previews** for images and videos, **recover** by copying to another folder. Carved hits are listed but not extracted yet. Not a raw-disk / undelete tool — it walks a directory tree you select.
1920
- **Plugins** — Built-in awareness of tools like Docker and Git; architecture supports more scanners.
2021
- **Large files & duplicates** — Surfaces big files from the scan; optional duplicate check for large files.
2122
- **CLI**`aerosol` binary from the same engine (`cargo run -p aerosol_cli -- …` during development).
2223

24+
## Screenshots
25+
26+
| Overview (totals, safe vs review, filters) | Browse & select (paginated list, risk labels) | File recovery (hits, preview, recover) |
27+
| --- | --- | --- |
28+
| ![Aerosol scan overview](images/screen1.png) | ![Aerosol browse and select](images/screen2.png) | ![Aerosol file recovery](images/screen3.png) |
29+
30+
Higher-resolution copies also ship with the marketing site under [`website/public/screenshots/`](website/public/screenshots/) for [aerosol.januscaler.com](https://aerosol.januscaler.com) — run `npm run sync:screenshots` from [`website/`](website/) after updating [`images/`](images/).
31+
2332
## Prerequisites
2433

2534
- [Rust](https://www.rust-lang.org/tools/install) (stable) and a C toolchain for your OS

crates/aerosol_cli/src/main.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ use aerosol_core::analyzer::format_bytes;
22
use aerosol_core::duplicates::find_duplicates;
33
use aerosol_core::engine;
44
use aerosol_core::cleanup;
5-
use aerosol_core::types::{CleanRequest, ScanOptions};
5+
use aerosol_core::types::{
6+
CleanRequest, ScanOptions, DEFAULT_CLEANUP_PARALLELISM, MAX_CLEANUP_PARALLELISM,
7+
};
68
use clap::{Parser, Subcommand};
79
use std::path::PathBuf;
810
use std::sync::atomic::AtomicBool;
@@ -32,6 +34,9 @@ enum Commands {
3234
dry_run: bool,
3335
#[arg(long, default_value_t = true)]
3436
trash: bool,
37+
/// Concurrent delete/trash jobs (1–1000)
38+
#[arg(long, default_value_t = DEFAULT_CLEANUP_PARALLELISM)]
39+
parallel: u32,
3540
},
3641
/// Find duplicate files among large file paths from a JSON lines file (paths only)
3742
Duplicates {
@@ -69,11 +74,13 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
6974
paths,
7075
dry_run,
7176
trash,
77+
parallel,
7278
} => {
7379
let req = CleanRequest {
7480
paths: paths.iter().map(|p| p.to_string_lossy().to_string()).collect(),
7581
dry_run,
7682
use_trash: trash,
83+
cleanup_parallelism: parallel.max(1).min(MAX_CLEANUP_PARALLELISM),
7784
};
7885
let out = cleanup::clean(req)?;
7986
println!("{}", serde_json::to_string_pretty(&out)?);

0 commit comments

Comments
 (0)