Update the utils & allow importing as ./utils

- Previously imports would have to be done as ./utils/utils.nix
  `import ./utils/utils.nix lib`
- This has now been simplified to just ./utils
  `import ./utils lib`
diff --git a/flake.nix b/flake.nix
index b527b27..701ba47 100644
--- a/flake.nix
+++ b/flake.nix
@@ -20,9 +20,12 @@
     inherit (inputs) self nixpkgs flake-utils;
   in
     flake-utils.lib.eachDefaultSystem (system: let
-      pkgs = nixpkgs.legacyPackages.${system};
+      pkgs = import nixpkgs {
+        inherit system;
+        overlays = import ./overlays nixpkgs.lib;
+      };
 
-      utils = import ./utils/utils.nix nixpkgs.lib;
+      utils = import ./utils nixpkgs.lib;
 
       username = "minion";
     in {
@@ -33,13 +36,15 @@
           modules = [
             (nixpkgs.lib.pipe ./modules [
               utils.nixFilesIn
-              utils.importAll
               (utils.interpretNonstandardModule (args:
                 args
                 // {
-                  home = args.config.home-manager."${username}";
+                  home = args.config.home-manager.users.${username};
                 }))
             ])
+            {
+              minion = import ./config.nix;
+            }
           ];
 
           specialArgs = inputs // {inherit username pkgs;};
diff --git a/utils/utils.nix b/utils/default.nix
similarity index 100%
rename from utils/utils.nix
rename to utils/default.nix
diff --git a/utils/dirsIn.nix b/utils/dirsIn.nix
new file mode 100644
index 0000000..7ef9d6a
--- /dev/null
+++ b/utils/dirsIn.nix
@@ -0,0 +1,2 @@
+# Modified from http://chriswarbo.net/projects/nixos/useful_hacks.html
+lib: dir: map (name: dir + "/${name}") (lib.attrNames (lib.filterAttrs (_: type: type == "directory") (builtins.readDir dir)))
diff --git a/utils/dirsInWithName.nix b/utils/dirsInWithName.nix
new file mode 100644
index 0000000..3da4017
--- /dev/null
+++ b/utils/dirsInWithName.nix
@@ -0,0 +1,6 @@
+# Modified from http://chriswarbo.net/projects/nixos/useful_hacks.html
+lib: dir:
+map (name: {
+  inherit name;
+  path = dir + "/${name}";
+}) (lib.attrNames (lib.filterAttrs (_: type: type == "directory") (builtins.readDir dir)))
diff --git a/utils/interpretNonstandardModule.nix b/utils/interpretNonstandardModule.nix
index 6d8de43..405c615 100644
--- a/utils/interpretNonstandardModule.nix
+++ b/utils/interpretNonstandardModule.nix
@@ -15,29 +15,87 @@
         importedModule
         (transformArgs args)
       else importedModule;
-  in
-    lib.warnIfNot ((lib.pipe resolvedModule [
-        builtins.attrNames
-        (lib.subtractLists ["home" "config" "imports" "options"])
-      ])
-      == [])
-    "Module ${
+    moduleName =
       if builtins.typeOf module == "lambda"
       then "<AnonFunction>"
-      else builtins.toString module
-    } had attribute names ${builtins.toJSON (builtins.attrNames resolvedModule)} but only home, config, imports and options are resolved" {
-      config = lib.recursiveUpdate (resolvedModule.config or {}) {
-        home-manager.users."${args.username}".imports =
-          (resolvedModule.config.home-manager.users."${args.username}".imports or [])
-          ++ [resolvedModule.home or {}];
-      };
-      imports = resolvedModule.imports or [];
-      options = resolvedModule.options or {};
-    };
+      else if builtins.typeOf module == "path"
+      then builtins.toString module
+      else builtins.toJSON module;
+  in
+    lib.warnIfNot
+    ((lib.pipe resolvedModule [
+        builtins.attrNames
+        (lib.subtractLists ["home" "config" "imports" "options" "traces"])
+      ])
+      == [])
+    "Module ${moduleName} had attribute names ${builtins.toJSON (builtins.attrNames resolvedModule)} but only home, config, imports and options are resolved"
+    [
+      {
+        config = lib.recursiveUpdate (resolvedModule.config or {}) {
+          home-manager.users."${args.username}".imports =
+            (resolvedModule.config.home-manager.users."${args.username}".imports or [])
+            ++ [resolvedModule.home or {}];
+        };
+        imports = resolvedModule.imports or [];
+        options = resolvedModule.options or {};
+      }
+    ]
+    ++ (builtins.map (trace: let
+      splitTrace = lib.splitString "." trace;
+      traceHead = builtins.head splitTrace;
+      traceTail = builtins.tail splitTrace;
+      resolvedTrace =
+        (
+          if traceHead == "home"
+          then ["home-manager" "users" args.username]
+          else lib.errorIfNot (traceHead == "config") []
+        )
+        ++ traceTail;
+    in
+      {config, ...}: (builtins.seq (
+        lib.pipe resolvedTrace [
+          (lib.foldl ({
+            value,
+            error,
+          }: key:
+            if builtins.hasAttr key value
+            then {
+              value = value.${key};
+              inherit error;
+            }
+            else {
+              value = {};
+              error = true;
+            }) {
+            value = {};
+            error = false;
+          })
+          (data: lib.warnIf data.error "trace@${moduleName}/${trace} is invalid; the key does not exist" data)
+          ({
+            value,
+            error,
+          }: {
+            value = builtins.toJSON value;
+            inherit error;
+          })
+          ({
+            value,
+            error,
+          }: {
+            value = "trace@${moduleName}/${trace}: ${value}";
+            inherit error;
+          })
+          ({
+            value,
+            error,
+          }:
+            lib.traceIf (!error) value null)
+        ]
+      ) {})) (resolvedModule.traces or []));
 in {
   imports = (
     if builtins.typeOf modules == "list"
-    then builtins.map resolver modules
-    else [(resolver modules)]
+    then builtins.concatLists (builtins.map resolver modules)
+    else resolver modules
   );
 }
diff --git a/utils/nixFilesIn.nix b/utils/nixFilesIn.nix
index b5340bd..e85fa1c 100644
--- a/utils/nixFilesIn.nix
+++ b/utils/nixFilesIn.nix
@@ -1,2 +1,2 @@
 # Modified from http://chriswarbo.net/projects/nixos/useful_hacks.html
-lib: dir: map (name: dir + "/${name}") (lib.attrNames (lib.filterAttrs (name: _: lib.hasSuffix ".nix" name) (builtins.readDir dir)))
+lib: dir: map (name: dir + "/${name}") (lib.attrNames (lib.filterAttrs (name: type: type == "regular" && lib.hasSuffix ".nix" name) (builtins.readDir dir)))
diff --git a/utils/nixFilesInWithName.nix b/utils/nixFilesInWithName.nix
index 41bd157..7c56abc 100644
--- a/utils/nixFilesInWithName.nix
+++ b/utils/nixFilesInWithName.nix
@@ -3,4 +3,4 @@
 map (name: {
   inherit name;
   path = dir + "/${name}";
-}) (lib.attrNames (lib.filterAttrs (name: _: lib.hasSuffix ".nix" name) (builtins.readDir dir)))
+}) (lib.attrNames (lib.filterAttrs (name: type: lib.hasSuffix ".nix" name && type == "regular") (builtins.readDir dir)))