diff --git a/flake.lock b/flake.lock
index bc4a1f4..aa9aa81 100644
--- a/flake.lock
+++ b/flake.lock
@@ -2,15 +2,15 @@
   "nodes": {
     "easy-hosts": {
       "locked": {
-        "lastModified": 1736680851,
-        "narHash": "sha256-KUkO4H0W+1u5piwAzIzCuVhamQ0L3io8vR61NrODtHs=",
-        "owner": "isabelroses",
+        "lastModified": 1739315072,
+        "narHash": "sha256-m0Lzdrj95GbdmKhqlTKkr4vvHy2Ghdi1GxISOKqUeSA=",
+        "owner": "tgirlcloud",
         "repo": "easy-hosts",
-        "rev": "450d2ae463bb8fb55194f33073ebdd83b8b7ddaa",
+        "rev": "e96af44cae1f48a1a94f2471faee92caf22aa45f",
         "type": "github"
       },
       "original": {
-        "owner": "isabelroses",
+        "owner": "tgirlcloud",
         "repo": "easy-hosts",
         "type": "github"
       }
@@ -22,11 +22,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1736143030,
-        "narHash": "sha256-+hu54pAoLDEZT9pjHlqL9DNzWz0NbUn8NEAHP7PQPzU=",
+        "lastModified": 1741352980,
+        "narHash": "sha256-+u2UunDA4Cl5Fci3m7S643HzKmIDAe+fiXrLqYsR2fs=",
         "owner": "hercules-ci",
         "repo": "flake-parts",
-        "rev": "b905f6fc23a9051a6e1b741e1438dbfc0634c6de",
+        "rev": "f4330d22f1c5d2ba72d3d22df5597d123fdb60a9",
         "type": "github"
       },
       "original": {
@@ -42,11 +42,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1736785676,
-        "narHash": "sha256-TY0jUwR3EW0fnS0X5wXMAVy6h4Z7Y6a3m+Yq++C9AyE=",
+        "lastModified": 1742305478,
+        "narHash": "sha256-iYCinzZnnUeCkZ031qGRwPdwRsqW6o9Y0MgGpA7Zva4=",
         "owner": "nix-community",
         "repo": "home-manager",
-        "rev": "fc52a210b60f2f52c74eac41a8647c1573d2071d",
+        "rev": "fb74bb76d94a6c55632376c931fc108131260ee9",
         "type": "github"
       },
       "original": {
@@ -57,11 +57,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1736701207,
-        "narHash": "sha256-jG/+MvjVY7SlTakzZ2fJ5dC3V1PrKKrUEOEE30jrOKA=",
+        "lastModified": 1742069588,
+        "narHash": "sha256-C7jVfohcGzdZRF6DO+ybyG/sqpo1h6bZi9T56sxLy+k=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "ed4a395ea001367c1f13d34b1e01aa10290f67d6",
+        "rev": "c80f6a7e10b39afcc1894e02ef785b1ad0b0d7e5",
         "type": "github"
       },
       "original": {
diff --git a/flake.nix b/flake.nix
index fb99f26..27d4c2e 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,9 +1,23 @@
 {
   description = "Jo's dotfiles";
 
+  nixConfig = {
+    experimental-features = [
+      "flakes"
+      "nix-command"
+    ];
+    extra-substituters = [
+      "https://nix-community.cachix.org"
+    ];
+    extra-trusted-public-keys = [
+      "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
+      "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
+    ];
+  };
+
   inputs = {
     nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
-    easy-hosts.url = "github:isabelroses/easy-hosts";
+    easy-hosts.url = "github:tgirlcloud/easy-hosts";
 
     flake-parts = {
       url = "github:hercules-ci/flake-parts";
@@ -16,15 +30,15 @@
     };
   };
 
-  outputs = { flake-parts, ... }@inputs:
-    flake-parts.lib.mkFlake { inherit inputs; } {
+  outputs = {flake-parts, ...} @ inputs:
+    flake-parts.lib.mkFlake {inherit inputs;} {
       debug = true;
 
       imports = [
         ./modules/flake
       ];
 
-      systems = [ "x86_64-linux" ];
+      systems = ["x86_64-linux"];
       flake = {
         # Exposing the flake namespace
         namespace = "puzzlevision";
diff --git a/lib/module/default.nix b/lib/module/default.nix
index bfca343..d3efe74 100644
--- a/lib/module/default.nix
+++ b/lib/module/default.nix
@@ -1,16 +1,13 @@
-{
-  lib,
-  ...
-}:
-{
+{lib, ...}: {
   # Create a NixOS module option on a single line.
-  mkOpt =
-    type: default: description:
-    lib.mkOption { inherit type default description; };
+  mkOpt = type: default: description:
+    lib.mkOption {inherit type default description;};
 
-  mkBool =
-    default: description:
-      lib.mkOption { inherit default description; type = lib.types.bool; };
+  mkBool = default: description:
+    lib.mkOption {
+      inherit default description;
+      type = lib.types.bool;
+    };
 
   # Todo: add mkIfElse function
 }
diff --git a/modules/flake/arguments.nix b/modules/flake/arguments.nix
index 9620136..048ef80 100644
--- a/modules/flake/arguments.nix
+++ b/modules/flake/arguments.nix
@@ -1,8 +1,4 @@
-{
-  config,
-  ...
-}:
-{
+{config, ...}: {
   # Apply some useful module arguments.
   _module.args = {
     namespace = config.flake.namespace;
diff --git a/modules/flake/default.nix b/modules/flake/default.nix
index abdf495..bf5047b 100644
--- a/modules/flake/default.nix
+++ b/modules/flake/default.nix
@@ -11,5 +11,8 @@
 
     # Automagically imports systems from "/systems/arch-classname/system-name".
     ./systems.nix
+
+    # Automagically imports homes from "/homes/user-name".
+    ./homes.nix
   ];
 }
diff --git a/modules/flake/homes.nix b/modules/flake/homes.nix
new file mode 100644
index 0000000..20cfc34
--- /dev/null
+++ b/modules/flake/homes.nix
@@ -0,0 +1,22 @@
+{
+  lib,
+  inputs,
+  puzzlelib,
+  ...
+}: let
+  HomeConfiguration = args: let
+    nixpkgs = inputs.nixpkgs;
+  in
+    inputs.home-manager.lib.homeManagerConfiguration {
+      modules = (puzzlelib.dirToModuleList ../home) ++ args.modules;
+      extraSpecialArgs =
+        {
+          inherit (args) nixpkgs;
+        }
+        // args.extraSpecialArgs;
+    };
+in {
+  perSystem = {
+    # TODO Dynamically export homeConfigurations by consuming contents of /homes/user-name
+  };
+}
diff --git a/modules/flake/lib.nix b/modules/flake/lib.nix
index d53094c..d034d57 100644
--- a/modules/flake/lib.nix
+++ b/modules/flake/lib.nix
@@ -2,53 +2,49 @@
   lib,
   puzzlelib,
   ...
-}:
-let
+}: let
   # Utility function to read a directory and return its contents.
   readDirectory = directory: builtins.readDir directory;
 
   # Utility function to handle each filesystem entity (file or directory).
   filesystemEntityToAttrSet = directory: importArgs: name: type:
-    if type == "directory" then
-      dirToAttrSet "${directory}/${name}" importArgs
-    else if name == "default.nix" then
-      import "${directory}/${name}" importArgs
-    else
-      {};
+    if type == "directory"
+    then dirToAttrSet "${directory}/${name}" importArgs
+    else if name == "default.nix"
+    then import "${directory}/${name}" importArgs
+    else {};
 
   filesystemEntityToList = directory: name: type:
-    if type == "directory" then
-      dirToModuleList "${directory}/${name}"
-    else if name == "default.nix" then
-      [ "${directory}/${name}" ]
-    else
-      [];
+    if type == "directory"
+    then dirToModuleList "${directory}/${name}"
+    else if name == "default.nix"
+    then ["${directory}/${name}"]
+    else [];
 
-  dirToModuleList = directory:
-    let
-      readDir = readDirectory directory;
-    in
-      builtins.foldl' (acc: name:
+  dirToModuleList = directory: let
+    readDir = readDirectory directory;
+  in
+    builtins.foldl' (
+      acc: name:
         acc ++ (filesystemEntityToList directory name (builtins.getAttr name readDir))
-      ) [] (builtins.attrNames readDir);
+    ) [] (builtins.attrNames readDir);
 
   # Utility function to recursively load modules from a directory.
-  dirToAttrSet = directory: importArgs:
-    let
-      # Read provided directory only once at the very start and save the result.
-      readDir = readDirectory directory;
-    in
-      # Iterate over the attr names of a readDir operation.
-      builtins.foldl' (acc: name:
-        # Merge outputs of handling a filesystem entity (file or directory) into accumulator.
-        # Files return attribute sets with their resulting expressions, directories return the result of multiple file handling operations.
+  dirToAttrSet = directory: importArgs: let
+    # Read provided directory only once at the very start and save the result.
+    readDir = readDirectory directory;
+  in
+    # Iterate over the attr names of a readDir operation.
+    builtins.foldl' (
+      acc: name:
+      # Merge outputs of handling a filesystem entity (file or directory) into accumulator.
+      # Files return attribute sets with their resulting expressions, directories return the result of multiple file handling operations.
         acc // (filesystemEntityToAttrSet directory importArgs name (builtins.getAttr name readDir))
-      ) {} (builtins.attrNames readDir);
-in
-{
+    ) {} (builtins.attrNames readDir);
+in {
   # Add lib.${namespace} attribute to module arguments, for easy access.
   # Additionally, pass on dirToAttrSet method on lib.${namespace} for reusability in other modules.
   _module.args = {
-    puzzlelib = dirToAttrSet ../../lib { inherit lib puzzlelib; } // { inherit dirToAttrSet dirToModuleList filesystemEntityToList filesystemEntityToAttrSet; };
+    puzzlelib = dirToAttrSet ../../lib {inherit lib puzzlelib;} // {inherit dirToAttrSet dirToModuleList filesystemEntityToList filesystemEntityToAttrSet;};
   };
 }
diff --git a/modules/flake/systems.nix b/modules/flake/systems.nix
index 1ff744d..208a4b1 100644
--- a/modules/flake/systems.nix
+++ b/modules/flake/systems.nix
@@ -4,9 +4,8 @@
   namespace,
   puzzlelib,
   ...
-}:
-{
-  imports = [ inputs.easy-hosts.flakeModule ];
+}: {
+  imports = [inputs.easy-hosts.flakeModule];
 
   easyHosts = {
     autoConstruct = true;
@@ -19,11 +18,11 @@
     };
 
     perClass = class: {
-      modules = [
+      modules =
         (lib.optionals (class == "nixos") [
           inputs.home-manager.nixosModules.default
         ])
-      ] ++ (puzzlelib.dirToModuleList ../${class}); # Import modules based on current classname.
+        ++ (puzzlelib.dirToModuleList ../${class}); # Import modules based on current classname.
     };
   };
 }
diff --git a/modules/home/desktop/gnome.nix b/modules/home/desktop/gnome.nix
new file mode 100644
index 0000000..ca6176e
--- /dev/null
+++ b/modules/home/desktop/gnome.nix
@@ -0,0 +1,2 @@
+{}: {
+}
diff --git a/modules/nixos/desktop/gnome/default.nix b/modules/nixos/desktop/gnome/default.nix
index cf148ea..a9e88f0 100644
--- a/modules/nixos/desktop/gnome/default.nix
+++ b/modules/nixos/desktop/gnome/default.nix
@@ -3,13 +3,11 @@
   config,
   namespace,
   ...
-}:
-let
+}: let
   inherit (lib) mkEnableOption mkIf;
   cfg = config.${namespace}.desktop.gnome;
