Repository files navigation

Disk Map

VersionTauriLicense

A Tauri v2 desktop storage scanner and cleanup tool inspired by DaisyDisk.

Navigation

LinesSection
1Title + Badges
7Tagline
9Description
13Prerequisites
19Installation
25Usage
31Features
47Command Reference
75Configuration
82Development
89Tests
99Contributing
105Changelog
109Links
113License
117Credits

Description

Disk Map scans folders and mounted volumes, maps file and folder sizes recursively, previews items, and stages cleanup candidates. It surfaces hidden and purgeable space (macOS APFS) so you can see what is consuming a volume beyond the files you can browse.

It is a staged-cleanup tool: nothing is mutated until you commit the Collector. Items move to Trash or are permanently deleted only after explicit confirmation, with per-item risk checks that block irreversible actions on critical paths.

The frontend is React + TypeScript on Vite; all filesystem work runs in a Rust backend command invoked over Tauri's IPC. Long scans execute in a blocking thread pool (spawn_blocking) so the UI stays responsive and emits live progress events.

Prerequisites

  • Runtime: Node.js 20.19+ (or newer LTS)
  • Package manager: npm
  • Rust: rustup toolchain (stable)
  • Platform deps: Tauri v2 macOS prerequisites (webkit2gtk/Xcode CLI equivalents). See Tauri v2 setup.

Installation

npm install

The Rust backend is compiled by Tauri at dev/build time; no separate install step is required.

Usage

npm run tauri dev # launch the app in development
npm run tauri build # produce a signed/unsigned desktop bundle

In-app: paste or pick a path, set max depth and exclude patterns, then Scan. Use the tree, largest-items, and file-type panels to find space hogs. Select items into the Collector, review risks, then commit to Trash or permanent delete.

Features

  • Recursive scan: full directory size = sum of children; children sorted by size descending.
  • Display depth pruning: server clamps max_display_depth to [1, 12] (default 4); deeper nodes keep their aggregated size but drop descendants from the payload.
  • Symlink-safe: uses symlink_metadata so symlinks are reported as file-like leaf nodes and never traversed.
  • Exclude patterns: case-insensitive substring match on name or full path; comma-separated from the UI.
  • Live progress: scan-progress events every 250 entries; newer scan for the same root cancels the older one.
  • Hidden + purgeable space: macOS APFS purgeable bytes via diskutil; hidden_bytes = volume.used − scanned.
  • Staged Collector: add/remove items, see summary + risk flags (missing, symlink, critical path, covered-by-parent). Permanent delete is blocked while any blocker risk exists.
  • Actions: Reveal in Finder, Open, Quick Look preview, Move to Trash, Permanently delete, plus list_volumes and reclaim_purgeable_space (macOS).
  • Favorites: persist starred scan roots under disk-map:favorites (deduped, survives restart).

Command Reference

All commands are invoked from the frontend via @tauri-apps/api/coreinvoke. The authoritative source is src-tauri/src/lib.rs; the registered handler list is the contract:

grep -n "scan_directory\|cancel_scan\|reveal_in_finder\|open_path\|preview_path\|move_to_trash\|inspect_path\|permanently_delete_path\|list_volumes\|get_purgeable_space\|reclaim_purgeable_space" src-tauri/src/lib.rs | grep "async fn\|fn "
CommandArgsReturnsPurpose
scan_directorypath, max_display_depth?, excludes?, client_scan_id?ScanResultRecursive size map + analytics
cancel_scanCancel all active scans (generation bump)
reveal_in_finderpathResult<(), String>Reveal in OS file manager
open_pathpathResult<(), String>Open item in default app
preview_pathpathResult<(), String>Quick Look (macOS) / open
move_to_trashpathResult<(), String>Move to Trash / Recycle Bin
inspect_pathpathPathInspectionexists/isSymlink/isDir
permanently_delete_pathpathResult<(), String>Delete file or dir (guarded)
list_volumesVec<VolumeInfo>Mounted volumes + capacity
get_purgeable_spacepathOption<u64>APFS purgeable bytes
reclaim_purgeable_spacepathResult<(), String>tmutil thinlocalsnapshots (macOS)

ScanResult shape (camelCase over the wire): root: DiskNode, largestFiles, fileTypes, skippedPaths, hiddenBytes?, purgeableBytes?, nodes, files, dirs, skipped, permissionDenied, errors, elapsedMs. See src-tauri/REFERENCE.md for every struct and constraint.

Configuration

No env vars are read by the app. The bundle is configured in src-tauri/tauri.conf.json:

FieldValue
productNameDisk Map
identifiercom.shadowwalker.disk-map
version0.1.0
app.windows[0]1100 × 800, title Disk Map
build.devUrlhttp://localhost:1420
bundle.targetsall

Capabilities are declared in src-tauri/capabilities/default.json (core:default, opener:default, dialog:default).

Development

git clone https://github.com/buluma/disk-map.git
cd disk-map
npm install
npm run tauri dev

Tests

npm test# vitest (frontend utils/collector logic)
cargo test --manifest-path src-tauri/Cargo.toml # Rust scan engine + safety guards

verify: both suites must pass before a PR is mergeable.

Contributing

  1. Fork the repo.
  2. Create a feature branch (git checkout -b feature/my-thing).
  3. Commit changes (git commit -am 'Add my thing').
  4. Push (git push origin feature/my-thing).
  5. Open a Pull Request. Ensure npm test and cargo test pass.

Changelog

See Releases. (No CHANGELOG.md yet — TODO.)

Links

License

TODO — no LICENSE file present. Add one and update this section.

Credits

Built with Tauri v2 (Rust + React/TypeScript), inspired by DaisyDisk.

About

