diff --git a/index.html b/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..fb0309bdda37227c72d892511ce7d5024a1d1a36
--- /dev/null
+++ b/index.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+  <head>
+  <meta charset="utf-8" />
+    <title>Cube Root Training</title>
+  </head>
+  <body>
+  <h1>Cube Root Training</h1>
+  <p id=cube></p>
+  <p><input type="text" id="cuberoot" value ="" size=3></p>
+  <p id=result></p>
+  <p id=stats></p>
+
+  <script>
+var cube = document.getElementById("cube");
+var cuberoot = document.getElementById("cuberoot");
+var result = document.getElementById("result");
+var stats = document.getElementById("stats");
+var began;
+var finished;
+var elapsed = 0;
+var generated;
+var guesses = 0;
+var correct = 0;
+
+cuberoot.addEventListener("keydown", function (e) {
+  if (e.keyCode === 13) {
+    check_cuberoot(e);
+  }
+})
+
+function humanize_ms(ms) {
+  if (ms < 1000) {
+    return ms + "ms";
+  } else {
+    return (Math.floor(ms / 100) / 10) + "s";
+  }
+}
+
+function start_round() {
+  if (guesses > 0) {
+    stats.innerHTML = "Got " + correct + " correct out of " + guesses +
+                      ". Last round took " + humanize_ms(finished - began) +
+                      "." + ((correct > 0)
+                          ?" Average time of correct guess was " +
+                          humanize_ms(elapsed / correct) + "."
+                          :"");
+  }
+  generated = Math.floor(Math.random() * 90) + 10;
+  cube.innerHTML = Math.pow(generated, 3);
+  began = Date.now();
+  cuberoot.value = "";
+  cuberoot.focus();
+}
+
+function check_cuberoot(e) {
+  var guess = e.target.value;
+
+  guesses++;
+  finished = Date.now();
+  if (guess == generated) {
+    correct++;
+    elapsed += (finished - began);
+    result.innerHTML = "Correct!";
+  } else {
+    result.innerHTML = "Not correct! Correct answer was " + generated + ".";
+  }
+  start_round();
+}
+
+start_round();
+  </script>
+  </body>
+</html>