diff --git a/appview/pages/templates/layouts/base.html b/appview/pages/templates/layouts/base.html
index 4fc18a81..4fe948f5 100644
--- a/appview/pages/templates/layouts/base.html
+++ b/appview/pages/templates/layouts/base.html
@@ -14,6 +14,9 @@
+
+
+
diff --git a/appview/pages/templates/user/completeSignup.html b/appview/pages/templates/user/completeSignup.html
index 542731dc..1f0e9744 100644
--- a/appview/pages/templates/user/completeSignup.html
+++ b/appview/pages/templates/user/completeSignup.html
@@ -20,6 +20,7 @@
content="complete your signup for tangled"
/>
+
+
login · tangled
diff --git a/appview/pages/templates/user/signup.html b/appview/pages/templates/user/signup.html
index 1edbf20b..dd4a8d73 100644
--- a/appview/pages/templates/user/signup.html
+++ b/appview/pages/templates/user/signup.html
@@ -8,6 +8,7 @@
+
sign up · tangled
diff --git a/appview/state/router.go b/appview/state/router.go
index 3165f433..58c4a586 100644
--- a/appview/state/router.go
+++ b/appview/state/router.go
@@ -37,6 +37,7 @@ func (s *State) Router() http.Handler {
router.Use(middleware.TryRefreshSession())
router.Get("/favicon.svg", s.Favicon)
router.Get("/favicon.ico", s.Favicon)
+ router.Get("/pwa-manifest.json", s.PWAManifest)
userRouter := s.UserRouter(&middleware)
standardRouter := s.StandardRouter(&middleware)
diff --git a/appview/state/state.go b/appview/state/state.go
index 7fea71c9..cc0625af 100644
--- a/appview/state/state.go
+++ b/appview/state/state.go
@@ -198,6 +198,29 @@ func (s *State) Favicon(w http.ResponseWriter, r *http.Request) {
s.pages.Favicon(w)
}
+// https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Manifest
+const manifestJson = `{
+ "name": "tangled",
+ "description": "tightly-knit social coding.",
+ "icons": [
+ {
+ "src": "/favicon.svg",
+ "sizes": "144x144"
+ }
+ ],
+ "start_url": "/",
+ "id": "org.tangled",
+
+ "display": "standalone",
+ "background_color": "#111827",
+ "theme_color": "#111827"
+}`
+
+func (p *State) PWAManifest(w http.ResponseWriter, r *http.Request) {
+ w.Header().Set("Content-Type", "application/json")
+ w.Write([]byte(manifestJson))
+}
+
func (s *State) TermsOfService(w http.ResponseWriter, r *http.Request) {
user := s.oauth.GetUser(r)
s.pages.TermsOfService(w, pages.TermsOfServiceParams{