diff --git a/index.html b/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..f12df423a752b9ff7208a8b2fa41294dca3de31f
--- /dev/null
+++ b/index.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html>
+  <head>
+    <meta charset="utf-8"/>
+    <title>WebSocket image server test client</title>
+    <script>
+      document.addEventListener('DOMContentLoaded', () => {
+	  var img = document.getElementById("jpeg");
+	  var ws = new WebSocket("ws://{{.}}/video");
+	  ws.onmessage = (event) => {
+	      img.src = URL.createObjectURL(event.data);
+	  };
+      });
+    </script>
+  </head>
+  <body>
+    <h1>WebSocket image server test client</h1>
+
+    <img src="" id="jpeg" />
+  </body>
+</html>
diff --git a/server.go b/server.go
index 8b51a551f363f5cfd29e94c9b3301c5e9065bd9c..0cd5f3e5e08a00bc9f61c211023e6b9bb77ecba9 100644
--- a/server.go
+++ b/server.go
@@ -2,6 +2,7 @@ package main
 
 import (
 	"flag"
+	"html/template"
 	"io"
 	"log"
 	"net/http"
@@ -26,6 +27,7 @@ func jpeg(w http.ResponseWriter, r *http.Request) {
 		log.Print("upgrade: ", err)
 		return
 	}
+	defer log.Printf("closing websocket with %v", c.RemoteAddr())
 	defer c.Close()
 	log.Printf("initialised websocket with %v", c.RemoteAddr())
 
@@ -50,6 +52,18 @@ func main() {
 	}
 	f.Close()
 
+	index, err := template.ParseFiles("index.html")
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+		err = index.Execute(w, r.Host)
+		if err != nil {
+			log.Print(err)
+		}
+	})
+
 	http.HandleFunc("/jpeg", jpeg)
 
 	log.Printf("listening on %s", *listen)