Repository navigation
Releases: Epistates/gravityfile
Releases · Epistates/gravityfile
Release list
0.4.1 - 2026-10-20
Release Notes
The release binaries for 0.4.0, which were never published because the
static Linux build failed. What changed in 0.4.0, a rewrite of the scanner,
explorer and command line, is in the
0.4.0 notes.
Fixed
- The static (musl) Linux build links. The no-overwrite rename now makes the
renameat2system call itself, since musl has no wrapper for it, and CI
builds and tests for musl.
Install gravityfile 0.4.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/epistates/gravityfile/releases/download/v0.4.1/gravityfile-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/epistates/gravityfile/releases/download/v0.4.1/gravityfile-installer.ps1 | iex"Download gravityfile 0.4.1
| File | Platform | Checksum |
|---|---|---|
| gravityfile-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| gravityfile-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| gravityfile-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| gravityfile-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| gravityfile-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| gravityfile-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |
Verifying GitHub Artifact Attestations
The artifacts in this release have attestations generated with GitHub Artifact Attestations. These can be verified by using the GitHub CLI:
gh attestation verify <file-path of downloaded artifact> --repo epistates/gravityfileYou can also download the attestation from GitHub and verify against that directly:
gh attestation verify <file-path of downloaded artifact> --bundle <file-path of downloaded attestation>v0.3.0
First release since 0.2.4; this entry consolidates all changes shipped since
that release.
Security
- Enforced plugin sandbox permissions - Declared
PluginPermissionsare now bridged into an enforcedSandboxConfigscoped to the scan root, so a plugin's filesystem/network/env/command grants are actually applied rather than advisory; filesystem access defaults to deny-all via the newfs_read_rootsconfiguration - Hardened hook dispatch - Added a Tower-based middleware pipeline (timeout/util) around hook dispatch to bound plugin execution
- WASM runtime removed - Removed the Extism/WASM plugin runtime because the latest Extism release pins a vulnerable Wasmtime line; Lua and Rhai plugin runtimes remain supported
Fixed
- Data-loss-safe overwrites -
Overwrite/OverwriteAllcopy and move operations now stage into a temporary sibling and atomically swap into place, so a mid-operation failure can never destroy the existing destination - Directory recursion guard - Added a maximum directory recursion depth to prevent stack overflow on adversarially deep nesting during recursive copy/move
- Lua value conversion drift - Centralized Lua↔
Valueconversions inlua/convert.rsso the main runtime and the isolated context can no longer disagree on array-vs-object handling (the isolate previously flattened Lua arrays into objects) - Quit unresponsive during mouse activity - Replaced sync
crossterm::event::poll/readdrain loop with asyncEventStream::now_or_never(), fixing key events (q, Ctrl-C) being dropped when mouse motion floods the event queue - Slow quit - Skip event drain, navigation check, and suspend handling once quit is triggered; reduced runtime shutdown timeout from 100ms to 10ms
- Terminal cleanup on quit - Drain buffered events after disabling mouse capture before restoring terminal, preventing raw escape sequences from leaking to the shell
- Crossterm backend alignment - Updated Ratatui/Crossterm integration to use a single Crossterm 0.29 backend stack
- Unused
treemddependency - Removed the optional Rusttreemdcrate and feature while preserving externaltreemdcommand integration - Robustness coverage - Added integration tests for copy/move/undo file workflows, symlink-preserving copies, duplicate hardlink handling, and age-analysis bucket/stale-directory reporting
Changed
- Ops internals deduplicated - Extracted shared copy/symlink/remove helpers across the copy and move paths
- TUI/scan/core refinements - Rendering, scanning, tree, and configuration cleanups
- Dependencies updated - Bumped direct workspace dependencies to current releases, including
zip8,bzip20.6,rayon1.12,compact_str0.9,which8, andcrossterm0.29 - Latest dependency refresh - Updated direct dependencies to latest available releases, including
mlua0.12.0-rc.1 and the direct Unixlibcdependency to 1.0.0-alpha.3 - Lockfile refreshed - Pruned stale transitive dependencies after removing the unsafe WASM runtime path and unused optional dependencies
- Clippy cleanups - Kept the workspace warning-free under
cargo clippy --workspace --all-features -- -D warnings
v0.2.4
[0.2.4] - 2026-03-11
Added
- WASM Plugin Runtime - Full WebAssembly plugin support via Extism:
- Load
.wasmplugins alongside Lua and Rhai scripts - Hook dispatch, method invocation, and isolated execution contexts
- Automatic hook discovery by inspecting WASM exports
- Load
- Plugin System Integration - TUI now initializes and dispatches lifecycle hooks:
OnStartup,OnShutdown,OnNavigate,OnScanCompletehooks- Plugin manager with Lua, Rhai, and WASM runtimes registered at startup
- Non-blocking hook dispatch via
tokio::spawnfor scan-complete events
- Git Status Integration - Real-time git status indicators in file listings:
- Modified (
M), Staged (A), Untracked (?), Ignored (!), Conflict (C) indicators - Color-coded status using theme colors (modified=yellow, staged=green, etc.)
- Automatic detection of git repositories
- Works in both Tree and Miller column views
- Modified (
- Treemap Visualization - Squarified treemap view for disk usage analysis:
- Space-filling rectangular layout showing relative file/directory sizes
- Color intensity based on size ratio
- Keyboard navigation (arrow keys, Enter to drill down, Backspace to go up)
- Directory/file indicators with different border styles
- Size labels displayed within rectangles
- Visual Mode - Vim-style range selection:
- Press
Vto enter visual mode - Use
j/kto extend selection up/down - Selected range highlighted
Escexits and marks the selected range- Works seamlessly with existing mark system
- Press
- Archive Support - Create and extract archives with full format support:
- Supported formats: ZIP, TAR, TAR.GZ, TAR.BZ2, TAR.XZ
- Commands:
:extract [destination],:compress <name.zip|tar|tar.gz|...> - Archive preview: Shows file listing with sizes, compression ratios, and symlink indicators
- Symlink support: Preserves symlinks in archives (ZIP via Unix mode, TAR via link headers)
- Loop detection: Prevents infinite recursion when archiving circular symlinks
Security
- CRIT: Rhai code injection - Replaced string interpolation in
call_functionwithEngine::call_fnusing typed args and stored AST, eliminating arbitrary code execution via plugin args - CRIT: TAR decompression bomb bypass - Size limits now check actual bytes written to disk via
symlink_metadatainstead of trusting attacker-controlled header sizes - CRIT: Cross-filesystem move data loss - Added cleanup on partial copy failure and warning on source removal failure to prevent duplicate/orphaned content
- HIGH: Plugin sandbox bypass (Rhai) - All
fs_*functions now gate onSandboxConfig.can_read()viaArc-shared config - HIGH: Plugin sandbox bypass (Lua) -
LuaRuntimenow stores and passesSandboxConfigtocreate_fs_apiinstead ofNone - HIGH: Plugin sandbox bypass (WASM) - Manifest now maps sandbox config to
allowed_paths, memory limits, timeout; WASI disabled by default - MED: ZIP symlink escape - Deferred symlink extraction to second pass preventing symlink-redirected
create_dir_all - MED: Chained symlink attack - Always validate symlink targets against canonical destination, not only when
..present - MED: Empty sandbox = full access - Empty
allowed_read_paths/allowed_write_pathsnow deny by default instead of granting unrestricted access - MED: Lua
fs.read_bytesunbounded read - UsesFile::open().take(limit).read_to_end()instead of full allocation - MED: Lua instruction timeout bypass - Wrapped isolate execution in
tokio::time::timeoutfor wall-clock enforcement alongside instruction counter - Archive extraction hardened with path traversal prevention, ZIP bomb detection, and symlink escape prevention
Fixed
- Windows build - Replaced unstable
windows_by_handleAPIs (file_index(),number_of_links()) with stable fallbacks; hardlink dedup skipped on Windows - Move undo pipeline - Added
MoveCompletestruct carryingmoved_pairsfrom move operations, enabling proper undo recording - Cross-filesystem undo - Undo now falls back to copy+delete when
fs::renamefails across filesystems - Windows symlink - Choose
symlink_dirvssymlink_filebased on target type; log failures instead of silent discard - Fuzzy search highlights - Fixed misalignment on non-ASCII filenames by using character positions instead of byte offsets to match nucleo's UTF-32 indices
- Viewport height - Correctly subtracts 5 rows when directory tabs are visible instead of always 4
- Git pathspec - Empty relative path at repo root now produces
**instead of/** - Filename validation - Uses byte length (
name.len() > 255) matching OS enforcement instead of char count - Archive symlink icon - Symlinks in archive preview now show distinct
@icon instead of directory icon - Doc link warnings - Escaped
[PATH]in doc comments to prevent rustdoc treating them as links - Broken doc comment continuation in plugin crate module docs
- Test assertions updated to match actual
ScanConfigdefaults ContentHashtest helpers updated forBox<ContentHash>optimization- Duplicate finder tests fixed for correct file count assertions
Changed
- API Modernization - ~25 function signatures changed from
&PathBufto&Pathacross all crates, following Rust idioms for borrowed path parameters - Clippy Clean - Eliminated all clippy warnings across the workspace (let-chains, derive Default, redundant closures, clamp, strip_prefix, etc.)
- InodeTracker - Replaced
DashMapwithHashMapsince access is single-threaded; ~15% faster inode tracking - GlobSet reuse - Scanner reuses
ScanConfig's pre-compiledGlobSetwith fallback compilation for builder-created configs - Progress counter - Replaced
Arc<AtomicU64>with plainu64in sequential scan loop truncate_to_width- Extracted shared function toui/mod.rs, eliminating 3-way duplicationTuiConfig- Added#[non_exhaustive]to prevent future breakage from field additions- Cross-device filter - Extended to non-directory entries (files and symlinks), not just directory pruning
- Undo System Simplification -
FilesDeletedvariant now storespaths: Vec<PathBuf>;can_undo()always returnsfalsefor deletions - HookResult Serialization - Added
Serialize/Deserializederives for WASM interop - Dependencies Updated - All workspace dependencies brought to latest versions
Full Changelog: v0.2.3...v0.2.4
v0.2.3
gravityfile v0.2.2
[0.2.2] - 2026-01-16
Fixed
- Critical: Safe Deletion with Trash - All deletions now move files to system trash instead of permanent deletion, allowing recovery of accidentally deleted files
- Critical: Symlink Safety - Fixed symlink handling across all file operations to prevent accidental deletion of symlink targets:
- Uses
symlink_metadata()instead ofis_dir()to avoid following symlinks - Symlinks are always removed as files, never following their targets
- Applies to delete, copy, move, and undo operations
- Uses
- Critical: Errors View Delete Behavior - Pressing
din Errors view now correctly deletes the selected broken symlink, not items from the Explorer view - Delete Confirmation Modal - Now shows full paths (truncated from left if needed) instead of just filenames, with type indicators (🔗 for symlinks, 📁 for directories)
- Errors View Toggle Mark - Space key now properly marks/unmarks broken symlinks in Errors view
Added
- Errors View Footer Hints - Shows available actions (
Spcto select,dto delete,Escto clear) - Errors View Delete Hint - Selected broken symlinks show
[d to delete]hint - Errors View Mark Indicator - Marked items show
[x]prefix - Comprehensive Symlink Tests - Added tests for deleting symlinks to files, directories, broken symlinks, symlink chains, and directories containing symlinks
Changed
- Delete confirmation now says "Move to trash?" instead of "cannot be undone"
- Success messages now say "Moved to trash" instead of "Deleted"
Full Changelog: v0.2.1...v0.2.2
v0.2.1
v0.2.0
[0.2.0] - 2025-12-13
Added
- Miller Columns Layout - Ranger-style three-pane view (Parent | Current | Preview), toggle with
vor:layout miller - File Operations - Full clipboard support with vim-style keybindings:
y- Yank (copy) to clipboardx- Cut to clipboardp- Paste from clipboardr- Rename file/directorya- Create new fileA- Create new directoryT- Take (mkdir + cd into new directory)
- Conflict Resolution - Interactive handling for file conflicts during copy/move operations
- Cross-Platform Releases - GitHub Actions workflow for automated releases:
- Linux x86_64 and ARM64
- macOS Intel and Apple Silicon (with optional code signing/notarization)
- Windows x86_64
- CI Pipeline - Automated build and test on push/PR to main
Changed
- Improved navigation with history preservation across drill-down operations
- Enhanced details panel with more file metadata
Full Changelog: v0.1.3...v0.2.0
GravityFile v0.1.3
Fix UX during delete operations
Full Changelog: v0.1.2...v0.1.3
GravityFile v0.1.2
Initial public release