Releases: aaronbassett/mutx
Releases · aaronbassett/mutx
0.3.0 - 2026-01-30
Release Notes
Note: Version numbers rolled back from v1.1.0 to v0.3.0 to better signal
pre-release status. Version 1.0.0 is reserved for the first stable public release.
Added
- Explicit
mutx writesubcommand (implicitmutxstill works for backward compatibility) - Housekeep subcommands:
locks,backups,all --suffixflag forhousekeep backupsto clean custom backup patterns--locks-dirand--backups-dirflags forhousekeep allfor targeted cleanup
Fixed
- Backup suffix validation now occurs before lock acquisition in write command
- Incorrect help text for
--follow-symlinksflag corrected - Misleading
housekeep allexamples in README clarified - CRITICAL:
--backup-suffixnow functional (was silently ignored in v1.1.0) - Housekeep locks defaults to cache directory instead of current directory
- README examples corrected to match actual CLI syntax
- Lock file collision when output filename ends in
.lock - Race condition where deleting lock files breaks mutual exclusion
- Symlink traversal vulnerability in housekeep recursive cleanup
- Backup detection matching unrelated user files with
.backupin name - Base filename extraction in housekeep using unreliable string search
Changed
- BREAKING: Housekeep now uses subcommands instead of flags:
mutx housekeep --clean-locks→mutx housekeep locksmutx housekeep --clean-backups→mutx housekeep backupsmutx housekeep --all→mutx housekeep all [DIR]
- BREAKING:
--timeoutnow takes milliseconds instead of seconds- Old:
mutx write --timeout 5(5 seconds) - New:
mutx write --timeout 5000(5000 milliseconds)
- Old:
- BREAKING: Lock file location moved from output directory to platform cache directory
- Linux:
~/.cache/mutx/locks/ - macOS:
~/Library/Caches/mutx/locks/ - Windows:
%LOCALAPPDATA%\mutx\locks\ - Prevents collision when output filename ends in
.lock - Eliminates race condition from lock file deletion
- Lock files persist for proper mutual exclusion
- Run
mutx housekeep locksto clean orphaned locks - Lock filename format:
{initialism}.{parent}.{filename}.{hash}.lock
- Linux:
- BREAKING: Symlinks rejected by default
- Prevents symlink traversal attacks in housekeep operations
- Prevents lock file symlink attacks that could clobber arbitrary files
- Use
--follow-symlinksto allow symlinks for output files and housekeep - Use
--follow-lock-symlinksto allow symlinks for lock files (security risk) - Housekeep skips symlinks by default to prevent directory escape
- BREAKING: Backup filename format changed to prevent collisions
- New format:
{filename}.{YYYYMMDD_HHMMSS}.mutx.backup - Example:
data.txt.20260125_143022.mutx.backup - Timestamp validation ensures only mutx-created backups are cleaned
- Prevents accidental deletion of user backup files
- Old backup format no longer recognized by housekeep (manual cleanup if needed)
- New format:
- BREAKING: Default backup suffix changed from
.backupto.mutx.backup - Version numbering strategy: v0.x for pre-release, v1.0.0+ for stable
- Removed unused
mutx-macrosworkspace dependency
Security
- Lock acquisition uses exponential backoff with jitter
- Starts at 10ms for low latency on quick lock releases
- Exponential backoff with 1.5x multiplier reduces CPU usage
- Random jitter (0-100ms) prevents thundering herd on simultaneous timeouts
- Add
--max-poll-intervalflag to configure maximum timeout polling interval- Default: 1000ms
- Example:
mutx write --timeout 30000 --max-poll-interval 2000
- Removed unused dependencies (
anyhow,libcas global dep) - Added
directoriescrate for platform-specific cache paths - Added
randcrate for timeout jitter - Added
sha2crate for lock filename hashing - Keep
libcas Unix-only dependency for O_NOFOLLOW
Documentation
- Clarified Windows support status in README (experimental, not actively tested)
- Added security rationale to error messages for symlink rejection
- Documented lock file persistence behavior (no auto-deletion)
Install mutx 0.3.0
Install prebuilt binaries via Homebrew
brew install aaronbassett/tap/mutxDownload mutx 0.3.0
| File | Platform | Checksum |
|---|---|---|
| mutx-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| mutx-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| mutx-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| mutx-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |