diff --git a/layouts/index.html b/layouts/index.html
index 28e95ae35170c3e80dac33aecc605b4e5ce4e6e5..3de3e6206443b4576a9686bcc2bcf365c7745fa2 100644
--- a/layouts/index.html
+++ b/layouts/index.html
@@ -1,29 +1,36 @@
 {{ define "main" -}}
-<div class="posts">
-  {{ range .Site.RegularPages -}}
-    {{ if and (or (eq .Type "post") (eq .Type "article")) (or (not (isset .Params "Hidden")) (eq .Params.Hidden false)) -}}
-    <article class="post">
-      <h1 class="post-title">
-        <a href="{{ .Permalink }}">{{ .Title }}</a>
-      </h1>
+  <div class="posts">
+    {{- $regularPages := where .Site.RegularPages "Type" "in" .Site.Params.MainSections -}}
+    {{- $pagesNotHidden := where $regularPages ".Params.hidden" "==" false -}}
+    {{- $pagesHiddenUnset := where $regularPages ".Params.hidden" "==" nil -}}
 
-      <div class="post-date">
-        <time datetime="{{ .Date.Format "2006-01-02T15:04:05Z0700" }}">{{ .Date.Format "Jan 2, 2006" }}</time> · {{ .ReadingTime }} min read
-      </div>
+    {{- $pages := $pagesNotHidden | union $pagesHiddenUnset -}}
+    {{- $paginator := .Paginate $pages -}}
 
-      {{ if .Description }}
-        {{ .Description }}
-      {{ else }}
-        {{ .Summary }}
-      {{ end }}
+    {{ range $paginator.Pages }}
+      <article class="post">
+        <h1 class="post-title">
+          <a href="{{ .Permalink }}">{{ .Title }}</a>
+        </h1>
 
-      {{ if .Truncated }}
-      <div class="read-more-link">
-        <a href="{{ .RelPermalink }}">Read More</a>
-      </div>
-      {{ end }}
-    </article>
+        <div class="post-date">
+          <time datetime="{{ .Date.Format "2006-01-02T15:04:05Z0700" }}">{{ .Date.Format "Jan 2, 2006" }}</time> · {{ .ReadingTime }} min read
+        </div>
+
+        {{ if .Description }}
+          {{ .Description }}
+        {{ else }}
+          {{ .Summary }}
+        {{ end }}
+
+        {{ if .Truncated }}
+        <div class="read-more-link">
+          <a href="{{ .RelPermalink }}">Read More</a>
+        </div>
+        {{ end }}
+      </article>
     {{- end }}
-  {{- end }}
-</div>
+  </div>
+
+  {{ template "_internal/pagination.html" . }}
 {{- end }}
diff --git a/static/css/hyde.css b/static/css/hyde.css
index 4dc0c7164adbc7d4f38af7538b98f5821ed262e9..6ee3e65017b23a0f14990d48db50f09e3bdb816c 100644
--- a/static/css/hyde.css
+++ b/static/css/hyde.css
@@ -67,6 +67,10 @@ html {
     bottom: 0;
     width: 18rem;
   }
+
+  footer {
+    padding-left: 18rem;
+  }
 }
 
 /* Sidebar links */
@@ -206,3 +210,66 @@ ul.posts {
 .social-icons a:focus {
   text-decoration: none !important;
 }
+
+.pagination {
+  justify-content: center;
+  display: flex;
+  margin: 1em 0;
+  padding: 0;
+}
+
+.pagination ul {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+}
+
+.pagination li {
+  display: block;
+  float: left;
+  margin-left: -1px;
+}
+
+.pagination li a {
+  display: block;
+  margin-bottom: 0.25em;
+  padding: 0.5em 1em;
+  font-size: 14px;
+  font-weight: bold;
+  line-height: 1.5;
+  text-align: center;
+  text-decoration: none;
+  color: #49757a;
+  border: 1px solid #49757a;
+  border-radius: 0;
+}
+
+.pagination li a:hover {
+  color: #fff;
+  background: rgba(67, 118, 122, 0.75);
+}
+
+.pagination li.active a {
+  color: #fff;
+  background: #49757a;
+}
+
+.pagination li.disabled a {
+  color: rgba(67, 118, 122, 0.5);
+  pointer-events: none;
+  cursor: not-allowed;
+}
+
+.pagination li:first-child {
+  margin-left: 0;
+}
+
+.pagination li:first-child a {
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+
+.pagination li:last-child a {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}