MacOS Disk Utility

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Disk Map

VersionTauriLicense

A Tauri v2 desktop storage scanner and cleanup tool inspired by DaisyDisk.

Navigation

LinesSection
1Title + Badges
7Tagline
9Description
13Prerequisites
19Installation
25Usage
31Features
47Command Reference
75Configuration
82Development
89Tests
99Contributing
105Changelog
109Links
113License
117Credits

Description

Disk Map scans folders and mounted volumes, maps file and folder sizes recursively, previews items, and stages cleanup candidates. It surfaces hidden and purgeable space (macOS APFS) so you can see what is consuming a volume beyond the files you can browse.

It is a staged-cleanup tool: nothing is mutated until you commit the Collector. Items move to Trash or are permanently deleted only after explicit confirmation, with per-item risk checks that block irreversible actions on critical paths.

The frontend is React + TypeScript on Vite; all filesystem work runs in a Rust backend command invoked over Tauri's IPC. Long scans execute in a blocking thread pool (spawn_blocking) so the UI stays responsive and emits live progress events.

Prerequisites

  • Runtime: Node.js 20.19+ (or newer LTS)
  • Package manager: npm
  • Rust: rustup toolchain (stable)
  • Platform deps: Tauri v2 macOS prerequisites (webkit2gtk/Xcode CLI equivalents). See Tauri v2 setup.

Installation

npm install

The Rust backend is compiled by Tauri at dev/build time; no separate install step is required.

Usage

npm run tauri dev # launch the app in development
npm run tauri build # produce a signed/unsigned desktop bundle

In-app: paste or pick a path, set max depth and exclude patterns, then Scan. Use the tree, largest-items, and file-type panels to find space hogs. Select items into the Collector, review risks, then commit to Trash or permanent delete.

Features

  • Recursive scan: full directory size = sum of children; children sorted by size descending.
  • Display depth pruning: server clamps max_display_depth to [1, 12] (default 4); deeper nodes keep their aggregated size but drop descendants from the payload.
  • Symlink-safe: uses symlink_metadata so symlinks are reported as file-like leaf nodes and never traversed.
  • Exclude patterns: case-insensitive substring match on name or full path; comma-separated from the UI.
  • Live progress: scan-progress events every 250 entries; newer scan for the same root cancels the older one.
  • Hidden + purgeable space: macOS APFS purgeable bytes via diskutil; hidden_bytes = volume.used − scanned.
  • Staged Collector: add/remove items, see summary + risk flags (missing, symlink, critical path, covered-by-parent). Permanent delete is blocked while any blocker risk exists.
  • Actions: Reveal in Finder, Open, Quick Look preview, Move to Trash, Permanently delete, plus list_volumes and reclaim_purgeable_space (macOS).
  • Favorites: persist starred scan roots under disk-map:favorites (deduped, survives restart).

Command Reference

All commands are invoked from the frontend via @tauri-apps/api/coreinvoke. The authoritative source is src-tauri/src/lib.rs; the registered handler list is the contract:

grep -n "scan_directory\|cancel_scan\|reveal_in_finder\|open_path\|preview_path\|move_to_trash\|inspect_path\|permanently_delete_path\|list_volumes\|get_purgeable_space\|reclaim_purgeable_space" src-tauri/src/lib.rs | grep "async fn\|fn "
CommandArgsReturnsPurpose
scan_directorypath, max_display_depth?, excludes?, client_scan_id?ScanResultRecursive size map + analytics
cancel_scanCancel all active scans (generation bump)
reveal_in_finderpathResult<(), String>Reveal in OS file manager
open_pathpathResult<(), String>Open item in default app
preview_pathpathResult<(), String>Quick Look (macOS) / open
move_to_trashpathResult<(), String>Move to Trash / Recycle Bin
inspect_pathpathPathInspectionexists/isSymlink/isDir
permanently_delete_pathpathResult<(), String>Delete file or dir (guarded)
list_volumesVec<VolumeInfo>Mounted volumes + capacity
get_purgeable_spacepathOption<u64>APFS purgeable bytes
reclaim_purgeable_spacepathResult<(), String>tmutil thinlocalsnapshots (macOS)

ScanResult shape (camelCase over the wire): root: DiskNode, largestFiles, fileTypes, skippedPaths, hiddenBytes?, purgeableBytes?, nodes, files, dirs, skipped, permissionDenied, errors, elapsedMs. See src-tauri/REFERENCE.md for every struct and constraint.

Configuration

No env vars are read by the app. The bundle is configured in src-tauri/tauri.conf.json:

FieldValue
productNameDisk Map
identifiercom.shadowwalker.disk-map
version0.1.0
app.windows[0]1100 × 800, title Disk Map
build.devUrlhttp://localhost:1420
bundle.targetsall

Capabilities are declared in src-tauri/capabilities/default.json (core:default, opener:default, dialog:default).

Development

git clone https://github.com/buluma/disk-map.git
cd disk-map
npm install
npm run tauri dev

Tests

npm test# vitest (frontend utils/collector logic)
cargo test --manifest-path src-tauri/Cargo.toml # Rust scan engine + safety guards

verify: both suites must pass before a PR is mergeable.

Contributing

  1. Fork the repo.
  2. Create a feature branch (git checkout -b feature/my-thing).
  3. Commit changes (git commit -am 'Add my thing').
  4. Push (git push origin feature/my-thing).
  5. Open a Pull Request. Ensure npm test and cargo test pass.

Changelog

See Releases. (No CHANGELOG.md yet — TODO.)

Links

License

TODO — no LICENSE file present. Add one and update this section.

Credits

Built with Tauri v2 (Rust + React/TypeScript), inspired by DaisyDisk.

About

