diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000000000000000000000000000000000..7fc91c7669939351d6a1b44e6c79067dcd5a8461
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "rd-builder"]
+	path = rd-builder
+	url = https://bitbucket.org/extendj/ragdoc-builder.git
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..ea36b821c861fbb9351debd215c5780bc5bec632
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+
+set -eu
+
+if [ ! -d 'rd-builder' ] || [ ! -e "rd-builder/build.gradle" ]; then
+  echo 'Pulling RD-Builder'
+  git submodule init
+fi
+
+EXTENDJ="rd-builder/extendj"
+
+echo "ExtendJ path: $EXTENDJ"
+if [ ! -e "$EXTENDJ/build.gradle" ]; then
+  echo 'Pulling ExtendJ'
+  (cd rd-builder; git submodule init)
+fi
+
+git submodule update
+(cd rd-builder; git submodule update)
+
+# Optional debug flags.
+DEBUG="${DEBUG:-}"
+#DEBUG="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"
+
+(cd rd-builder; ./gradlew fatJar)
+
+(cd $EXTENDJ; ./gradlew :java8:jar)
+
+java \
+  $DEBUG \
+  -jar rd-builder/rd-builder.jar \
+  -d src/data \
+  -ragroot $EXTENDJ \
+  $(find $EXTENDJ/src -name '*.java')
diff --git a/rd-builder b/rd-builder
new file mode 160000
index 0000000000000000000000000000000000000000..b8cfca720aaf1cf22e7423b362d5ec4666d311aa
--- /dev/null
+++ b/rd-builder
@@ -0,0 +1 @@
+Subproject commit b8cfca720aaf1cf22e7423b362d5ec4666d311aa