Releases: codad5/hard-sync
Releases · codad5/hard-sync
v1.0.0
[1.0.0] — 2026-03-08
First stable release. Complete ground-up rewrite with a new architecture, new config format, desktop app, and background watch support.
Added
Core library (hard-sync-core)
- Config system — named pairs stored in
~/.config/hard-sync/config.json - Two pair types: cross-drive (identified by UUID + volume label) and same-drive (
drive_id: null) - Drive detection — identifies drives by UUID and volume label, never by mount path
- Windows fix: strip
\\?\UNC prefix from canonicalized paths before mount-point comparison - Sync engine — mtime+size comparison by default; SHA256 opt-in via
--verify - Delete behaviors:
trash(default),delete,ignore— configurable per pair - Trash system — orphaned files moved to
.hard-sync-trash/<timestamp>_<filename>on target - Ignore patterns — built-in defaults + per-pair config list +
.hardsyncignorefile (gitignore-style) - File watcher —
notify-based, 500ms debounce for same-drive pairs - Drive poller — 3s interval for cross-drive pairs in watch mode
- Notification sounds —
rodio-based; built-in synthesized tones play by default (no setup required), custom WAV/MP3/OGG/FLAC paths configurable per event per pair list_connected_drives()— enumerate all mounted drives with removable flag and space infoget_config_path()andreset_config()— config introspection and reset- All public types implement
serde::Serialize+serde::Deserializefor use across IPC boundaries
CLI (hsync)
hsync init— set up a named pair; auto-detects drive type from pathshsync sync— one-shot sync with--dry-runand--verifyflagshsync watch— blocking foreground watch modehsync watch --detach— spawn watcher as a background daemon (PID + logs in~/.local/share/hsync/)hsync watch list— show all running background watchershsync watch attach— tail the log of a background watcher (Ctrl+C to detach, watcher keeps running)hsync watch stop— stop a specific background watcher or all (--all)hsync autostart enable/disable/list— register watchers to start on login via OS-native mechanismhsync list— show all configured pairshsync drives— list connected drives, annotated with pair matcheshsync set-source— flip which side is the source of truthhsync remove— remove a pair from config (no files deleted)hsync trash list— inspect trash for a pairhsync trash clear— delete trash for one pair or all pairshsync config path— print config file locationhsync config reset— delete config file and remove all pairs
Desktop app (Tauri + Svelte)
- System tray icon — left-click to open window, right-click for Show/Quit menu
- Pair list with status badges (watching / idle), drive pair indicator
- Sync now button — one-shot sync with result summary
- Watch / Stop toggle — spawns or stops the background
hsyncdaemon - Add pair form — name, base path, target path (with native OS folder picker), source side toggle
- Remove pair button
- Refresh button
CI/CD
release.yml— builds CLI binaries (hsync-windows-x86_64.exe,hsync-linux-x86_64,hsync-macos-x86_64) and Tauri desktop installers for all three platforms on every GitHub Releasepublish.yml— publisheshard-sync-coreandhard-sync-clito crates.io on release
Changed
- Replaced single-command
hard-sync-cliwith named-pair model — set up once, run by name forever - Replaced per-directory
.hard_sync_cli/state files with a single global config - Replaced path-based drive identification with UUID/label-based identification
Removed
- Old
--src/--dest/--reverse/--excludeflags (replaced by named pair config) - Per-directory state tracking (
.hard_sync_cli/directories) - Docker setup (incompatible with native OS audio, drive detection, and autostart features)