MacOS Disk Utility

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Disk Map

VersionTauriLicense

A Tauri v2 desktop storage scanner and cleanup tool inspired by DaisyDisk.

Navigation

LinesSection
1Title + Badges
7Tagline
9Description
13Prerequisites
19Installation
25Usage
31Features
47Command Reference
75Configuration
82Development
89Tests
99Contributing
105Changelog
109Links
113License
117Credits

Description

Disk Map scans folders and mounted volumes, maps file and folder sizes recursively, previews items, and stages cleanup candidates. It surfaces hidden and purgeable space (macOS APFS) so you can see what is consuming a volume beyond the files you can browse.

It is a staged-cleanup tool: nothing is mutated until you commit the Collector. Items move to Trash or are permanently deleted only after explicit confirmation, with per-item risk checks that block irreversible actions on critical paths.

The frontend is React + TypeScript on Vite; all filesystem work runs in a Rust backend command invoked over Tauri's IPC. Long scans execute in a blocking thread pool (spawn_blocking) so the UI stays responsive and emits live progress events.

Prerequisites

  • Runtime: Node.js 20.19+ (or newer LTS)
  • Package manager: npm
  • Rust: rustup toolchain (stable)
  • Platform deps: Tauri v2 macOS prerequisites (webkit2gtk/Xcode CLI equivalents). See Tauri v2 setup.

Installation

npm install

The Rust backend is compiled by Tauri at dev/build time; no separate install step is required.

Usage

npm run tauri dev # launch the app in development
npm run tauri build # produce a signed/unsigned desktop bundle

In-app: paste or pick a path, set max depth and exclude patterns, then Scan. Use the tree, largest-items, and file-type panels to find space hogs. Select items into the Collector, review risks, then commit to Trash or permanent delete.

Features

  • Recursive scan: full directory size = sum of children; children sorted by size descending.
  • Display depth pruning: server clamps max_display_depth to [1, 12] (default 4); deeper nodes keep their aggregated size but drop descendants from the payload.
  • Symlink-safe: uses symlink_metadata so symlinks are reported as file-like leaf nodes and never traversed.
  • Exclude patterns: case-insensitive substring match on name or full path; comma-separated from the UI.
  • Live progress: scan-progress events every 250 entries; newer scan for the same root cancels the older one.
  • Hidden + purgeable space: macOS APFS purgeable bytes via diskutil; hidden_bytes = volume.used − scanned.
  • Staged Collector: add/remove items, see summary + risk flags (missing, symlink, critical path, covered-by-parent). Permanent delete is blocked while any blocker risk exists.
  • Actions: Reveal in Finder, Open, Quick Look preview, Move to Trash, Permanently delete, plus list_volumes and reclaim_purgeable_space (macOS).
  • Favorites: persist starred scan roots under disk-map:favorites (deduped, survives restart).

Command Reference

All commands are invoked from the frontend via @tauri-apps/api/coreinvoke. The authoritative source is src-tauri/src/lib.rs; the registered handler list is the contract:

grep -n "scan_directory\|cancel_scan\|reveal_in_finder\|open_path\|preview_path\|move_to_trash\|inspect_path\|permanently_delete_path\|list_volumes\|get_purgeable_space\|reclaim_purgeable_space" src-tauri/src/lib.rs | grep "async fn\|fn "
CommandArgsReturnsPurpose
scan_directorypath, max_display_depth?, excludes?, client_scan_id?ScanResultRecursive size map + analytics
cancel_scanCancel all active scans (generation bump)
reveal_in_finderpathResult<(), String>Reveal in OS file manager
open_pathpathResult<(), String>Open item in default app
preview_pathpathResult<(), String>Quick Look (macOS) / open
move_to_trashpathResult<(), String>Move to Trash / Recycle Bin
inspect_pathpathPathInspectionexists/isSymlink/isDir
permanently_delete_pathpathResult<(), String>Delete file or dir (guarded)
list_volumesVec<VolumeInfo>Mounted volumes + capacity
get_purgeable_spacepathOption<u64>APFS purgeable bytes
reclaim_purgeable_spacepathResult<(), String>tmutil thinlocalsnapshots (macOS)

ScanResult shape (camelCase over the wire): root: DiskNode, largestFiles, fileTypes, skippedPaths, hiddenBytes?, purgeableBytes?, nodes, files, dirs, skipped, permissionDenied, errors, elapsedMs. See src-tauri/REFERENCE.md for every struct and constraint.

Configuration

No env vars are read by the app. The bundle is configured in src-tauri/tauri.conf.json:

FieldValue
productNameDisk Map
identifiercom.shadowwalker.disk-map
version0.1.0
app.windows[0]1100 × 800, title Disk Map
build.devUrlhttp://localhost:1420
bundle.targetsall

Capabilities are declared in src-tauri/capabilities/default.json (core:default, opener:default, dialog:default).

Development

git clone https://github.com/buluma/disk-map.git
cd disk-map
npm install
npm run tauri dev

Tests

npm test# vitest (frontend utils/collector logic)
cargo test --manifest-path src-tauri/Cargo.toml # Rust scan engine + safety guards

verify: both suites must pass before a PR is mergeable.

Contributing

  1. Fork the repo.
  2. Create a feature branch (git checkout -b feature/my-thing).
  3. Commit changes (git commit -am 'Add my thing').
  4. Push (git push origin feature/my-thing).
  5. Open a Pull Request. Ensure npm test and cargo test pass.

Changelog

See Releases. (No CHANGELOG.md yet — TODO.)

Links

License

TODO — no LICENSE file present. Add one and update this section.

Credits

Built with Tauri v2 (Rust + React/TypeScript), inspired by DaisyDisk.

About

MacOS Disk Utility

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Disk Map

VersionTauriLicense

A Tauri v2 desktop storage scanner and cleanup tool inspired by DaisyDisk.

Navigation

LinesSection
1Title + Badges
7Tagline
9Description
13Prerequisites
19Installation
25Usage
31Features
47Command Reference
75Configuration
82Development
89Tests
99Contributing
105Changelog
109Links
113License
117Credits

Description

Disk Map scans folders and mounted volumes, maps file and folder sizes recursively, previews items, and stages cleanup candidates. It surfaces hidden and purgeable space (macOS APFS) so you can see what is consuming a volume beyond the files you can browse.

It is a staged-cleanup tool: nothing is mutated until you commit the Collector. Items move to Trash or are permanently deleted only after explicit confirmation, with per-item risk checks that block irreversible actions on critical paths.

The frontend is React + TypeScript on Vite; all filesystem work runs in a Rust backend command invoked over Tauri's IPC. Long scans execute in a blocking thread pool (spawn_blocking) so the UI stays responsive and emits live progress events.

Prerequisites

  • Runtime: Node.js 20.19+ (or newer LTS)
  • Package manager: npm
  • Rust: rustup toolchain (stable)
  • Platform deps: Tauri v2 macOS prerequisites (webkit2gtk/Xcode CLI equivalents). See Tauri v2 setup.

Installation

npm install

The Rust backend is compiled by Tauri at dev/build time; no separate install step is required.

Usage

npm run tauri dev # launch the app in development
npm run tauri build # produce a signed/unsigned desktop bundle

In-app: paste or pick a path, set max depth and exclude patterns, then Scan. Use the tree, largest-items, and file-type panels to find space hogs. Select items into the Collector, review risks, then commit to Trash or permanent delete.

Features

  • Recursive scan: full directory size = sum of children; children sorted by size descending.
  • Display depth pruning: server clamps max_display_depth to [1, 12] (default 4); deeper nodes keep their aggregated size but drop descendants from the payload.
  • Symlink-safe: uses symlink_metadata so symlinks are reported as file-like leaf nodes and never traversed.
  • Exclude patterns: case-insensitive substring match on name or full path; comma-separated from the UI.
  • Live progress: scan-progress events every 250 entries; newer scan for the same root cancels the older one.
  • Hidden + purgeable space: macOS APFS purgeable bytes via diskutil; hidden_bytes = volume.used − scanned.
  • Staged Collector: add/remove items, see summary + risk flags (missing, symlink, critical path, covered-by-parent). Permanent delete is blocked while any blocker risk exists.
  • Actions: Reveal in Finder, Open, Quick Look preview, Move to Trash, Permanently delete, plus list_volumes and reclaim_purgeable_space (macOS).
  • Favorites: persist starred scan roots under disk-map:favorites (deduped, survives restart).

Command Reference

All commands are invoked from the frontend via @tauri-apps/api/coreinvoke. The authoritative source is src-tauri/src/lib.rs; the registered handler list is the contract:

grep -n "scan_directory\|cancel_scan\|reveal_in_finder\|open_path\|preview_path\|move_to_trash\|inspect_path\|permanently_delete_path\|list_volumes\|get_purgeable_space\|reclaim_purgeable_space" src-tauri/src/lib.rs | grep "async fn\|fn "
CommandArgsReturnsPurpose
scan_directorypath, max_display_depth?, excludes?, client_scan_id?ScanResultRecursive size map + analytics
cancel_scanCancel all active scans (generation bump)
reveal_in_finderpathResult<(), String>Reveal in OS file manager
open_pathpathResult<(), String>Open item in default app
preview_pathpathResult<(), String>Quick Look (macOS) / open
move_to_trashpathResult<(), String>Move to Trash / Recycle Bin
inspect_pathpathPathInspectionexists/isSymlink/isDir
permanently_delete_pathpathResult<(), String>Delete file or dir (guarded)
list_volumesVec<VolumeInfo>Mounted volumes + capacity
get_purgeable_spacepathOption<u64>APFS purgeable bytes
reclaim_purgeable_spacepathResult<(), String>tmutil thinlocalsnapshots (macOS)

ScanResult shape (camelCase over the wire): root: DiskNode, largestFiles, fileTypes, skippedPaths, hiddenBytes?, purgeableBytes?, nodes, files, dirs, skipped, permissionDenied, errors, elapsedMs. See src-tauri/REFERENCE.md for every struct and constraint.

Configuration

No env vars are read by the app. The bundle is configured in src-tauri/tauri.conf.json:

FieldValue
productNameDisk Map
identifiercom.shadowwalker.disk-map
version0.1.0
app.windows[0]1100 × 800, title Disk Map
build.devUrlhttp://localhost:1420
bundle.targetsall

Capabilities are declared in src-tauri/capabilities/default.json (core:default, opener:default, dialog:default).

Development

git clone https://github.com/buluma/disk-map.git
cd disk-map
npm install
npm run tauri dev

Tests

npm test# vitest (frontend utils/collector logic)
cargo test --manifest-path src-tauri/Cargo.toml # Rust scan engine + safety guards

verify: both suites must pass before a PR is mergeable.

Contributing

  1. Fork the repo.
  2. Create a feature branch (git checkout -b feature/my-thing).
  3. Commit changes (git commit -am 'Add my thing').
  4. Push (git push origin feature/my-thing).
  5. Open a Pull Request. Ensure npm test and cargo test pass.

Changelog

See Releases. (No CHANGELOG.md yet — TODO.)

Links

License

TODO — no LICENSE file present. Add one and update this section.

Credits

Built with Tauri v2 (Rust + React/TypeScript), inspired by DaisyDisk.

About

