diff --git a/reform2-handbook/all.do b/reform2-handbook/all.do
new file mode 100644
index 0000000000000000000000000000000000000000..4770d361220fe4fb0b1d5e94311287b51e95de4e
--- /dev/null
+++ b/reform2-handbook/all.do
@@ -0,0 +1,8 @@
+rm \
+ system.html \
+ system-diagram.svg \
+ system-diagram.pdf
+
+redo-ifchange \
+ system.html \
+ system-diagram.pdf
diff --git a/reform2-handbook/build.sh b/reform2-handbook/build.sh
index e4d7ada51a9bef3c751dc95faadd8a5d38410b0f..408e37775483d4e32d9fa077341108a170827ced 100755
--- a/reform2-handbook/build.sh
+++ b/reform2-handbook/build.sh
@@ -1,22 +1,5 @@
-#!/bin/bash
+#!/bin/sh -eu
 
-function build {
-  dot -Tsvg system-diagram.dot -o system-diagram.svg
-  rsvg-convert -f pdf -o system-diagram.pdf system-diagram.svg
-
-  echo '<!DOCTYPE html><html lang="en"><meta charset="UTF-8">' >system.html
-  kramdown system.md >>system.html
-  echo '</html>' >>system.html
-  
-  sed -i 's/width="[^"]*"/width="100%"/' system-diagram.svg
-  sed -i 's/height="[^"]*"//' system-diagram.svg
-  sed -i 's/"Inter"/"Inter,Roboto,Helvetica,Helvetica Neue,Open Sans,Arial,sans-serif"/g' system-diagram.svg 
-}
-
-build
-
-while :
-do inotifywait -e modify -r *.dot *.md
-  build
+while redo; do
+ inotifywait -e modify -r *.dot *.md
 done
-
diff --git a/reform2-handbook/system-diagram.pdf.do b/reform2-handbook/system-diagram.pdf.do
new file mode 100644
index 0000000000000000000000000000000000000000..221c1579ff19d3315efb3edfd73dd95c1e76a0f4
--- /dev/null
+++ b/reform2-handbook/system-diagram.pdf.do
@@ -0,0 +1,2 @@
+redo-ifchange system-diagram.svg
+rsvg-convert -f pdf -o "${3}" system-diagram.svg
diff --git a/reform2-handbook/system-diagram.svg.do b/reform2-handbook/system-diagram.svg.do
new file mode 100644
index 0000000000000000000000000000000000000000..9ffeb268fc0ccd0f81dfab27f9e0804ce2d5f004
--- /dev/null
+++ b/reform2-handbook/system-diagram.svg.do
@@ -0,0 +1,7 @@
+redo-ifchange system-diagram.dot
+
+dot -Tsvg system-diagram.dot -o "${3}"
+
+sed -i 's/width="[^"]*"/width="100%"/' "${3}"
+sed -i 's/height="[^"]*"//' "${3}"
+sed -i 's/"Inter"/"Inter,Roboto,Helvetica,Helvetica Neue,Open Sans,Arial,sans-serif"/g' "${3}"
diff --git a/reform2-handbook/system.html.do b/reform2-handbook/system.html.do
new file mode 100644
index 0000000000000000000000000000000000000000..6fa01484bcd256f93e487093d85b52092bd22e89
--- /dev/null
+++ b/reform2-handbook/system.html.do
@@ -0,0 +1,7 @@
+redo-ifchange \
+ system-diagram.svg \
+ system.md \
+
+echo '<!DOCTYPE html><html lang="en"><meta charset="UTF-8">'
+kramdown system.md
+echo '</html>'