diff --git a/_includes/footer.html b/_includes/footer.html
new file mode 100644
index 0000000000000000000000000000000000000000..1c91b7b81aa78d39f8ba93efa2cb9b784cbd0e70
--- /dev/null
+++ b/_includes/footer.html
@@ -0,0 +1,9 @@
+<footer>
+    <p class="footer-description">
+        {{ brand.description }}
+        <br />
+        Proudly powered by <a href="https://11ty.dev">Eleventy</a>,
+        <a href="https://framagit.org">Framagit</a> and more.
+        <a href="/domain/">Like what you see?</a>
+    </p>
+</footer>
\ No newline at end of file
diff --git a/_includes/header.html b/_includes/header.html
new file mode 100644
index 0000000000000000000000000000000000000000..8558749639a14c5031b722fe53543093aa56d76c
--- /dev/null
+++ b/_includes/header.html
@@ -0,0 +1,12 @@
+<header>
+    <nav class="header-nav">
+        <ul class="header-list">
+            {% for link in header.links %}
+                <li>
+                    <a href="{{ link.url }}">{{ link.name }}</a>
+                </li>
+            {% endfor %}
+        </ul>
+        <a href="/" class="header-brand">{{ brand.username }}</a>
+    </nav>
+</header>
\ No newline at end of file
diff --git a/_includes/layouts/base.html b/_includes/layouts/base.html
new file mode 100644
index 0000000000000000000000000000000000000000..c648dbe43455c43525c479cbe07b624dbb193caf
--- /dev/null
+++ b/_includes/layouts/base.html
@@ -0,0 +1,34 @@
+---
+templateEngineOverride: liquid
+---
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>{{ title or brand.name }}</title>
+    <meta name="description" content="{{ description or brand.description }}">
+    <link rel="stylesheet" href="/styling/main.css">
+    <link rel="stylesheet" href="/styling/footer.css">
+    <link rel="stylesheet" href="/styling/home.css">
+    <link rel="stylesheet" href="/styling/header.css">
+    <link rel="stylesheet" href="/assets/fonts/manrope/manrope-v1-latin-regular.css">
+    {% if env == 'production' %}
+        <script data-goatcounter="https://resynth1943.goatcounter.com/count" async src="//gc.zgo.at/count.js"></script>
+    {% endif %}
+    <!-- <link rel="stylesheet" href="https://unpkg.com/nes.css/css/nes-core.min.css"> -->
+</head>
+<body>
+    {% include header.html %}
+    <main class="container {{ include.mainClass }}">
+        {{ content }}
+    </main>
+    <hr />
+    {% include footer.html %}
+
+    <!-- Goatcounter tracking code; see the analytics for this page: https://resynth1943.goatcounter.com/ -->
+    <script data-goatcounter="https://resynth1943.goatcounter.com/count"
+        async src="//gc.zgo.at/count.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/_includes/layouts/post.html b/_includes/layouts/post.html
new file mode 100644
index 0000000000000000000000000000000000000000..69fae3baf0e892145c9294a089d67c87a03658a9
--- /dev/null
+++ b/_includes/layouts/post.html
@@ -0,0 +1,6 @@
+---
+layout: base
+mainClass: post
+---
+
+{{ content }}
\ No newline at end of file
diff --git a/_includes/posts_list.html b/_includes/posts_list.html
new file mode 100644
index 0000000000000000000000000000000000000000..d4178cd52b394103f5be99d4ee54901145e3c820
--- /dev/null
+++ b/_includes/posts_list.html
@@ -0,0 +1,9 @@
+{% for article in collections.articles %}
+<div class="post-item">
+    <a class="post-item-link" href="{{ article.url }}">
+        <h2>{{ article.data.title }}</h2>
+    </a>
+    <p class="post-item-date">{{ article.date | readableDate }}</p>
+    <blockquote class="post-summary">{{ article.data.description }}</blockquote>
+</div>
+{% endfor %}
\ No newline at end of file