MacOS Disk Utility

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Disk Map

VersionTauriLicense

A Tauri v2 desktop storage scanner and cleanup tool inspired by DaisyDisk.

Navigation

LinesSection
1Title + Badges
7Tagline
9Description
13Prerequisites
19Installation
25Usage
31Features
47Command Reference
75Configuration
82Development
89Tests
99Contributing
105Changelog
109Links
113License
117Credits

Description

Disk Map scans folders and mounted volumes, maps file and folder sizes recursively, previews items, and stages cleanup candidates. It surfaces hidden and purgeable space (macOS APFS) so you can see what is consuming a volume beyond the files you can browse.

It is a staged-cleanup tool: nothing is mutated until you commit the Collector. Items move to Trash or are permanently deleted only after explicit confirmation, with per-item risk checks that block irreversible actions on critical paths.

The frontend is React + TypeScript on Vite; all filesystem work runs in a Rust backend command invoked over Tauri's IPC. Long scans execute in a blocking thread pool (spawn_blocking) so the UI stays responsive and emits live progress events.

Prerequisites

  • Runtime: Node.js 20.19+ (or newer LTS)
  • Package manager: npm
  • Rust: rustup toolchain (stable)
  • Platform deps: Tauri v2 macOS prerequisites (webkit2gtk/Xcode CLI equivalents). See Tauri v2 setup.

Installation

npm install

The Rust backend is compiled by Tauri at dev/build time; no separate install step is required.

Usage

npm run tauri dev # launch the app in development
npm run tauri build # produce a signed/unsigned desktop bundle

In-app: paste or pick a path, set max depth and exclude patterns, then Scan. Use the tree, largest-items, and file-type panels to find space hogs. Select items into the Collector, review risks, then commit to Trash or permanent delete.

Features

  • Recursive scan: full directory size = sum of children; children sorted by size descending.
  • Display depth pruning: server clamps max_display_depth to [1, 12] (default 4); deeper nodes keep their aggregated size but drop descendants from the payload.
  • Symlink-safe: uses symlink_metadata so symlinks are reported as file-like leaf nodes and never traversed.
  • Exclude patterns: case-insensitive substring match on name or full path; comma-separated from the UI.
  • Live progress: scan-progress events every 250 entries; newer scan for the same root cancels the older one.
  • Hidden + purgeable space: macOS APFS purgeable bytes via diskutil; hidden_bytes = volume.used − scanned.
  • Staged Collector: add/remove items, see summary + risk flags (missing, symlink, critical path, covered-by-parent). Permanent delete is blocked while any blocker risk exists.
  • Actions: Reveal in Finder, Open, Quick Look preview, Move to Trash, Permanently delete, plus list_volumes and reclaim_purgeable_space (macOS).
  • Favorites: persist starred scan roots under disk-map:favorites (deduped, survives restart).

Command Reference

All commands are invoked from the frontend via @tauri-apps/api/coreinvoke. The authoritative source is src-tauri/src/lib.rs; the registered handler list is the contract:

grep -n "scan_directory\|cancel_scan\|reveal_in_finder\|open_path\|preview_path\|move_to_trash\|inspect_path\|permanently_delete_path\|list_volumes\|get_purgeable_space\|reclaim_purgeable_space" src-tauri/src/lib.rs | grep "async fn\|fn "
CommandArgsReturnsPurpose
scan_directorypath, max_display_depth?, excludes?, client_scan_id?ScanResultRecursive size map + analytics
cancel_scanCancel all active scans (generation bump)
reveal_in_finderpathResult<(), String>Reveal in OS file manager
open_pathpathResult<(), String>Open item in default app
preview_pathpathResult<(), String>Quick Look (macOS) / open
move_to_trashpathResult<(), String>Move to Trash / Recycle Bin
inspect_pathpathPathInspectionexists/isSymlink/isDir
permanently_delete_pathpathResult<(), String>Delete file or dir (guarded)
list_volumesVec<VolumeInfo>Mounted volumes + capacity
get_purgeable_spacepathOption<u64>APFS purgeable bytes
reclaim_purgeable_spacepathResult<(), String>tmutil thinlocalsnapshots (macOS)

ScanResult shape (camelCase over the wire): root: DiskNode, largestFiles, fileTypes, skippedPaths, hiddenBytes?, purgeableBytes?, nodes, files, dirs, skipped, permissionDenied, errors, elapsedMs. See src-tauri/REFERENCE.md for every struct and constraint.

Configuration

No env vars are read by the app. The bundle is configured in src-tauri/tauri.conf.json:

FieldValue
productNameDisk Map
identifiercom.shadowwalker.disk-map
version0.1.0
app.windows[0]1100 × 800, title Disk Map
build.devUrlhttp://localhost:1420
bundle.targetsall

Capabilities are declared in src-tauri/capabilities/default.json (core:default, opener:default, dialog:default).

Development

git clone https://github.com/buluma/disk-map.git
cd disk-map
npm install
npm run tauri dev

Tests

npm test# vitest (frontend utils/collector logic)
cargo test --manifest-path src-tauri/Cargo.toml # Rust scan engine + safety guards

verify: both suites must pass before a PR is mergeable.

Contributing

  1. Fork the repo.
  2. Create a feature branch (git checkout -b feature/my-thing).
  3. Commit changes (git commit -am 'Add my thing').
  4. Push (git push origin feature/my-thing).
  5. Open a Pull Request. Ensure npm test and cargo test pass.

Changelog

See Releases. (No CHANGELOG.md yet — TODO.)

Links

License

TODO — no LICENSE file present. Add one and update this section.

Credits

Built with Tauri v2 (Rust + React/TypeScript), inspired by DaisyDisk.

About

MacOS Disk Utility

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Disk Map

