diff --git a/.gitlab-ci-unix.yml b/.gitlab-ci-unix.yml
index b6b621d3566580b898fef4db0248d5bfecddc6cd..3b3c381d4ea8aade745701ba27721c5b974879ce 100644
--- a/.gitlab-ci-unix.yml
+++ b/.gitlab-ci-unix.yml
@@ -234,6 +234,25 @@ spec:
     - job: "uifc-$[[ inputs.os ]]"
     - job: "xpdev-$[[ inputs.os ]]"
 
+"utils-$[[ inputs.os ]]":
+  extends:
+    - .$[[ inputs.os ]]-build
+  script:
+    - cd src/sbbs3
+    - gmake ${BUILD_FLAGS} standalone-utils
+  artifacts:
+    name: "utils-${OSP}"
+    paths:
+      - "src/sbbs3/*.exe.release/*"
+      - "src/sbbs3/*.obj.release*/*"
+  needs:
+    - job: "ciolib-$[[ inputs.os ]]"
+    - job: "encode-$[[ inputs.os ]]"
+    - job: "hash-$[[ inputs.os ]]"
+    - job: "smblib-$[[ inputs.os ]]"
+    - job: "uifc-$[[ inputs.os ]]"
+    - job: "xpdev-$[[ inputs.os ]]"
+
 "sbbs-$[[ inputs.os ]]":
   extends:
     - .$[[ inputs.os ]]-build
@@ -259,6 +278,7 @@ spec:
     - job: "uifc-$[[ inputs.os ]]"
     - job: "umonitor-$[[ inputs.os ]]"
     - job: "xpdev-$[[ inputs.os ]]"
+    - job: "utils-$[[ inputs.os ]]"
   rules:
     - if: $NO_JAVASCRIPT == "yes"
       when: never
diff --git a/src/sbbs3/targets.mk b/src/sbbs3/targets.mk
index 03797fdcb99408425e21207fe3e829ec4238cedf..c4f2bf67d8aa42934cf39f7d1a03ffd3f50ca3b0 100644
--- a/src/sbbs3/targets.mk
+++ b/src/sbbs3/targets.mk
@@ -65,6 +65,18 @@ utils:	smblib xpdev-mt xpdev ciolib-mt uifc-mt \
 
 gtkutils: gtkmonitor gtkchat gtkuseredit gtkuserlist
 
+.PHONY: standalone-utils
+standalone-utils: $(FIXSMB) $(CHKSMB) \
+			  $(SMBUTIL) $(BAJA) $(NODE) \
+			  $(SBBSECHO) $(ECHOCFG) \
+			  $(ADDFILES) $(FILELIST) $(MAKEUSER) \
+			  $(ANS2ASC) $(ASC2ANS)  $(UNBAJA) \
+			  $(QWKNODES) $(SLOG) \
+			  $(DELFILES) $(DUPEFIND) \
+			  $(SEXYZ) $(READSAUCE) \
+			  $(PKTDUMP) $(FMSGDUMP) $(UPGRADE_TO_V319) \
+			  $(UPGRADE_TO_V320)
+
 .PHONY: libdeps
 libdeps: $(JS_DEPS) gitinfo smblib xpdev-mt $(MTOBJODIR) $(LIBODIR)