diff --git a/README.md b/README.md
index a5848b8..5dc9653 100644
--- a/README.md
+++ b/README.md
@@ -56,6 +56,7 @@ As PRs from forks don't have automatic CI checks, admins can test PRs by posting
 * @nlewo
 * @ryantm
 * @zimbatm
+* @zowoq
 
 ## Services
 
diff --git a/roles/builder/keys/zowoq b/roles/builder/keys/zowoq
deleted file mode 100644
index eb2b2cb..0000000
--- a/roles/builder/keys/zowoq
+++ /dev/null
@@ -1 +0,0 @@
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFbCYwWByGE46XHH4Q0vZgQ5sOUgbH50M8KO2xhBC4m/
diff --git a/roles/builder/users.nix b/roles/builder/users.nix
index a11a5a1..2290bf7 100644
--- a/roles/builder/users.nix
+++ b/roles/builder/users.nix
@@ -43,11 +43,6 @@ let
     };
 
     winter.keys = ./keys/winter;
-
-    zowoq = {
-      trusted = true;
-      keys = ./keys/zowoq;
-    };
   };
 
   ifAttr = key: default: result: opts:
diff --git a/users/zowoq.nix b/users/zowoq.nix
new file mode 100644
index 0000000..6693b82
--- /dev/null
+++ b/users/zowoq.nix
@@ -0,0 +1,20 @@
+{ config, pkgs, lib, ... }:
+let
+  userLib = import ./lib.nix { inherit lib; };
+  keys = [
+    "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFbCYwWByGE46XHH4Q0vZgQ5sOUgbH50M8KO2xhBC4m/"
+  ];
+
+in
+{
+  users.users.zowoq = {
+    openssh.authorizedKeys.keys = keys;
+    useDefaultShell = true;
+    isNormalUser = true;
+    extraGroups = [
+      "wheel"
+      "trusted"
+    ];
+    uid = userLib.mkUid "zowo";
+  };
+}