VersionTauriLicense

A Tauri v2 desktop storage scanner and cleanup tool inspired by DaisyDisk.

Navigation

LinesSection
1Title + Badges
7Tagline
9Description
13Prerequisites
19Installation
25Usage
31Features
47Command Reference
75Configuration
82Development
89Tests
99Contributing
105Changelog
109Links
113License
117Credits

Description

Disk Map scans folders and mounted volumes, maps file and folder sizes recursively, previews items, and stages cleanup candidates. It surfaces hidden and purgeable space (macOS APFS) so you can see what is consuming a volume beyond the files you can browse.

It is a staged-cleanup tool: nothing is mutated until you commit the Collector. Items move to Trash or are permanently deleted only after explicit confirmation, with per-item risk checks that block irreversible actions on critical paths.

The frontend is React + TypeScript on Vite; all filesystem work runs in a Rust backend command invoked over Tauri's IPC. Long scans execute in a blocking thread pool (spawn_blocking) so the UI stays responsive and emits live progress events.

Prerequisites

  • Runtime: Node.js 20.19+ (or newer LTS)
  • Package manager: npm
  • Rust: rustup toolchain (stable)
  • Platform deps: Tauri v2 macOS prerequisites (webkit2gtk/Xcode CLI equivalents). See Tauri v2 setup.

Installation

npm install

The Rust backend is compiled by Tauri at dev/build time; no separate install step is required.

Usage

npm run tauri dev # launch the app in development
npm run tauri build # produce a signed/unsigned desktop bundle

In-app: paste or pick a path, set max depth and exclude patterns, then Scan. Use the tree, largest-items, and file-type panels to find space hogs. Select items into the Collector, review risks, then commit to Trash or permanent delete.

Features

  • Recursive scan: full directory size = sum of children; children sorted by size descending.
  • Display depth pruning: server clamps max_display_depth to [1, 12] (default 4); deeper nodes keep their aggregated size but drop descendants from the payload.
  • Symlink-safe: uses symlink_metadata so symlinks are reported as file-like leaf nodes and never traversed.
  • Exclude patterns: case-insensitive substring match on name or full path; comma-separated from the UI.
  • Live progress: scan-progress events every 250 entries; newer scan for the same root cancels the older one.
  • Hidden + purgeable space: macOS APFS purgeable bytes via diskutil; hidden_bytes = volume.used − scanned.
  • Staged Collector: add/remove items, see summary + risk flags (missing, symlink, critical path, covered-by-parent). Permanent delete is blocked while any blocker risk exists.
  • Actions: Reveal in Finder, Open, Quick Look preview, Move to Trash, Permanently delete, plus list_volumes and reclaim_purgeable_space (macOS).
  • Favorites: persist starred scan roots under disk-map:favorites (deduped, survives restart).

Command Reference

All commands are invoked from the frontend via @tauri-apps/api/coreinvoke. The authoritative source is src-tauri/src/lib.rs; the registered handler list is the contract:

grep -n "scan_directory\|cancel_scan\|reveal_in_finder\|open_path\|preview_path\|move_to_trash\|inspect_path\|permanently_delete_path\|list_volumes\|get_purgeable_space\|reclaim_purgeable_space" src-tauri/src/lib.rs | grep "async fn\|fn "
CommandArgsReturnsPurpose
scan_directorypath, max_display_depth?, excludes?, client_scan_id?ScanResultRecursive size map + analytics
cancel_scanCancel all active scans (generation bump)
reveal_in_finderpathResult<(), String>Reveal in OS file manager
open_pathpathResult<(), String>Open item in default app
preview_pathpathResult<(), String>Quick Look (macOS) / open
move_to_trashpathResult<(), String>Move to Trash / Recycle Bin
inspect_pathpathPathInspectionexists/isSymlink/isDir
permanently_delete_pathpathResult<(), String>Delete file or dir (guarded)
list_volumesVec<VolumeInfo>Mounted volumes + capacity
get_purgeable_spacepathOption<u64>APFS purgeable bytes
reclaim_purgeable_spacepathResult<(), String>tmutil thinlocalsnapshots (macOS)

ScanResult shape (camelCase over the wire): root: DiskNode, largestFiles, fileTypes, skippedPaths, hiddenBytes?, purgeableBytes?, nodes, files, dirs, skipped, permissionDenied, errors, elapsedMs. See src-tauri/REFERENCE.md for every struct and constraint.

Configuration

No env vars are read by the app. The bundle is configured in src-tauri/tauri.conf.json:

FieldValue
productNameDisk Map
identifiercom.shadowwalker.disk-map
version0.1.0
app.windows[0]1100 × 800, title Disk Map
build.devUrlhttp://localhost:1420
bundle.targetsall

Capabilities are declared in src-tauri/capabilities/default.json (core:default, opener:default, dialog:default).

Development

git clone https://github.com/buluma/disk-map.git
cd disk-map
npm install
npm run tauri dev

Tests

npm test# vitest (frontend utils/collector logic)
cargo test --manifest-path src-tauri/Cargo.toml # Rust scan engine + safety guards

verify: both suites must pass before a PR is mergeable.

Contributing

  1. Fork the repo.
  2. Create a feature branch (git checkout -b feature/my-thing).
  3. Commit changes (git commit -am 'Add my thing').
  4. Push (git push origin feature/my-thing).
  5. Open a Pull Request. Ensure npm test and cargo test pass.

Changelog

See Releases. (No CHANGELOG.md yet — TODO.)

Links

License

TODO — no LICENSE file present. Add one and update this section.

Credits

Built with Tauri v2 (Rust + React/TypeScript), inspired by DaisyDisk.

About

MacOS Disk Utility

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Disk Map

