The script already adds rsync to the path, no need to use the more complex approach within the string.
Provide proper runtimeInputs instead of using nix variables all the time.
No need for overlays. Instead create own packages and call them via callPackage. That will keep them simpler and allows dependency injection. I can follow existing patterns from nixpkgs, etc.