diff --git a/utils/nightly/gmsh_mac_nightly.cron b/utils/nightly/gmsh_mac_nightly.cron
deleted file mode 100644
index 5cf4eedc286451fed46d162b33dbc84dfc379644..0000000000000000000000000000000000000000
--- a/utils/nightly/gmsh_mac_nightly.cron
+++ /dev/null
@@ -1,4 +0,0 @@
-#
-# this will launch a new build every night at 0h01
-#
-1 0 * * * cd ${HOME}/src/gmsh/utils/nightly && /usr/local/bin/ctest -S gmsh_mac_nightly.ctest -VV > ${HOME}/src/gmsh/nightly.log 2>&1
diff --git a/utils/nightly/gmsh_mac_nightly.sh b/utils/nightly/gmsh_mac_nightly.sh
new file mode 100755
index 0000000000000000000000000000000000000000..032f0b9dd654edbc086c312c5e622f67c248e58b
--- /dev/null
+++ b/utils/nightly/gmsh_mac_nightly.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+# this is supposed to be called by launchd:
+#  * copy org.geuz.gmsh.nightly.plist to ~/Library/LauchAgents/
+#  * launchctl load ~/Library/LaunchAgents/org.geuz.gmsh.nightly.plist
+
+cd ${HOME}/src/gmsh/utils/nightly && /usr/local/bin/ctest -S gmsh_mac_nightly.ctest -VV > ${HOME}/src/gmsh/nightly.log 2>&1
diff --git a/utils/nightly/org.geuz.gmsh.nightly.plist b/utils/nightly/org.geuz.gmsh.nightly.plist
new file mode 100644
index 0000000000000000000000000000000000000000..a4aa6390919c9f8231aa056f21e7a0cc7624d530
--- /dev/null
+++ b/utils/nightly/org.geuz.gmsh.nightly.plist
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>Label</key>
+  <string>org.geuz.gmsh.nightly</string>
+
+  <key>ProgramArguments</key>
+  <array>
+    <string>/Users/geuzaine/src/gmsh/utils/nightly/gmsh_mac_nightly.sh</string>
+  </array>
+
+  <key>StartCalendarInterval</key>
+  <dict>
+    <key>Hour</key>
+    <integer>0</integer>
+    <key>Minute</key>
+    <integer>1</integer>
+  </dict>
+
+  <key>RunAtLoad</key>
+  <true/>
+</dict>
+</plist>