VersionTauriLicense

A Tauri v2 desktop storage scanner and cleanup tool inspired by DaisyDisk.

Navigation

LinesSection
1Title + Badges
7Tagline
9Description
13Prerequisites
19Installation
25Usage
31Features
47Command Reference
75Configuration
82Development
89Tests
99Contributing
105Changelog
109Links
113License
117Credits

Description

Disk Map scans folders and mounted volumes, maps file and folder sizes recursively, previews items, and stages cleanup candidates. It surfaces hidden and purgeable space (macOS APFS) so you can see what is consuming a volume beyond the files you can browse.

It is a staged-cleanup tool: nothing is mutated until you commit the Collector. Items move to Trash or are permanently deleted only after explicit confirmation, with per-item risk checks that block irreversible actions on critical paths.

The frontend is React + TypeScript on Vite; all filesystem work runs in a Rust backend command invoked over Tauri's IPC. Long scans execute in a blocking thread pool (spawn_blocking) so the UI stays responsive and emits live progress events.

Prerequisites

  • Runtime: Node.js 20.19+ (or newer LTS)
  • Package manager: npm
  • Rust: rustup toolchain (stable)
  • Platform deps: Tauri v2 macOS prerequisites (webkit2gtk/Xcode CLI equivalents). See Tauri v2 setup.

Installation

npm install

The Rust backend is compiled by Tauri at dev/build time; no separate install step is required.

Usage

npm run tauri dev # launch the app in development
npm run tauri build # produce a signed/unsigned desktop bundle

In-app: paste or pick a path, set max depth and exclude patterns, then Scan. Use the tree, largest-items, and file-type panels to find space hogs. Select items into the Collector, review risks, then commit to Trash or permanent delete.

Features

  • Recursive scan: full directory size = sum of children; children sorted by size descending.
  • Display depth pruning: server clamps max_display_depth to [1, 12] (default 4); deeper nodes keep their aggregated size but drop descendants from the payload.
  • Symlink-safe: uses symlink_metadata so symlinks are reported as file-like leaf nodes and never traversed.
  • Exclude patterns: case-insensitive substring match on name or full path; comma-separated from the UI.
  • Live progress: scan-progress events every 250 entries; newer scan for the same root cancels the older one.
  • Hidden + purgeable space: macOS APFS purgeable bytes via diskutil; hidden_bytes = volume.used − scanned.
  • Staged Collector: add/remove items, see summary + risk flags (missing, symlink, critical path, covered-by-parent). Permanent delete is blocked while any blocker risk exists.
  • Actions: Reveal in Finder, Open, Quick Look preview, Move to Trash, Permanently delete, plus list_volumes and reclaim_purgeable_space (macOS).
  • Favorites: persist starred scan roots under disk-map:favorites (deduped, survives restart).

Command Reference

All commands are invoked from the frontend via @tauri-apps/api/coreinvoke. The authoritative source is src-tauri/src/lib.rs; the registered handler list is the contract:

grep -n "scan_directory\|cancel_scan\|reveal_in_finder\|open_path\|preview_path\|move_to_trash\|inspect_path\|permanently_delete_path\|list_volumes\|get_purgeable_space\|reclaim_purgeable_space" src-tauri/src/lib.rs | grep "async fn\|fn "
CommandArgsReturnsPurpose
scan_directorypath, max_display_depth?, excludes?, client_scan_id?ScanResultRecursive size map + analytics
cancel_scanCancel all active scans (generation bump)
reveal_in_finderpathResult<(), String>Reveal in OS file manager
open_pathpathResult<(), String>Open item in default app
preview_pathpathResult<(), String>Quick Look (macOS) / open
move_to_trashpathResult<(), String>Move to Trash / Recycle Bin
inspect_pathpathPathInspectionexists/isSymlink/isDir
permanently_delete_pathpathResult<(), String>Delete file or dir (guarded)
list_volumesVec<VolumeInfo>Mounted volumes + capacity
get_purgeable_spacepathOption<u64>APFS purgeable bytes
reclaim_purgeable_spacepathResult<(), String>tmutil thinlocalsnapshots (macOS)

ScanResult shape (camelCase over the wire): root: DiskNode, largestFiles, fileTypes, skippedPaths, hiddenBytes?, purgeableBytes?, nodes, files, dirs, skipped, permissionDenied, errors, elapsedMs. See src-tauri/REFERENCE.md for every struct and constraint.

Configuration

No env vars are read by the app. The bundle is configured in src-tauri/tauri.conf.json:

FieldValue
productNameDisk Map
identifiercom.shadowwalker.disk-map
version0.1.0
app.windows[0]1100 × 800, title Disk Map
build.devUrlhttp://localhost:1420
bundle.targetsall

Capabilities are declared in src-tauri/capabilities/default.json (core:default, opener:default, dialog:default).

Development

git clone https://github.com/buluma/disk-map.git
cd disk-map
npm install
npm run tauri dev

Tests

npm test# vitest (frontend utils/collector logic)
cargo test --manifest-path src-tauri/Cargo.toml # Rust scan engine + safety guards

verify: both suites must pass before a PR is mergeable.

Contributing

  1. Fork the repo.
  2. Create a feature branch (git checkout -b feature/my-thing).
  3. Commit changes (git commit -am 'Add my thing').
  4. Push (git push origin feature/my-thing).
  5. Open a Pull Request. Ensure npm test and cargo test pass.

Changelog

See Releases. (No CHANGELOG.md yet — TODO.)

Links

License

TODO — no LICENSE file present. Add one and update this section.

Credits

Built with Tauri v2 (Rust + React/TypeScript), inspired by DaisyDisk.

About

MacOS Disk Utility

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Disk Map

