diff --git a/internal/opensearch_handler.go b/internal/opensearch_handler.go
new file mode 100644
index 0000000..6a0f7b8
--- /dev/null
+++ b/internal/opensearch_handler.go
@@ -0,0 +1,35 @@
+package internal
+
+import (
+ "fmt"
+ "net/http"
+
+ "github.com/julienschmidt/httprouter"
+)
+
+const OpenSearchTemplate string = `
+
+ %s
+ %s
+ search
+ %s
+
+
+`
+
+// OpenSearchHandler ...
+func (s *Server) OpenSearchHandler() httprouter.Handle {
+ return func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
+ w.Header().Set("Content-Type", "text/xml")
+
+ w.Write(
+ []byte(fmt.Sprintf(
+ OpenSearchTemplate,
+ s.config.Name,
+ s.config.Description,
+ s.config.AdminEmail,
+ s.config.BaseURL,
+ )),
+ )
+ }
+}
diff --git a/internal/server.go b/internal/server.go
index e7c8c8e..dc8ea97 100644
--- a/internal/server.go
+++ b/internal/server.go
@@ -285,6 +285,8 @@ func (s *Server) initRoutes() {
s.router.GET("/", s.IndexHandler())
s.router.HEAD("/", s.IndexHandler())
+ s.router.GET("/opensearch.xml", s.OpenSearchHandler())
+
s.router.GET("/robots.txt", s.RobotsHandler())
s.router.HEAD("/robots.txt", s.RobotsHandler())
diff --git a/internal/templates/base.html b/internal/templates/base.html
index be49e90..88f41f9 100644
--- a/internal/templates/base.html
+++ b/internal/templates/base.html
@@ -13,6 +13,8 @@
{{ end }}
+
+