Index: src/views/pages/favorites.ejs
===================================================================
--- src/views/pages/favorites.ejs	(revision 535f955817ec83f38e0bd69aafbc344a7f7c716a)
+++ src/views/pages/favorites.ejs	(revision 535f955817ec83f38e0bd69aafbc344a7f7c716a)
@@ -0,0 +1,21 @@
+<div class="container favorites-page">
+  <h1>Favorieten</h1>
+  <p class="fav-sub">Posts die je hebt geliket. Tik op het ♥ bij een post om 'm hier te bewaren.</p>
+
+  <% if (!posts || !posts.length) { %>
+    <p class="fav-empty">Je hebt nog geen favorieten. Open een post en tik op het hartje ♡.</p>
+  <% } else { %>
+    <ul class="post-list">
+      <% posts.forEach(function(p){ %>
+        <%- include('../partials/post-card', { post: p, siteUrlBase: (p._urlBase || '') }) %>
+      <% }); %>
+    </ul>
+  <% } %>
+</div>
+
+<style>
+  .favorites-page { max-width: 760px; margin: 3rem auto; padding: 0 1rem; }
+  .favorites-page h1 { font-family: var(--font-display, serif); font-size: 2rem; margin: 0 0 0.3rem; }
+  .fav-sub { color: var(--ink-muted); margin: 0 0 2rem; }
+  .fav-empty { color: var(--ink-muted); padding: 2rem 0; }
+</style>
Index: src/views/pages/post.ejs
===================================================================
--- src/views/pages/post.ejs	(revision 8cdb377943308d65de80427694f9692337081aa7)
+++ src/views/pages/post.ejs	(revision 535f955817ec83f38e0bd69aafbc344a7f7c716a)
@@ -31,4 +31,9 @@
       <% } %>
     </div>
+    <% if (post.status === 'published') { %>
+      <div class="post-like-row">
+        <%- include('../partials/like-button', { post: post, likedByMe: (typeof likedByMe !== 'undefined' && likedByMe), likeCount: (typeof likeCount !== 'undefined' ? likeCount : 0), loggedIn: !!user, loginNext: _base + '/' + post.slug }) %>
+      </div>
+    <% } %>
   </header>
 
@@ -250,4 +255,16 @@
 .post-content { font-family: var(--font-body, serif); font-size: 1.1rem; line-height: 1.7; color: var(--ink); }
 .post-content p { margin: 1.2em 0; }
+.post-like-row { margin-top: 1rem; }
+.like-btn {
+  display: inline-flex; align-items: center; gap: 0.45rem;
+  padding: 0.4rem 0.85rem; border: 1px solid var(--rule); border-radius: 999px;
+  background: var(--paper-2); color: var(--ink); font: inherit; font-size: 0.95rem;
+  cursor: pointer; text-decoration: none; transition: border-color 120ms, color 120ms, background 120ms;
+}
+.like-btn:hover { border-color: var(--accent); }
+.like-btn .like-heart { font-size: 1.1rem; line-height: 1; }
+.like-btn.is-liked { border-color: var(--accent); color: var(--accent); }
+.like-btn.is-liked .like-heart { color: var(--accent); }
+.like-btn .like-count { font-variant-numeric: tabular-nums; }
 .post-content h2 { font-family: var(--font-display, serif); font-size: 1.6rem; margin: 2rem 0 1rem; }
 .post-content h3 { font-family: var(--font-display, serif); font-size: 1.3rem; margin: 1.5rem 0 0.75rem; }
Index: src/views/partials/like-button.ejs
===================================================================
--- src/views/partials/like-button.ejs	(revision 535f955817ec83f38e0bd69aafbc344a7f7c716a)
+++ src/views/partials/like-button.ejs	(revision 535f955817ec83f38e0bd69aafbc344a7f7c716a)
@@ -0,0 +1,24 @@
+<%# Like-/favorietknop voor een post. Ingelogd → htmx-toggle (POST /posts/:id/like,
+    swap outerHTML met deze partial terug). Niet ingelogd → link naar login.
+    Verwacht: post (met .id), likedByMe, likeCount, loggedIn, loginNext. %>
+<%
+  var _liked = (typeof likedByMe !== 'undefined' && likedByMe);
+  var _cnt = (typeof likeCount !== 'undefined' && likeCount != null) ? likeCount : 0;
+  var _logged = (typeof loggedIn !== 'undefined' && loggedIn);
+%>
+<% if (_logged) { %>
+  <button type="button" class="like-btn<%= _liked ? ' is-liked' : '' %>"
+          hx-post="/posts/<%= post.id %>/like" hx-swap="outerHTML"
+          aria-pressed="<%= _liked ? 'true' : 'false' %>"
+          aria-label="<%= _liked ? 'Uit favorieten verwijderen' : 'Toevoegen aan favorieten' %>"
+          title="<%= _liked ? 'Uit favorieten verwijderen' : 'Toevoegen aan favorieten' %>">
+    <span class="like-heart" aria-hidden="true"><%= _liked ? '♥' : '♡' %></span>
+    <span class="like-count"><%= _cnt %></span>
+  </button>
+<% } else { %>
+  <a class="like-btn" href="/auth/login?next=<%= encodeURIComponent((typeof loginNext !== 'undefined' && loginNext) ? loginNext : '/') %>"
+     title="Log in om deze post te liken">
+    <span class="like-heart" aria-hidden="true">♡</span>
+    <span class="like-count"><%= _cnt %></span>
+  </a>
+<% } %>
Index: src/views/partials/profile-sheet.ejs
===================================================================
--- src/views/partials/profile-sheet.ejs	(revision 8cdb377943308d65de80427694f9692337081aa7)
+++ src/views/partials/profile-sheet.ejs	(revision 535f955817ec83f38e0bd69aafbc344a7f7c716a)
@@ -53,4 +53,13 @@
           <svg class="psi-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
           <span class="psi-label">Account</span>
+          <svg class="psi-chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="9 18 15 12 9 6"/></svg>
+        </a>
+      </li>
+      <li role="none">
+        <a href="/favorieten" class="profile-sheet-item" role="menuitem" data-close-sheet
+           hx-get="/favorieten?partial=1" hx-target="#pcms-main" hx-swap="innerHTML"
+           hx-push-url="/favorieten" hx-indicator="#pcms-loading">
+          <svg class="psi-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>
+          <span class="psi-label">Favorieten</span>
           <svg class="psi-chev" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="9 18 15 12 9 6"/></svg>
         </a>
Index: src/views/partials/topnav.ejs
===================================================================
--- src/views/partials/topnav.ejs	(revision 8cdb377943308d65de80427694f9692337081aa7)
+++ src/views/partials/topnav.ejs	(revision 535f955817ec83f38e0bd69aafbc344a7f7c716a)
@@ -119,4 +119,10 @@
                 <svg class="udi-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg>
                 <span>Account</span>
+              </a>
+              <a href="/favorieten" role="menuitem" class="udi"
+                 hx-get="/favorieten?partial=1" hx-target="#pcms-main" hx-swap="innerHTML"
+                 hx-push-url="/favorieten" hx-indicator="#pcms-loading">
+                <svg class="udi-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>
+                <span>Favorieten</span>
               </a>
               <% if (typeof canSeeBeheer !== 'undefined' && canSeeBeheer) { %>