VersionTauriLicense

A Tauri v2 desktop storage scanner and cleanup tool inspired by DaisyDisk.

Navigation

LinesSection
1Title + Badges
7Tagline
9Description
13Prerequisites
19Installation
25Usage
31Features
47Command Reference
75Configuration
82Development
89Tests
99Contributing
105Changelog
109Links
113License
117Credits

Description

Disk Map scans folders and mounted volumes, maps file and folder sizes recursively, previews items, and stages cleanup candidates. It surfaces hidden and purgeable space (macOS APFS) so you can see what is consuming a volume beyond the files you can browse.

It is a staged-cleanup tool: nothing is mutated until you commit the Collector. Items move to Trash or are permanently deleted only after explicit confirmation, with per-item risk checks that block irreversible actions on critical paths.

The frontend is React + TypeScript on Vite; all filesystem work runs in a Rust backend command invoked over Tauri's IPC. Long scans execute in a blocking thread pool (spawn_blocking) so the UI stays responsive and emits live progress events.

Prerequisites

  • Runtime: Node.js 20.19+ (or newer LTS)
  • Package manager: npm
  • Rust: rustup toolchain (stable)
  • Platform deps: Tauri v2 macOS prerequisites (webkit2gtk/Xcode CLI equivalents). See Tauri v2 setup.

Installation

npm install

The Rust backend is compiled by Tauri at dev/build time; no separate install step is required.

Usage

npm run tauri dev # launch the app in development
npm run tauri build # produce a signed/unsigned desktop bundle

In-app: paste or pick a path, set max depth and exclude patterns, then Scan. Use the tree, largest-items, and file-type panels to find space hogs. Select items into the Collector, review risks, then commit to Trash or permanent delete.

Features

  • Recursive scan: full directory size = sum of children; children sorted by size descending.
  • Display depth pruning: server clamps max_display_depth to [1, 12] (default 4); deeper nodes keep their aggregated size but drop descendants from the payload.
  • Symlink-safe: uses symlink_metadata so symlinks are reported as file-like leaf nodes and never traversed.
  • Exclude patterns: case-insensitive substring match on name or full path; comma-separated from the UI.
  • Live progress: scan-progress events every 250 entries; newer scan for the same root cancels the older one.
  • Hidden + purgeable space: macOS APFS purgeable bytes via diskutil; hidden_bytes = volume.used − scanned.
  • Staged Collector: add/remove items, see summary + risk flags (missing, symlink, critical path, covered-by-parent). Permanent delete is blocked while any blocker risk exists.
  • Actions: Reveal in Finder, Open, Quick Look preview, Move to Trash, Permanently delete, plus list_volumes and reclaim_purgeable_space (macOS).
  • Favorites: persist starred scan roots under disk-map:favorites (deduped, survives restart).

Command Reference

All commands are invoked from the frontend via @tauri-apps/api/coreinvoke. The authoritative source is src-tauri/src/lib.rs; the registered handler list is the contract:

grep -n "scan_directory\|cancel_scan\|reveal_in_finder\|open_path\|preview_path\|move_to_trash\|inspect_path\|permanently_delete_path\|list_volumes\|get_purgeable_space\|reclaim_purgeable_space" src-tauri/src/lib.rs | grep "async fn\|fn "
CommandArgsReturnsPurpose
scan_directorypath, max_display_depth?, excludes?, client_scan_id?ScanResultRecursive size map + analytics
cancel_scanCancel all active scans (generation bump)
reveal_in_finderpathResult<(), String>Reveal in OS file manager
open_pathpathResult<(), String>Open item in default app
preview_pathpathResult<(), String>Quick Look (macOS) / open
move_to_trashpathResult<(), String>Move to Trash / Recycle Bin
inspect_pathpathPathInspectionexists/isSymlink/isDir
permanently_delete_pathpathResult<(), String>Delete file or dir (guarded)
list_volumesVec<VolumeInfo>Mounted volumes + capacity
get_purgeable_spacepathOption<u64>APFS purgeable bytes
reclaim_purgeable_spacepathResult<(), String>tmutil thinlocalsnapshots (macOS)

ScanResult shape (camelCase over the wire): root: DiskNode, largestFiles, fileTypes, skippedPaths, hiddenBytes?, purgeableBytes?, nodes, files, dirs, skipped, permissionDenied, errors, elapsedMs. See src-tauri/REFERENCE.md for every struct and constraint.

Configuration

No env vars are read by the app. The bundle is configured in src-tauri/tauri.conf.json:

FieldValue
productNameDisk Map
identifiercom.shadowwalker.disk-map
version0.1.0
app.windows[0]1100 × 800, title Disk Map
build.devUrlhttp://localhost:1420
bundle.targetsall

Capabilities are declared in src-tauri/capabilities/default.json (core:default, opener:default, dialog:default).

Development

git clone https://github.com/buluma/disk-map.git
cd disk-map
npm install
npm run tauri dev

Tests

npm test# vitest (frontend utils/collector logic)
cargo test --manifest-path src-tauri/Cargo.toml # Rust scan engine + safety guards

verify: both suites must pass before a PR is mergeable.

Contributing

  1. Fork the repo.
  2. Create a feature branch (git checkout -b feature/my-thing).
  3. Commit changes (git commit -am 'Add my thing').
  4. Push (git push origin feature/my-thing).
  5. Open a Pull Request. Ensure npm test and cargo test pass.

Changelog

See Releases. (No CHANGELOG.md yet — TODO.)

Links

License

TODO — no LICENSE file present. Add one and update this section.

Credits

Built with Tauri v2 (Rust + React/TypeScript), inspired by DaisyDisk.

About

MacOS Disk Utility

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages