diff --git a/Dockerfile b/Dockerfile
index 2aa8c0daa36193d1f2417f531dfc0b74b5d18492..e60ea58fb9aaf73114b5a77f4a570e29f640704e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM registry.git.autistici.org/ai3/docker/chaperone-base:master
+FROM registry.git.autistici.org/ai3/docker/s6-base:master
 
 RUN apt-get -q update && \
     env DEBIAN_FRONTEND=noninteractive apt-get -qy install --no-install-recommends \
diff --git a/conf/chaperone.d/feedbackloop.conf b/conf/chaperone.d/feedbackloop.conf
deleted file mode 100644
index 66293865823aa9b3065ee1167451fb5373acfc99..0000000000000000000000000000000000000000
--- a/conf/chaperone.d/feedbackloop.conf
+++ /dev/null
@@ -1,16 +0,0 @@
-feedbackloop.service: {
-    command: "/bin/sh -c '/usr/local/bin/feedbackloop server --port=${PORT:-4099} --addr=${ADDR:-0.0.0.0}'",
-    exit_kills: true,
-}
-
-ingest.service: {
-    type: cron,
-    interval: "44 * * * *",
-    command: "/usr/local/bin/feedbackloop ingest",
-}
-
-expire.service: {
-    type: cron,
-    interval: "39 5 * * *",
-    command: "/usr/local/bin/feedbackloop expire --days=30",
-}
diff --git a/conf/services.d/expire/run b/conf/services.d/expire/run
new file mode 100755
index 0000000000000000000000000000000000000000..a19b4d5a59d3b60f077f001f4dbb0bfecc86f495
--- /dev/null
+++ b/conf/services.d/expire/run
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+period=${EXPIRE_PERIOD_SECS:-86400}
+offset=$(shuf -i 0-${period} -n 1)
+
+sleep $offset
+while true; do
+    /usr/local/bin/feedbackloop expire --days=30
+    sleep $period
+done
diff --git a/conf/services.d/feedbackloop/finish b/conf/services.d/feedbackloop/finish
new file mode 100755
index 0000000000000000000000000000000000000000..b6531b3ca574205c9e78650dbd7c38718683e57c
--- /dev/null
+++ b/conf/services.d/feedbackloop/finish
@@ -0,0 +1,3 @@
+#!/usr/bin/execlineb -S0
+
+s6-svscanctl -t /var/run/s6/services
diff --git a/conf/services.d/feedbackloop/run b/conf/services.d/feedbackloop/run
new file mode 100755
index 0000000000000000000000000000000000000000..0b9de1cf4080c8fd0fe36eafcf160dd2f12d115b
--- /dev/null
+++ b/conf/services.d/feedbackloop/run
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec /usr/local/bin/feedbackloop server --port=${PORT:-4099} --addr=${ADDR:-0.0.0.0}
diff --git a/conf/services.d/ingest/run b/conf/services.d/ingest/run
new file mode 100755
index 0000000000000000000000000000000000000000..8b945cf0fe6f2003cd93d611ed55b3a2d6a409a1
--- /dev/null
+++ b/conf/services.d/ingest/run
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+period=${INGEST_PERIOD_SECS:-3600}
+offset=$(shuf -i 0-${period} -n 1)
+
+sleep $offset
+while true; do
+    /usr/local/bin/feedbackloop ingest
+    sleep $period
+done