It looks pretty good! I left a couple comments. Yeah nix profile is one way to do it, but there are many. The cool part about flakes is you can make your outputs and people can make use of your flake in a number of ways.
They can include an overlay to their package set that includes your package. So then in home.packages you can just add pkgs.elgato. You can provide an overlay too that adds your package to make this process simpler.
Or they could pass your flake to their configuration’s module arguments, so in any module they can reference it like { config, elgato, ... }:. And the package can be added that way. I usually use this method for importing modules. Adding packages is much easier with overlays.
Could you maybe point me to an example of each of these methods (use a flake as input for an overlay; provide an overlay from a flake; pass a flake to a configuration module)? This is always where I run out of rope with Nix–there are so many ways to do everything, and without good examples I always end up feeling lost.
This is a really simple - untested- example of how someone could include your overlay. Optimally you would make use of tools like flake-utils(-plus) or devos to make this much easier. They have ways to easily add overlays to all your hosts from external flakes.
To do the other method - its really impractical for packges its more useful for modules - you could make use of the nixosSystem specialArgs argument: nixosSystem { specialArgs = { inherit elgato; }; ... }
Then modules could access elgato like this this { config, elgato, ... }:, following module system/nixos semantics.
In office hours with @tomberek, I also learned about the builtins.getFlake function, which lets you (among other things) pull a flake into anywhere a derivation is expected. That provided the main bridge between my current NixOS/home-manager setup and the concept/execution of flakes.