diff --git a/analysis/app/app.go b/analysis/app/app.go
index d8cb399..5ab9459 100644
--- a/analysis/app/app.go
+++ b/analysis/app/app.go
@@ -38,8 +38,3 @@
 	//q := r.Form.Get("q")
 	a.compare(w, r)
 }
-
-// index redirects / to /search.
-func (a *App) index(w http.ResponseWriter, r *http.Request) {
-	http.Redirect(w, r, "/search", http.StatusSeeOther)
-}
diff --git a/analysis/app/appengine.go b/analysis/app/appengine.go
new file mode 100644
index 0000000..c5700a1
--- /dev/null
+++ b/analysis/app/appengine.go
@@ -0,0 +1,23 @@
+// Copyright 2017 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build appengine
+
+package app
+
+import (
+	"net/http"
+
+	"golang.org/x/net/context"
+	"google.golang.org/appengine"
+	"google.golang.org/appengine/log"
+)
+
+// requestContext returns the Context object for a given request.
+func requestContext(r *http.Request) context.Context {
+	return appengine.NewContext(r)
+}
+
+var infof = log.Infof
+var errorf = log.Errorf
diff --git a/analysis/app/index.go b/analysis/app/index.go
new file mode 100644
index 0000000..99b5af3
--- /dev/null
+++ b/analysis/app/index.go
@@ -0,0 +1,46 @@
+// Copyright 2017 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package app
+
+import (
+	"html/template"
+	"io/ioutil"
+	"net/http"
+
+	"golang.org/x/perf/storage"
+)
+
+// index redirects / to /search.
+func (a *App) index(w http.ResponseWriter, r *http.Request) {
+	ctx := requestContext(r)
+
+	tmpl, err := ioutil.ReadFile("template/index.html")
+	if err != nil {
+		http.Error(w, err.Error(), 500)
+		return
+	}
+
+	t, err := template.New("main").Parse(string(tmpl))
+	if err != nil {
+		http.Error(w, err.Error(), 500)
+		return
+	}
+
+	var uploads []storage.UploadInfo
+	ul := a.StorageClient.ListUploads("", []string{"by", "upload-time"}, 16)
+	defer ul.Close()
+	for ul.Next() {
+		uploads = append(uploads, ul.Info())
+	}
+	if err := ul.Err(); err != nil {
+		errorf(ctx, "failed to fetch recent uploads: %v", err)
+	}
+
+	w.Header().Set("Content-Type", "text/html; charset=utf-8")
+	if err := t.Execute(w, struct{ RecentUploads []storage.UploadInfo }{uploads}); err != nil {
+		http.Error(w, err.Error(), 500)
+		return
+	}
+}
diff --git a/analysis/app/local.go b/analysis/app/local.go
new file mode 100644
index 0000000..a4b45fd
--- /dev/null
+++ b/analysis/app/local.go
@@ -0,0 +1,25 @@
+// Copyright 2017 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !appengine
+
+package app
+
+import (
+	"log"
+	"net/http"
+
+	"golang.org/x/net/context"
+)
+
+// requestContext returns the Context object for a given request.
+func requestContext(r *http.Request) context.Context {
+	return r.Context()
+}
+
+func infof(_ context.Context, format string, args ...interface{}) {
+	log.Printf(format, args...)
+}
+
+var errorf = infof
diff --git a/analysis/appengine/template/index.html b/analysis/appengine/template/index.html
new file mode 100644
index 0000000..7497b51
--- /dev/null
+++ b/analysis/appengine/template/index.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>Go Performance Result Dashboard</title>
+    <style type="text/css">
+#header h1 {
+  display: inline;
+}
+#search {
+  padding: 1em .5em;
+  width: 100%;
+}
+input[type="text"] {
+  font-size: 100%;
+}
+#results {
+  border-top: 1px solid black;
+}
+    </style>
+  </head>
+  <body>
+    <div id="header">
+      <h1>Go Performance Dashboard</h1>
+      <a href="/">about</a>
+    </div>
+    <div id="search">
+      <form action="/search">
+        <input type="text" name="q" size="120">
+        <input type="submit" value="Search">
+      </form>
+    </div>
+    <div id="results">
+      <p>The Go Performance Dashboard provides a centralized
+        resource for sharing and analyzing benchmark results. To get
+        started, upload benchmark results using
+        <code>go get -u golang.org/x/perf/cmd/benchsave</code>
+        and
+        <code>benchsave old.txt new.txt</code>
+        or upload via the web at
+        <a href="https://perfdata-dot-golang-org.appspot.com/upload">https://perfdata-dot-golang-org.appspot.com/upload</a>.</p>
+      {{with .RecentUploads}}
+        <h2>Recent Uploads</h2>
+        <table>
+          <thead>
+            <tr><th>Records</th><th>Upload</th><th>By</th></tr>
+          </thead>
+          <tbody>
+            {{range .}}
+              <tr>
+                <td>{{.Count}}</td>
+                <td><a href="/search?q={{.UploadID}}">{{index .LabelValues "upload-time"}}</a></td>
+                <td>{{.LabelValues.by}}</td>
+              </tr>
+            {{end}}
+          </tbody>
+        </table>
+      {{end}}
+    </div>
+  </body>
+</html>
