diff --git a/build-agda-html.rb b/build-agda-html.rb
new file mode 100644
index 0000000..0e40ef0
--- /dev/null
+++ b/build-agda-html.rb
@@ -0,0 +1,36 @@
+require "json"
+require "set"
+
+code_paths = Dir.glob("code/*").to_set
+code_paths += JSON.parse(File.read("data/submodules.json")).keys
+
+max_path = ->(path) {
+ code_paths.max_by do |code_path|
+ count = 0
+ path.chars.zip(code_path.chars) do |c1, c2|
+ break unless c1 == c2
+ count += 1
+ end
+
+ next count
+ end
+}
+
+files_for_paths = {}
+Dir.glob("code/**/*.agda") do |agda_file|
+ best_path = max_path.call(agda_file)
+ files_for_path = files_for_paths.fetch(best_path) do
+ files_for_paths[best_path] = []
+ end
+
+ files_for_path << agda_file[best_path.length + File::SEPARATOR.length..-1]
+end
+
+original_wd = Dir.getwd
+files_for_paths.each do |path, files|
+ Dir.chdir(File.join [original_wd, path])
+ files.each do |file|
+ puts "Invoking 'agda' on file: #{File.join [Dir.getwd, file]}"
+ `agda --local-interfaces #{file} --html --html-dir=html`
+ end
+end