Engine / safety:
- verify mount points against /proc/self/mountinfo instead of path
existence; refuse to sync into a leftover (unmounted) directory that
would otherwise receive the library on the root filesystem
- resolve udisks block devices by label when the path is not mounted,
and never let findmnt fall back to the containing root filesystem
- abort now SIGTERMs the whole child process group (sh -c/podkit and
rsync children included), escalating to SIGKILL after 2s
- quitting while a sync runs aborts and waits for the engine instead of
orphaning the child
- atomically mark the engine busy before spawning to prevent double
syncs; persist state before publishing completion
- don't follow symlinked directories while scanning (recursion loops)
- prune empty directories recursively when removing stale files
UI:
- help overlay was clipped (hardcoded height): size it from content
- speed/ETA were pushed onto a line the progress panel clipped; show
them right-aligned on the bytes row
- leaving log follow with u/d now scrolls from the bottom instead of
jumping to the top of the log
- reload config with r (label updated), refresh mounts on completion so
last-sync ages are current
- fix width underflows on narrow terminals; terminal-aware sidebar
scrolling
Tests: mountinfo unescape, process-group abort, and a TestBackend render
smoke test covering all tabs, small terminals and the help overlay.
- m key toggles mount/unmount of the selected device via udisksctl
(resolves the block device from mount point or lsblk label)
- rsync-style device sync auto-mounts the target first
- mlove finalize unmounts via udisksctl, falling back to sudo -n umount
- keybar/help/README updated
- New Firmware::Sony mapped from firmware = "sony"; behaves like
rockbox/android (rsync to mounted volume, no fatsort)
- Green badge on dashboard; config parsing test included
- Real config: Sony NW-A55 + Walkman WM1 switched to firmware = "sony"
- Remove the separate Config tab (3 tabs now); each player's settings
(content type, mount point, music folder, fat order, sync command) are shown
in a PLAYER SETTINGS card on the dashboard
- Show mounted storage on the device card: total/free space (statvfs) plus a
usage gauge
- Add library + sync-pipeline cards and full-width SYNC PATH chain
- Update keybar/help/README for 3 tabs
Full rewrite of dap-sync as a Rust TUI on ratatui:
- Tokyo Night theme, gradient title rule, rounded panels
- Devices sidebar with live mount status + last-sync age
- Dashboard / Sync / Logs / Config tabs
- Live sync engine: rclone mirror, NFC-aware diff, rsync
progress parsing, podkit + mlove (fatsort) finalize
- Abort-safe subprocess handling, persisted sync state