Tools: Haul :) a tiny file organizer daemon for Linux (2026)

Tools: Haul :) a tiny file organizer daemon for Linux (2026)

The trick — zero CPU when idle

Install

What it sorts

Fully configurable

Duplicate handling I hate messy Downloads folders. You know the feeling: At some point you just stop caring and let it rot. Cron jobs felt overkill — why poll every minute just to watch an empty folder? So I built haul. Drop a file in a watched folder, it moves it to the right place. That's it. haul uses inotify, a filesystem event API built into the Linux kernel. Instead of running a loop, it just waits for the kernel to say "hey, a file arrived" — sorts it — then exits. systemd restarts it immediately for the next file. No polling. No persistent process. Nothing running between events. Screenshots are detected by source folder, not filename — set SCREENSHOTS to wherever your tool saves them. Everything — watched folders, destination, subfolder names, extension rules — is just bash variables at the top of ~/.local/bin/haul. Open it in any editor and change what you want. After editing: haul restart Requirements: Linux with systemd, bash 4+, inotify-tools. Tested on Ubuntu 22.04 / 24.04. If you've been living with a messy Downloads folder, give haul sweep a try first — it sorts whatever's already there without touching the daemon. Templates let you quickly answer FAQs or store snippets for re-use. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse

Code Block

Copy

report.pdf report(1).pdf report(2).pdf screenshot.png screenshot(1).png screenshot(2).png video_final.mp4 video_final_FINAL.mp4 notes.docx notes_copy.docx notes_copy_FINAL(1).docx report.pdf report(1).pdf report(2).pdf screenshot.png screenshot(1).png screenshot(2).png video_final.mp4 video_final_FINAL.mp4 notes.docx notes_copy.docx notes_copy_FINAL(1).docx report.pdf report(1).pdf report(2).pdf screenshot.png screenshot(1).png screenshot(2).png video_final.mp4 video_final_FINAL.mp4 notes.docx notes_copy.docx notes_copy_FINAL(1).docx file lands ↓ kernel fires inotify ↓ haul wakes up ↓ file sorted → ~/Data/subfolder ↓ haul exits ↓ systemd restarts it ↓ (waiting for next file...) file lands ↓ kernel fires inotify ↓ haul wakes up ↓ file sorted → ~/Data/subfolder ↓ haul exits ↓ systemd restarts it ↓ (waiting for next file...) file lands ↓ kernel fires inotify ↓ haul wakes up ↓ file sorted → ~/Data/subfolder ↓ haul exits ↓ systemd restarts it ↓ (waiting for next file...) sudo apt install inotify-tools -y curl -fsSL https://raw.githubusercontent.com/kushal1o1/haul/main/install.sh | bash sudo apt install inotify-tools -y curl -fsSL https://raw.githubusercontent.com/kushal1o1/haul/main/install.sh | bash sudo apt install inotify-tools -y curl -fsSL https://raw.githubusercontent.com/kushal1o1/haul/main/install.sh | bash haul install set up and start haul sweep sort files already sitting in watched folders haul start/stop manage the service haul logs tail the live log haul uninstall remove haul (your ~/Data/ is untouched) haul install set up and start haul sweep sort files already sitting in watched folders haul start/stop manage the service haul logs tail the live log haul uninstall remove haul (your ~/Data/ is untouched) haul install set up and start haul sweep sort files already sitting in watched folders haul start/stop manage the service haul logs tail the live log haul uninstall remove haul (your ~/Data/ is untouched) DATA="$HOME/Files" # change destination DOWNLOADS="$HOME/Desktop" # change watched folder DATA="$HOME/Files" # change destination DOWNLOADS="$HOME/Desktop" # change watched folder DATA="$HOME/Files" # change destination DOWNLOADS="$HOME/Desktop" # change watched folder [2024-01-15 14:30:22] MOVED report.pdf → ~/Data/PDFs/ [2024-01-15 14:31:45] DUPLICATE (identical) skipped: report.pdf [2024-01-15 14:32:10] CONFLICT renamed: notes_20240115_143210.md [2024-01-15 14:30:22] MOVED report.pdf → ~/Data/PDFs/ [2024-01-15 14:31:45] DUPLICATE (identical) skipped: report.pdf [2024-01-15 14:32:10] CONFLICT renamed: notes_20240115_143210.md [2024-01-15 14:30:22] MOVED report.pdf → ~/Data/PDFs/ [2024-01-15 14:31:45] DUPLICATE (identical) skipped: report.pdf [2024-01-15 14:32:10] CONFLICT renamed: notes_20240115_143210.md - Same file arrives again → deleted silently - Same name, different content → renamed with a timestamp before moving