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.