]> ### next - fix: Scan Paths now rejects cache pool mounts, not just the share mount, both in the settings page and the daemon's own config validation - install: drop one-time `removepkg Unspin` migration line (legacy capital-U package name cleanup, no longer needed) ### 2026.07.10.38411 - fix: on slow boots (arrays/ZFS pools can take 20-30 min to mount) the daemon can now wait for each scan path to actually mount before adding the fanotify watch (GH #3) - feat: configurable mount wait - MOUNT_WAIT_TIMEOUT_MINS (default 45, 0 disables) and MOUNT_RETRY_INTERVAL_SECS (default 30), also available on the settings page - feat: Unraid notifications - a warning while waiting for storage, a notice when all scan paths mount, and an alert if the wait times out - fix: a scan path is now considered ready only when it is a genuine mount point, avoiding accidentally watching the root filesystem - fix: log trimming is size-based, checked continuously; prevent out of memory errors - fix: log also trims when its disk is nearly full, and keeps checking on schedule while paused - fix: switching Log Level to Debug and hitting Apply could crash the settings page with an out-of-memory error on a large log; recent-files panel also now shows/hides immediately without a reload - feat: on debug logging, the settings page now shows condensed "5 Recently Accessed Files" panels per watched disk (GH #4) - feat: new checkbox to exclude skipped shares from both these panels and the log view (GH #4) - feat: new "Include excluded shares in Debug log" setting (default No) is used to prevent noisy skipped shares pushing Recent Files out of the log's retention window - fix: the daemon now actually looks up the nobody user's uid/gid at startup instead of using hardcoded Unraid values - fix: log an error if that lookup fails or if a chown on a created directory or promoted file fails - refactor: move duplicate config/share-parsing helpers (load_cfg, daemon_running, share detection) to shared include - docs: document the new mount-wait/log-trim/rsync-pause settings, note Mover Tuning also pauses via PAUSE_ON_RSYNC, update Project Structure ### 2026.04.29.43847 - docs: fix plugin title rendering in README (broken bold markdown) ### 2026.04.29.42607 - fix: plugin name attribute lowercased to match install dir so Unraid renders README.md on the Plugins page (was falling back to plain bold name due to case mismatch) - pkg: TXZ filename lowercased to unspin-VERSION-x86_64-1.txz - install: one-time removepkg of legacy capital-U package on upgrade to keep slackware pkg db clean ### 2026.04.29.37949 - ui: per-share Status column updates live when ticking/unticking Watch checkboxes (no reload required) - ui: clicking the Detected Shares label scrolls the help text into view since it sits below the share list - ui: Detected Shares help text reminds you to click Apply to save changes ### 2026.04.28.72996 - ui: footer Sponsor link now points to GitHub Sponsors - docs: README and forum post updated for per-share pool routing and Detected Shares ### 2026.04.28.71931 - ci: accept YYYY.MM.DD.SECS-dev tags, publish as GitHub prereleases for staged testing - feat: per-share routing - promotion destinations now come from each share's shareCachePool; HOT_PATH removed - feat: per-pool fill thresholds - MAX_FILL_PERCENT_pool replaces the single MAX_HOT_FILL_PERCENT; legacy value migrates as a seed on first UI save - ui: cosmetics - daemon: skip shares unless shareUseCache is yes or prefer and a cache pool is configured - init: rc.unspin stop also kills orphan unspind processes not tracked in the pidfile - docs: add README.md shown on the Unraid plugin page ### 2026.04.23.50591 - fix: hot-path directories created during promotion ended up 0755 instead of 0777 because the daemon inherited the init script's umask; daemon now clears umask at startup so explicit modes on mkdir/open are honored - ui: paused status now shows the pause reason (e.g. "Running (Paused: mover, rsync)") instead of just "Running (Paused)" - ui: footer label renames; fix stray closing tag and stale tooltip ### 2026.04.03.44482 - add support forum URL to CA template, settings page footer, and README badge ### 2026.04.02.83096 - display version number in the footer - final release preparations: screenshots, forum post, readme, license ### 2026.04.02.55974 - fix: human_size used decimal (1e6) while parse_size used binary (1024) units — now both use binary - fix: open/close tracking during pause/rsync — close events were swallowed, leaving open_count inflated and blocking promotion - log full config on SIGHUP reload, not just watched mounts - docs: add remote pause/unpause section for backup scripts ### 2026.04.02.46831 - process external transfer detection (rsync/mover) outside of monitored events - cosmetics and update Claude generated documentation, comments, and logs - fix: saving settings while paused no longer unpauses the daemon (SIGHUP reload instead of restart) - defer promotion until all open handles are closed (prevents file-not-found errors for SMB/NFS clients) ### 2026.04.01.59747 - Initial release - reworked from the now-deprecated Hotfile project echo " " echo " " echo " ## " echo " ##### " echo " ###### " echo " ######## " echo " ########### " echo " ############# " echo " ################ " echo " ################## " echo " #################### " echo " ###################### " echo " ######################## " echo " ######################### " echo " ######################## " echo " ####################### " echo " ##################### " echo " ################### " echo " ################# " echo " ############## " echo " ########### " echo " ########## " echo " ####### " echo " ###### " echo " ### " echo " " echo " " echo " " echo " #########################################" VER="&version;" LEFT=" U N S P I N " RIGHT="v${VER} " PAD=$(( 39 - ${#LEFT} - ${#RIGHT} )) printf " #%s%${PAD}s%s#\n" "$LEFT" "" "$RIGHT" echo " #########################################" echo "" # Stop daemon before replacing files /etc/rc.d/rc.unspin stop 2>/dev/null # Remove old version if present removepkg &name; 2>/dev/null # Download and install the package wget -q -O /tmp/&name;.txz "https://github.com/kaedinger/unspin/releases/download/&version;/&name;-&version;-x86_64-1.txz" installpkg /tmp/&name;.txz rm -f /tmp/&name;.txz # Create config dir mkdir -p /boot/config/plugins/unspin # Copy default config if none exists, then auto-detect array disks CFG=/boot/config/plugins/unspin/unspin.cfg if [ ! -f "$CFG" ]; then cp /usr/local/emhttp/plugins/unspin/unspin.cfg.default "$CFG" # Detect mounted array disks (/mnt/disk1, /mnt/disk2, …) DISK_PATHS=$(awk '$2 ~ /^\/mnt\/disk[0-9]+$/ {print $2}' /proc/mounts | sort -V | paste -sd,) if [ -n "$DISK_PATHS" ]; then sed -i "s|SCAN_PATHS=.*|SCAN_PATHS=\"$DISK_PATHS\"|" "$CFG" echo "Unspin: auto-detected array disks: $DISK_PATHS" else echo "Unspin: no array disks detected - set SCAN_PATHS manually in the settings page." fi fi touch /var/log/unspin.log chmod +x /usr/local/sbin/unspind /etc/rc.d/rc.unspin 2>/dev/null # Start daemon if service is enabled source "$CFG" if [ "$SERVICE" = "enabled" ]; then /etc/rc.d/rc.unspin start fi echo "Unspin plugin installed successfully." # Stop the daemon /etc/rc.d/rc.unspin stop 2>/dev/null # Remove package removepkg &name; echo "Unspin plugin removed. Config preserved at /boot/config/plugins/unspin/"