diff --git a/content/news.html b/content/news.njk
similarity index 97%
rename from content/news.html
rename to content/news.njk
index a17a6a1a..a31d4ed6 100644
--- a/content/news.html
+++ b/content/news.njk
@@ -1,5 +1,6 @@
---
title: News
+layout: layouts/default.njk
sitemap:
changefreq: daily
priority: 1.0
diff --git a/content/news/2014/2014-06-12-upcoming-exceptionless-2-0-simplified-api.md b/content/news/2014/2014-06-12-upcoming-exceptionless-2-0-simplified-api.md
index f1c40631..fc2bdf43 100644
--- a/content/news/2014/2014-06-12-upcoming-exceptionless-2-0-simplified-api.md
+++ b/content/news/2014/2014-06-12-upcoming-exceptionless-2-0-simplified-api.md
@@ -2,7 +2,8 @@
id: 9027
title: "More from the Upcoming Exceptionless 2.0: Simplified API"
date: 2014-06-12
-tags: [ "api"]
+tags:
+ - api
---
Since [going open source](/fork-us-exceptionless-goes-open-source/ "Fork Us! Exceptionless Goes Open Source"), we've wanted to simplify the API and make it easier to work with.
diff --git a/content/news/2014/2014-09-03-making-move-elastic-search-exceptionless-2-0.md b/content/news/2014/2014-09-03-making-move-elastic-search-exceptionless-2-0.md
index 367055e3..4bc57a98 100644
--- a/content/news/2014/2014-09-03-making-move-elastic-search-exceptionless-2-0.md
+++ b/content/news/2014/2014-09-03-making-move-elastic-search-exceptionless-2-0.md
@@ -2,7 +2,8 @@
id: 10108
title: Making the Move to Elasticsearch for Exceptionless 2.0
date: 2014-09-03
-tags: [ "new features"]
+tags:
+ - new features
---
We know you've thought about it when using Exceptionless, and many developers have submitted formal requests. **Search**.
diff --git a/content/news/_data.yml b/content/news/_data.yml
new file mode 100644
index 00000000..bd026d2f
--- /dev/null
+++ b/content/news/_data.yml
@@ -0,0 +1,2 @@
+type: posts
+layout: layouts/post.njk
\ No newline at end of file
diff --git a/content/news/news.json b/content/news/news.json
deleted file mode 100644
index 6fbdb5a6..00000000
--- a/content/news/news.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "layout": "post",
- "author": "Exceptionless",
- "tags": ["posts"]
-}
\ No newline at end of file
diff --git a/content/pricing.html b/content/pricing.njk
similarity index 99%
rename from content/pricing.html
rename to content/pricing.njk
index 3d09a8d7..41bb7e55 100644
--- a/content/pricing.html
+++ b/content/pricing.njk
@@ -1,5 +1,6 @@
---
title: Pricing
+layout: layouts/content.njk
---
diff --git a/content/privacy.md b/content/privacy.md
index e405d42f..04e5fb14 100644
--- a/content/privacy.md
+++ b/content/privacy.md
@@ -1,6 +1,6 @@
---
title: Privacy Policy
-layout: content-well
+layout: layouts/content-well.njk
---
We collect the e-mail addresses of those who communicate with us via e-mail or through our feedback forms, aggregate information on what pages consumers access or visit, and information volunteered by the consumer (such as survey information and/or site registrations). The information we collect is used to improve the content of our Web pages and the quality of our service, and is not shared with or sold to other organizations for commercial purposes, except to provide products or services you’ve requested, when we have your permission, or under the following circumstances:
diff --git a/content/_redirects.njk b/content/redirects.njk
similarity index 99%
rename from content/_redirects.njk
rename to content/redirects.njk
index 4bf79595..f2c1f125 100644
--- a/content/_redirects.njk
+++ b/content/redirects.njk
@@ -1,7 +1,6 @@
---
-permalink: _redirects
+url: ./_redirects
eleventyExcludeFromCollections: true
-layout:
---
/feed/ /feed.xml
/better-approach-running-azure-webjobs/ /news/2015/2015-12-08-better-approach-running-azure-webjobs/
diff --git a/content/robots.njk b/content/robots.njk
deleted file mode 100644
index 2c5a0d24..00000000
--- a/content/robots.njk
+++ /dev/null
@@ -1,7 +0,0 @@
----
-permalink: /robots.txt
-eleventyExcludeFromCollections: true
-layout: null
----
-User-agent: *
-Sitemap: https://exceptionless.com/sitemap.xml
\ No newline at end of file
diff --git a/content/robots.txt.njk b/content/robots.txt.njk
new file mode 100644
index 00000000..40531ed8
--- /dev/null
+++ b/content/robots.txt.njk
@@ -0,0 +1,3 @@
+User-agent: *
+
+Sitemap: {{ 'sitemap.xml' | url(true) }}
diff --git a/content/search.html b/content/search.njk
similarity index 98%
rename from content/search.html
rename to content/search.njk
index 6189aeaa..5bffa5b2 100644
--- a/content/search.html
+++ b/content/search.njk
@@ -1,6 +1,6 @@
---
title: Search Results
-layout: docs
+layout: layouts/docs.njk
---
diff --git a/content/search.tmpl.ts b/content/search.tmpl.ts
new file mode 100644
index 00000000..6df42d6c
--- /dev/null
+++ b/content/search.tmpl.ts
@@ -0,0 +1,28 @@
+export const url = "/docs/index.json";
+export const renderOrder = 1000000;
+import lunr from 'https://cdn.skypack.dev/lunr?dts';
+import { Search } from "https://deno.land/x/lume/plugins/search.ts";
+import { Data } from "https://deno.land/x/lume/core.ts";
+
+export default function (data : Data, blah: any): string {
+ const search = data.search as Search;
+
+ const idx = lunr(function () {
+ this.field('title');
+ this.field('body');
+
+ const pages = search.pages("type=doc", "parent.src.path data.order");
+
+ for (const post of search.pages("type=doc")) {
+ this.add({
+ "id": blah.url(post.data.url),
+ "title": post.data.title,
+ //"description": post.data.description,
+ //"tags": post.data.tags.join(" "),
+ "body": post.content
+ });
+ }
+ });
+
+ return JSON.stringify(idx);
+}
diff --git a/content/sitemap.njk b/content/sitemap.njk
deleted file mode 100644
index 86efa57b..00000000
--- a/content/sitemap.njk
+++ /dev/null
@@ -1,6 +0,0 @@
----
-permalink: /sitemap.xml
-eleventyExcludeFromCollections: true
-layout: null
----
-{% sitemap collections.all %}
diff --git a/content/sitemap.xml.njk b/content/sitemap.xml.njk
new file mode 100644
index 00000000..62b14938
--- /dev/null
+++ b/content/sitemap.xml.njk
@@ -0,0 +1,9 @@
+
+
+{%- for page in search.pages() %}
+
+ {{ page.data.url | url(true) }}
+ {{ page.data.date | date("DATE") }}
+
+{%- endfor %}
+
diff --git a/content/tag.tmpl.js b/content/tag.tmpl.js
new file mode 100644
index 00000000..ec3bb58e
--- /dev/null
+++ b/content/tag.tmpl.js
@@ -0,0 +1,12 @@
+export const layout = "layouts/tag.njk";
+
+export default function* ({ search }) {
+ for (const tag of search.tags()) {
+ yield {
+ url: `/tags/${tag}/`,
+ title: `Tagged “${tag}”`,
+ type: "tag",
+ tag,
+ };
+ }
+}
diff --git a/content/tags.njk b/content/tags.njk
new file mode 100644
index 00000000..cc4c4e06
--- /dev/null
+++ b/content/tags.njk
@@ -0,0 +1,8 @@
+---
+layout: layouts/default.njk
+---
+
Tags
+
+{% for page in search.pages("type=tag", "tag") %}
+ {{ page.data.tag }}
+{% endfor %}
diff --git a/content/terms.md b/content/terms.md
index e0d60d9b..2ecdaa03 100644
--- a/content/terms.md
+++ b/content/terms.md
@@ -1,6 +1,6 @@
---
title: Terms of Use
-layout: content-well
+layout: layouts/content-well.njk
---
The Exceptionless Terms of Service are between Exceptionless ("we" or "Exceptionless") and the customer who orders the Exceptionless services ("you" or "Customer"). By using the Exceptionless web site or any service of Exceptionless (collectively, "Service"), you are agreeing to be bound by the following terms and conditions ("Terms of Service").
diff --git a/content/tour.html b/content/tour.njk
similarity index 99%
rename from content/tour.html
rename to content/tour.njk
index 60a141c6..92def07e 100644
--- a/content/tour.html
+++ b/content/tour.njk
@@ -1,5 +1,6 @@
---
title: Feature Tour
+layout: layouts/content.njk
---
diff --git a/content/why.html b/content/why.njk
similarity index 99%
rename from content/why.html
rename to content/why.njk
index ae182f9f..78eee12e 100644
--- a/content/why.html
+++ b/content/why.njk
@@ -1,6 +1,6 @@
---
title: Why Exceptionless?
-layout: default
+layout: layouts/default.njk
---