diff --git a/flake.lock b/flake.lock
index dffbce7..9208c02 100644
--- a/flake.lock
+++ b/flake.lock
@@ -515,6 +515,27 @@
         "type": "github"
       }
     },
+    "devshell": {
+      "inputs": {
+        "nixpkgs": [
+          "nix-topology",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1728330715,
+        "narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=",
+        "owner": "numtide",
+        "repo": "devshell",
+        "rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "devshell",
+        "type": "github"
+      }
+    },
     "eww": {
       "inputs": {
         "flake-compat": "flake-compat_7",
@@ -649,20 +670,6 @@
       }
     },
     "flake-compat_12": {
-      "locked": {
-        "lastModified": 1733328505,
-        "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
-        "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
-        "revCount": 69,
-        "type": "tarball",
-        "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz"
-      },
-      "original": {
-        "type": "tarball",
-        "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
-      }
-    },
-    "flake-compat_13": {
       "flake": false,
       "locked": {
         "lastModified": 1696426674,
@@ -678,7 +685,37 @@
         "type": "github"
       }
     },
+    "flake-compat_13": {
+      "locked": {
+        "lastModified": 1733328505,
+        "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
+        "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
+        "revCount": 69,
+        "type": "tarball",
+        "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz"
+      },
+      "original": {
+        "type": "tarball",
+        "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
+      }
+    },
     "flake-compat_14": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1696426674,
+        "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-compat_15": {
       "flake": false,
       "locked": {
         "lastModified": 1733328505,
@@ -1119,11 +1156,11 @@
         "systems": "systems_22"
       },
       "locked": {
-        "lastModified": 1731533236,
-        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+        "lastModified": 1726560853,
+        "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
         "owner": "numtide",
         "repo": "flake-utils",
-        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+        "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
         "type": "github"
       },
       "original": {
@@ -1168,6 +1205,24 @@
         "type": "github"
       }
     },
+    "flake-utils_9": {
+      "inputs": {
+        "systems": "systems_25"
+      },
+      "locked": {
+        "lastModified": 1731533236,
+        "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
     "flocon": {
       "inputs": {
         "agenix": "agenix",
@@ -1322,6 +1377,28 @@
       }
     },
     "gitignore_5": {
+      "inputs": {
+        "nixpkgs": [
+          "nix-topology",
+          "pre-commit-hooks",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1709087332,
+        "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
+        "owner": "hercules-ci",
+        "repo": "gitignore.nix",
+        "rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "gitignore.nix",
+        "type": "github"
+      }
+    },
+    "gitignore_6": {
       "inputs": {
         "nixpkgs": [
           "pre-commit-hooks",
@@ -3119,6 +3196,29 @@
         "type": "github"
       }
     },
+    "nix-topology": {
+      "inputs": {
+        "devshell": "devshell",
+        "flake-utils": "flake-utils_6",
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "pre-commit-hooks": "pre-commit-hooks_4"
+      },
+      "locked": {
+        "lastModified": 1738246091,
+        "narHash": "sha256-2+KkZsRO+XlOFbXbRgMZbRtlqn5MBNYj4HNmZ/2Tojg=",
+        "owner": "oddlama",
+        "repo": "nix-topology",
+        "rev": "5526269fa3eedf4f4bc00c0bf7a03db31d24b029",
+        "type": "github"
+      },
+      "original": {
+        "owner": "oddlama",
+        "repo": "nix-topology",
+        "type": "github"
+      }
+    },
     "nixos-hardware": {
       "locked": {
         "lastModified": 1738816619,
@@ -3276,8 +3376,8 @@
     },
     "nixpkgs-xr": {
       "inputs": {
-        "flake-compat": "flake-compat_12",
-        "flake-utils": "flake-utils_6",
+        "flake-compat": "flake-compat_13",
+        "flake-utils": "flake-utils_7",
         "nixpkgs": "nixpkgs_19",
         "treefmt-nix": "treefmt-nix_2"
       },
@@ -6604,8 +6704,35 @@
     },
     "pre-commit-hooks_4": {
       "inputs": {
-        "flake-compat": "flake-compat_13",
+        "flake-compat": "flake-compat_12",
         "gitignore": "gitignore_5",
+        "nixpkgs": [
+          "nix-topology",
+          "nixpkgs"
+        ],
+        "nixpkgs-stable": [
+          "nix-topology",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1730797577,
+        "narHash": "sha256-SrID5yVpyUfknUTGWgYkTyvdr9J1LxUym4om3SVGPkg=",
+        "owner": "cachix",
+        "repo": "pre-commit-hooks.nix",
+        "rev": "1864030ed24a2b8b4e4d386a5eeaf0c5369e50a9",
+        "type": "github"
+      },
+      "original": {
+        "owner": "cachix",
+        "repo": "pre-commit-hooks.nix",
+        "type": "github"
+      }
+    },
+    "pre-commit-hooks_5": {
+      "inputs": {
+        "flake-compat": "flake-compat_14",
+        "gitignore": "gitignore_6",
         "nixpkgs": "nixpkgs_21"
       },
       "locked": {
@@ -6624,7 +6751,7 @@
     },
     "prismlauncher": {
       "inputs": {
-        "flake-compat": "flake-compat_14",
+        "flake-compat": "flake-compat_15",
         "libnbtplusplus": "libnbtplusplus",
         "nix-filter": "nix-filter_2",
         "nixpkgs": "nixpkgs_22"
@@ -6706,11 +6833,12 @@
         "hyprwayland-scanner": "hyprwayland-scanner_11",
         "manga-tui": "manga-tui",
         "nix-gaming": "nix-gaming_2",
+        "nix-topology": "nix-topology",
         "nixos-hardware": "nixos-hardware_2",
         "nixpkgs": "nixpkgs_18",
         "nixpkgs-xr": "nixpkgs-xr",
         "nur": "nur",
-        "pre-commit-hooks": "pre-commit-hooks_4",
+        "pre-commit-hooks": "pre-commit-hooks_5",
         "prismlauncher": "prismlauncher",
         "scls": "scls",
         "sops-nix": "sops-nix",
@@ -6878,7 +7006,7 @@
     },
     "scls": {
       "inputs": {
-        "flake-utils": "flake-utils_7",
+        "flake-utils": "flake-utils_8",
         "naersk": "naersk",
         "nixpkgs": [
           "nixpkgs"
@@ -7173,6 +7301,21 @@
         "type": "github"
       }
     },
+    "systems_25": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    },
     "systems_3": {
       "locked": {
         "lastModified": 1689347949,
@@ -7483,7 +7626,7 @@
     },
     "yazi": {
       "inputs": {
-        "flake-utils": "flake-utils_8",
+        "flake-utils": "flake-utils_9",
         "nixpkgs": "nixpkgs_23",
         "rust-overlay": "rust-overlay_5"
       },
diff --git a/flake.nix b/flake.nix
index ec22d8f..610ec75 100755
--- a/flake.nix
+++ b/flake.nix
@@ -4,9 +4,9 @@
   outputs = inputs:
     inputs.flake-parts.lib.mkFlake {inherit inputs;} {
       imports = [
-        inputs.pre-commit-hooks.flakeModule
         ./hosts
         ./overlays
+        ./modules
         ./hosts/deploy.nix
         ./home/profiles
       ];
@@ -16,28 +16,6 @@
         pkgs,
         ...
       }: {
-        pre-commit = {
-          check.enable = true;
-          settings = {
-            excludes = ["flake.lock"];
-            hooks = {
-              stylua.enable = true;
-              statix.enable = true;
-              alejandra.enable = true;
-              deadnix = {
-                enable = true;
-                excludes = ["technorino.nix"];
-              };
-              prettier = {
-                enable = true;
-                files = "\\.(js|ts|md|json)$";
-                settings = {
-                  trailing-comma = "none";
-                };
-              };
-            };
-          };
-        };
         devShells.default = pkgs.mkShell {
           name = "snowflake";
           shellHook = config.pre-commit.installationScript;
@@ -137,5 +115,9 @@
       url = "github:youwen5/zen-browser-flake";
       inputs.nixpkgs.follows = "nixpkgs";
     };
+    nix-topology = {
+      url = "github:oddlama/nix-topology";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
   };
 }
diff --git a/home/programs/terminal/nushell/config.nu b/home/programs/terminal/nushell/config.nu
index 051726f..19cd8e0 100755
--- a/home/programs/terminal/nushell/config.nu
+++ b/home/programs/terminal/nushell/config.nu
@@ -39,6 +39,7 @@ alias tail = tspin
 alias spotify = spotify_player
 alias atac =  atac --directory ~/.config/atac/
 alias zed = zeditor .
+alias generate-topology = nix build ".#topology.x86_64-linux.config.output"
 nitch
 
 $env.config = {
@@ -221,7 +222,7 @@ $env.config = {
             | where command =~ $buffer
             | each { |it| {value: $it.command description: $it.usage} }
         }
-      } 
+      }
   ]
   keybindings: [
     {
@@ -325,7 +326,7 @@ $env.config = {
       event: { send: menu name: commands_with_description }
     }
 
-     
+
   ]
 
 }
diff --git a/hosts/ame/default.nix b/hosts/ame/default.nix
index 71b9842..260d225 100644
--- a/hosts/ame/default.nix
+++ b/hosts/ame/default.nix
@@ -3,9 +3,9 @@ _: {
     ./hardware.nix
     ./services
     ./networking.nix
-    ../common.nix
-    ../../modules
-    ../../modules/fonts.nix
+    ./topology.nix
+    ../common
+    ../common/fonts.nix
   ];
 
   programs.hyprland.enable = true;
diff --git a/hosts/ame/topology.nix b/hosts/ame/topology.nix
new file mode 100644
index 0000000..4c1a206
--- /dev/null
+++ b/hosts/ame/topology.nix
@@ -0,0 +1,20 @@
+_: {
+  topology = {
+    self = {
+      name = "ame";
+      hardware.info = "Thinkpad T480";
+      interfaces = {
+        tailscale0 = {
+          addresses = ["100.108.207.106/32"];
+          network = "tailscale0";
+          type = "wireguard";
+        };
+        home = {
+          network = "home";
+          addresses = [""];
+          type = "wifi";
+        };
+      };
+    };
+  };
+}
diff --git a/hosts/arashi/default.nix b/hosts/arashi/default.nix
index 053a564..8afd6f4 100644
--- a/hosts/arashi/default.nix
+++ b/hosts/arashi/default.nix
@@ -3,8 +3,8 @@
     ./hardware.nix
     ./services
     ./networking.nix
-    ../common.nix
-    ../../modules
+    ./topology.nix
+    ../common
   ];
 
   users = {
diff --git a/hosts/arashi/topology.nix b/hosts/arashi/topology.nix
new file mode 100644
index 0000000..f8bf0fa
--- /dev/null
+++ b/hosts/arashi/topology.nix
@@ -0,0 +1,20 @@
+_: {
+  topology = {
+    self = {
+      name = "arashi";
+      hardware.info = "Proxmox VM";
+      interfaces = {
+        tailscale0 = {
+          addresses = ["100.94.214.100/32"];
+          network = "tailscale0";
+          type = "wireguard";
+        };
+        home = {
+          addresses = ["192.168.1.211/24"];
+          network = "home";
+          type = "ethernet";
+        };
+      };
+    };
+  };
+}
diff --git a/hosts/common.nix b/hosts/common.nix
deleted file mode 100644
index 919e406..0000000
--- a/hosts/common.nix
+++ /dev/null
@@ -1,8 +0,0 @@
-{inputs, ...}: {
-  imports = [
-    inputs.sops-nix.nixosModules.sops
-    inputs.home-manager.nixosModules.home-manager
-    inputs.nur.modules.nixos.default
-    # inputs.attic.nixosModules.atticd
-  ];
-}
diff --git a/modules/README.md b/hosts/common/README.md
similarity index 100%
rename from modules/README.md
rename to hosts/common/README.md
diff --git a/hosts/common/default.nix b/hosts/common/default.nix
new file mode 100644
index 0000000..cd5b6e0
--- /dev/null
+++ b/hosts/common/default.nix
@@ -0,0 +1,17 @@
+{inputs, ...}: {
+  imports = [
+    inputs.sops-nix.nixosModules.sops
+    inputs.home-manager.nixosModules.home-manager
+    inputs.nur.modules.nixos.default
+    inputs.nix-topology.nixosModules.default
+    ./prometheus.nix
+    ./security.nix
+    ./users.nix
+    ./nix.nix
+    ./system.nix
+    ./openssh.nix
+    ./virtualisation.nix
+    ./sops.nix
+    ./time.nix
+  ];
+}
diff --git a/modules/fonts.nix b/hosts/common/fonts.nix
similarity index 100%
rename from modules/fonts.nix
rename to hosts/common/fonts.nix
diff --git a/modules/nix.nix b/hosts/common/nix.nix
similarity index 100%
rename from modules/nix.nix
rename to hosts/common/nix.nix
diff --git a/modules/openssh.nix b/hosts/common/openssh.nix
similarity index 100%
rename from modules/openssh.nix
rename to hosts/common/openssh.nix
diff --git a/modules/prometheus.nix b/hosts/common/prometheus.nix
similarity index 100%
rename from modules/prometheus.nix
rename to hosts/common/prometheus.nix
diff --git a/modules/security.nix b/hosts/common/security.nix
similarity index 100%
rename from modules/security.nix
rename to hosts/common/security.nix
diff --git a/modules/sops.nix b/hosts/common/sops.nix
similarity index 62%
rename from modules/sops.nix
rename to hosts/common/sops.nix
index e79cf14..5db3874 100644
--- a/modules/sops.nix
+++ b/hosts/common/sops.nix
@@ -1,6 +1,6 @@
 _: {
   sops = {
-    defaultSopsFile = ../secrets/secrets.yaml;
+    defaultSopsFile = ../../secrets/secrets.yaml;
     age.keyFile = "/home/notoh/.config/sops/age/keys.txt";
   };
 }
diff --git a/modules/system.nix b/hosts/common/system.nix
similarity index 100%
rename from modules/system.nix
rename to hosts/common/system.nix
diff --git a/modules/time.nix b/hosts/common/time.nix
similarity index 100%
rename from modules/time.nix
rename to hosts/common/time.nix
diff --git a/modules/users.nix b/hosts/common/users.nix
similarity index 100%
rename from modules/users.nix
rename to hosts/common/users.nix
diff --git a/modules/virtualisation.nix b/hosts/common/virtualisation.nix
similarity index 100%
rename from modules/virtualisation.nix
rename to hosts/common/virtualisation.nix
diff --git a/hosts/haru/default.nix b/hosts/haru/default.nix
index 945b49b..e278a60 100644
--- a/hosts/haru/default.nix
+++ b/hosts/haru/default.nix
@@ -3,8 +3,8 @@
     ./hardware.nix
     ./services
     ./networking.nix
-    ../common.nix
-    ../../modules
+    ./topology.nix
+    ../common
   ];
 
   users = {
diff --git a/hosts/haru/topology.nix b/hosts/haru/topology.nix
new file mode 100644
index 0000000..b50cd91
--- /dev/null
+++ b/hosts/haru/topology.nix
@@ -0,0 +1,20 @@
+_: {
+  topology = {
+    self = {
+      name = "haru";
+      hardware.info = "Proxmox VM";
+      interfaces = {
+        tailscale0 = {
+          addresses = ["100.73.192.45/32"];
+          network = "tailscale0";
+          type = "wireguard";
+        };
+        home = {
+          addresses = ["192.168.1.103/24"];
+          network = "home";
+          type = "ethernet";
+        };
+      };
+    };
+  };
+}
diff --git a/hosts/kariru/default.nix b/hosts/kariru/default.nix
index 53b937f..0ee01a2 100644
--- a/hosts/kariru/default.nix
+++ b/hosts/kariru/default.nix
@@ -3,8 +3,8 @@
     ./hardware.nix
     ./services
     ./networking.nix
-    ../common.nix
-    ../../modules
+    ./topology.nix
+    ../common
   ];
 
   users = {
diff --git a/hosts/kariru/topology.nix b/hosts/kariru/topology.nix
new file mode 100644
index 0000000..a2777f1
--- /dev/null
+++ b/hosts/kariru/topology.nix
@@ -0,0 +1,20 @@
+_: {
+  topology = {
+    self = {
+      name = "kariru";
+      hardware.info = "Proxmox VM";
+      interfaces = {
+        tailscale0 = {
+          addresses = ["100.126.229.95/32"];
+          network = "tailscale0";
+          type = "wireguard";
+        };
+        home = {
+          addresses = ["192.168.1.54/24"];
+          network = "home";
+          type = "ethernet";
+        };
+      };
+    };
+  };
+}
diff --git a/hosts/kaze/default.nix b/hosts/kaze/default.nix
index 86d9731..4fc9ba5 100644
--- a/hosts/kaze/default.nix
+++ b/hosts/kaze/default.nix
@@ -3,8 +3,8 @@
     ./hardware.nix
     ./services
     ./networking.nix
-    ../common.nix
-    ../../modules
+    ./topology.nix
+    ../common
   ];
 
   users = {
diff --git a/hosts/kaze/topology.nix b/hosts/kaze/topology.nix
new file mode 100644
index 0000000..0076a59
--- /dev/null
+++ b/hosts/kaze/topology.nix
@@ -0,0 +1,20 @@
+_: {
+  topology = {
+    self = {
+      name = "kaze";
+      hardware.info = "BuyVM VPS";
+      interfaces = {
+        tailscale0 = {
+          addresses = ["100.69.79.81/32"];
+          network = "tailscale0";
+          type = "wireguard";
+        };
+        eth0 = {
+          network = "hetzner";
+          addresses = ["198.98.48.71 "];
+          type = "ethernet";
+        };
+      };
+    };
+  };
+}
diff --git a/hosts/sakura/default.nix b/hosts/sakura/default.nix
index 4355e29..80b5d03 100644
--- a/hosts/sakura/default.nix
+++ b/hosts/sakura/default.nix
@@ -3,8 +3,8 @@ _: {
     ./hardware.nix
     ./services
     ./networking.nix
-    ../common.nix
-    ../../modules
+    ./topology.nix
+    ../common
   ];
 
   users = {
diff --git a/hosts/sakura/topology.nix b/hosts/sakura/topology.nix
new file mode 100644
index 0000000..417b2ee
--- /dev/null
+++ b/hosts/sakura/topology.nix
@@ -0,0 +1,20 @@
+_: {
+  topology = {
+    self = {
+      name = "sakura";
+      hardware.info = "Proxmox VM";
+      interfaces = {
+        tailscale0 = {
+          addresses = ["100.121.201.47/32"];
+          network = "tailscale0";
+          type = "wireguard";
+        };
+        home = {
+          addresses = ["192.168.1.25/24"];
+          network = "home";
+          type = "ethernet";
+        };
+      };
+    };
+  };
+}
diff --git a/hosts/sora/default.nix b/hosts/sora/default.nix
index 6b808e7..6d7d729 100644
--- a/hosts/sora/default.nix
+++ b/hosts/sora/default.nix
@@ -3,8 +3,8 @@ _: {
     ./hardware.nix
     ./networking.nix
     ./services
-    ../common.nix
-    ../../modules
+    ./topology.nix
+    ../common
   ];
 
   services.snowflake-proxy.enable = true;
diff --git a/hosts/sora/topology.nix b/hosts/sora/topology.nix
new file mode 100644
index 0000000..908ba10
--- /dev/null
+++ b/hosts/sora/topology.nix
@@ -0,0 +1,19 @@
+_: {
+  topology = {
+    self = {
+      name = "sora";
+      hardware.info = "Hetzner VPS";
+      interfaces = {
+        tailscale0 = {
+          addresses = ["100.104.42.96/32"];
+          network = "tailscale0";
+          type = "wireguard";
+        };
+        eth0 = {
+          network = "hetzner";
+          type = "ethernet";
+        };
+      };
+    };
+  };
+}
diff --git a/hosts/tsuki/default.nix b/hosts/tsuki/default.nix
index 0459266..b69bdcb 100755
--- a/hosts/tsuki/default.nix
+++ b/hosts/tsuki/default.nix
@@ -10,10 +10,10 @@
     ./services
     ./networking.nix
     ./gaming.nix
-    ../common.nix
+    ./topology.nix
+    ../common
+    ../common/fonts.nix
     ../../home/wayland
-    ../../modules
-    ../../modules/fonts.nix
   ];
 
   virtualisation = {
diff --git a/hosts/tsuki/gaming.nix b/hosts/tsuki/gaming.nix
index f5e2c07..27fbede 100644
--- a/hosts/tsuki/gaming.nix
+++ b/hosts/tsuki/gaming.nix
@@ -22,7 +22,7 @@
       };
     };
     monado = {
-      enable = true;
+      enable = false;
       highPriority = true;
     };
     sunshine = {
diff --git a/hosts/tsuki/topology.nix b/hosts/tsuki/topology.nix
new file mode 100644
index 0000000..4b31cc4
--- /dev/null
+++ b/hosts/tsuki/topology.nix
@@ -0,0 +1,20 @@
+_: {
+  topology = {
+    self = {
+      name = "tsuki";
+      hardware.info = "Desktop";
+      interfaces = {
+        tailscale0 = {
+          addresses = ["100.127.30.116/32"];
+          network = "tailscale0";
+          type = "wireguard";
+        };
+        home = {
+          addresses = ["192.168.1.47/24"];
+          network = "home";
+          type = "ethernet";
+        };
+      };
+    };
+  };
+}
diff --git a/hosts/tsuru/default.nix b/hosts/tsuru/default.nix
index 67df882..7cde069 100644
--- a/hosts/tsuru/default.nix
+++ b/hosts/tsuru/default.nix
@@ -3,8 +3,8 @@
     ./hardware.nix
     ./services
     ./networking.nix
-    ../common.nix
-    ../../modules
+    ./topology.nix
+    ../common
   ];
 
   users = {
diff --git a/hosts/tsuru/topology.nix b/hosts/tsuru/topology.nix
new file mode 100644
index 0000000..46ff03b
--- /dev/null
+++ b/hosts/tsuru/topology.nix
@@ -0,0 +1,20 @@
+_: {
+  topology = {
+    self = {
+      name = "tsuru";
+      hardware.info = "Proxmox VM";
+      interfaces = {
+        tailscale0 = {
+          addresses = ["100.82.146.40/32"];
+          network = "tailscale0";
+          type = "wireguard";
+        };
+        home = {
+          addresses = ["192.168.1.99/24"];
+          network = "home";
+          type = "ethernet";
+        };
+      };
+    };
+  };
+}
diff --git a/hosts/yuki/default.nix b/hosts/yuki/default.nix
index d04b201..529e6eb 100644
--- a/hosts/yuki/default.nix
+++ b/hosts/yuki/default.nix
@@ -3,8 +3,8 @@
     ./hardware.nix
     ./services
     ./networking.nix
-    ../common.nix
-    ../../modules
+    ./topology.nix
+    ../common
   ];
 
   users = {
diff --git a/hosts/yuki/services/hass/config.nix b/hosts/yuki/services/hass/config.nix
index c73ff39..7253367 100644
--- a/hosts/yuki/services/hass/config.nix
+++ b/hosts/yuki/services/hass/config.nix
@@ -2,7 +2,7 @@ _: {
   services.home-assistant.config = {
     lovelace.mode = "yaml";
     http = {
-      server_host = "0.0.0.0";
+      server_host = ["0.0.0.0"];
       server_port = 8123;
     };
     homeassistant = {
diff --git a/hosts/yuki/topology.nix b/hosts/yuki/topology.nix
new file mode 100644
index 0000000..28454e2
--- /dev/null
+++ b/hosts/yuki/topology.nix
@@ -0,0 +1,20 @@
+_: {
+  topology = {
+    self = {
+      name = "yuki";
+      hardware.info = "Proxmox VM";
+      interfaces = {
+        tailscale0 = {
+          addresses = ["100.108.113.89/32"];
+          network = "tailscale0";
+          type = "wireguard";
+        };
+        home = {
+          addresses = ["192.168.1.98/24"];
+          network = "home";
+          type = "ethernet";
+        };
+      };
+    };
+  };
+}
diff --git a/modules/default.nix b/modules/default.nix
index fb3ae59..c86e188 100644
--- a/modules/default.nix
+++ b/modules/default.nix
@@ -1,13 +1,6 @@
 _: {
   imports = [
-    ./prometheus.nix
-    ./security.nix
-    ./users.nix
-    ./nix.nix
-    ./system.nix
-    ./openssh.nix
-    ./virtualisation.nix
-    ./sops.nix
-    ./time.nix
+    ./pre-commit.nix
+    ./topology.nix
   ];
 }
diff --git a/modules/pre-commit.nix b/modules/pre-commit.nix
new file mode 100644
index 0000000..00f54c8
--- /dev/null
+++ b/modules/pre-commit.nix
@@ -0,0 +1,27 @@
+{inputs, ...}: {
+  imports = [
+    inputs.pre-commit-hooks.flakeModule
+  ];
+  perSystem.pre-commit = {
+    check.enable = true;
+    settings = {
+      excludes = ["flake.lock"];
+      hooks = {
+        stylua.enable = true;
+        statix.enable = true;
+        alejandra.enable = true;
+        deadnix = {
+          enable = true;
+          excludes = ["technorino.nix"];
+        };
+        prettier = {
+          enable = true;
+          files = "\\.(js|ts|md|json)$";
+          settings = {
+            trailing-comma = "none";
+          };
+        };
+      };
+    };
+  };
+}
diff --git a/modules/topology.nix b/modules/topology.nix
new file mode 100644
index 0000000..b466f18
--- /dev/null
+++ b/modules/topology.nix
@@ -0,0 +1,85 @@
+{
+  inputs,
+  self,
+  ...
+}: {
+  imports = [
+    inputs.nix-topology.flakeModule
+  ];
+  perSystem = _: {
+    topology.modules = [
+      {inherit (self) nixosConfigurations;}
+      ({config, ...}: let
+        inherit
+          (config.lib.topology)
+          mkConnection
+          mkInternet
+          mkRouter
+          ;
+      in {
+        networks = {
+          home = {
+            name = "home";
+            cidrv4 = "192.168.0.0/24";
+          };
+          tailscale0 = {
+            name = "tailscale";
+            cidrv4 = "100.0.0.0/32";
+          };
+          hetzner = {
+            name = "hetzner";
+            cidrv4 = "5.161.102.107/24";
+          };
+        };
+
+        nodes = {
+          internet = mkInternet {
+            connections = [
+              (mkConnection "hetzner" "wan0")
+              (mkConnection "router" "lan0")
+            ];
+          };
+          router = mkRouter "UDM-SE" {
+            info = "UDM-SE";
+            interfaceGroups = [
+              [
+                "eth0"
+                "eth1"
+                "eth2"
+                "eth4"
+                "eth5"
+                "eth6"
+                "eth7"
+              ]
+              ["lan0"]
+            ];
+            connections = {
+              eth0 = mkConnection "ame" "home";
+              eth1 = mkConnection "arashi" "home";
+              eth2 = mkConnection "haru" "home";
+              eth3 = mkConnection "kariru" "home";
+              eth4 = mkConnection "sakura" "home";
+              eth5 = mkConnection "tsuki" "home";
+              eth6 = mkConnection "tsuru" "home";
+              eth7 = mkConnection "yuki" "home";
+            };
+          };
+          hetzner = mkRouter "Hetzner" {
+            info = "hetzner edge router";
+            interfaceGroups = [
+              [
+                "eth0"
+                "eth1"
+              ]
+              ["wan0"]
+            ];
+            connections = {
+              eth0 = mkConnection "sora" "eth0";
+              eth1 = mkConnection "kaze" "eth0";
+            };
+          };
+        };
+      })
+    ];
+  };
+}