-in
-{
-  options.${namespace}.desktop.gnome = { enable = mkEnableOption "Enable the gnome desktop environment ${namespace}"; };
+in {
+  options.${namespace}.desktop.gnome = {enable = mkEnableOption "Enable the gnome desktop environment ${namespace}";};
 
   config = mkIf cfg.enable {
     services.xserver.enable = true;
diff --git a/modules/nixos/utils/vm/default.nix b/modules/nixos/utils/vm/default.nix
index bd88605..f0e88fa 100644
--- a/modules/nixos/utils/vm/default.nix
+++ b/modules/nixos/utils/vm/default.nix
@@ -4,14 +4,12 @@
   namespace,
   puzzlelib,
   ...
-}:
-let
+}: let
   inherit (lib) mkIf mkMerge;
   inherit (puzzlelib) mkOpt mkBool;
 
   cfg = config.${namespace}.utils.vm;
-in
-{
+in {
   options.${namespace}.utils.vm = {
     enable = mkBool true "Whether to enable custom vm presets";
     preset = mkOpt lib.types.str "performance" "Specify the prefered vm settings preset: performance, balance or powersave";
@@ -19,25 +17,28 @@ in
 
   config = mkIf cfg.enable {
     virtualisation.vmVariant = mkMerge [
-      (mkIf cfg.preset == "performance" {
-        virtualisation = {
-          cores = 6;
-          memorySize = 4096;
-          graphics = true;
-        };
-      })
-      (mkIf cfg.preset == "balance" {
-        virtualisation = {
-          cores = 4;
-          memorySize = 2048;
-        };
-      })
-      (mkIf cfg.preset == "powersave" {
-        virtualisation = {
-          cores = 2;
-          memorySize = 1024;
-        };
-      })
+      (mkIf cfg.preset
+        == "performance" {
+          virtualisation = {
+            cores = 6;
+            memorySize = 4096;
+            graphics = true;
+          };
+        })
+      (mkIf cfg.preset
+        == "balance" {
+          virtualisation = {
+            cores = 4;
+            memorySize = 2048;
+          };
+        })
+      (mkIf cfg.preset
+        == "powersave" {
+          virtualisation = {
+            cores = 2;
+            memorySize = 1024;
+          };
+        })
     ];
   };
 }
diff --git a/systems/x86_64-nixos/puzzlevision/default.nix b/systems/x86_64-nixos/puzzlevision/default.nix
index f39eed4..00e7d3e 100644
--- a/systems/x86_64-nixos/puzzlevision/default.nix
+++ b/systems/x86_64-nixos/puzzlevision/default.nix
@@ -1,8 +1,4 @@
-{
-  pkgs,
-  ...
-}:
-{
+{pkgs, ...}: {
   imports = [
     ./hardware.nix
   ];
@@ -14,7 +10,6 @@
   # System configuration
   puzzlevision = {
     # Todo: pass a set of users to enable from within easy-hosts and automatically map the corresponding home-manager configurations
-    # mainUser = "jo";
     # users = [ "jo" ];
 
     desktop.gnome.enable = true;
@@ -22,6 +17,8 @@
 
   environment.systemPackages = with pkgs; [
     ghostty
+    firefox
+    vscodium
   ];
 
   system.stateVersion = "25.05";