{
  config,
  lib,
  inputs,
  nixosConfigurations,
  ...
}:
let
  zonesToList = lib.mapAttrsToList (name: value: { ${name} = value; });
  zonesFromConfig = lib.mkMerge (
    lib.fold (elem: acc: acc ++ (zonesToList elem.config.machine.meta.zones)) [ ] (
      lib.attrValues nixosConfigurations
    )
  );
  dnsLib = (import inputs.dns).lib;
  evalZones =
    zones:
    (lib.evalModules {
      modules = [
        {
          options = {
            zones = lib.mkOption {
              type = lib.types.attrsOf dnsLib.types.zone;
              description = "DNS zones";
            };
          };
          config = {
            inherit zones;
          };
        }
      ];
    }).config.zones;

in

{
  services.nsd = {
    enable = true;
    interfaces = [
      config.machine.meta.ips.public.ipv4
      config.machine.meta.ips.public.ipv6
    ];
    zones = lib.mapAttrs (_: value: {
      data = builtins.toString value;
      provideXFR = [ "192.168.0.0/21 NOKEY" ];
    }) (evalZones zonesFromConfig);
  };
}