Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision e6272d126af1da85efbc5f054f8af5220f37d8df)
+++ src/routes/posts.js	(revision 5410d4df71323137e60b05a38aa6eb7b4cd6e4e4)
@@ -10,5 +10,4 @@
 import { renderPage } from '../middleware/render.js';
 import { recordPageview, recordPostView } from '../services/StatsService.js';
-import { notify } from '../services/NotificationService.js';
 import PermissionsService from '../services/PermissionsService.js';
 import MarkdownService from '../services/MarkdownService.js';
@@ -430,59 +429,6 @@
 });
 
-// Path to the like button partial (for the htmx toggle re-render).
-const LIKE_PARTIAL = path.join(__dirname, '..', 'views', 'partials', 'like-button.ejs');
-
-// ==================== LIKE / FAVOURITE ====================
-// A logged-in user (not a viewer — the global guard blocks non-GET for viewers)
-// toggles a like on a published post. Returns the re-rendered button (htmx outerHTML swap).
-router.post('/posts/:id/like', requireAuth, (req, res) => {
-  const userId = req.session.user.id;
-  const post = db.prepare('SELECT id, status, slug, title, author_id FROM posts WHERE id = ?').get(req.params.id);
-  if (!post) return res.status(404).send('Post niet gevonden');
-  if (post.status !== 'published') return res.status(403).send('Niet beschikbaar');
-
-  const exists = db.prepare('SELECT 1 FROM post_likes WHERE post_id = ? AND user_id = ?').get(post.id, userId);
-  if (exists) {
-    db.prepare('DELETE FROM post_likes WHERE post_id = ? AND user_id = ?').run(post.id, userId);
-  } else {
-    db.prepare('INSERT OR IGNORE INTO post_likes (post_id, user_id) VALUES (?, ?)').run(post.id, userId);
-    // Notification for the post author (notify skips self-likes).
-    notify({
-      userId: post.author_id, actorId: userId, actorName: req.session.user.username, type: 'like',
-      postSlug: post.slug, postTitle: post.title, url: (res.locals.siteUrlBase || '') + '/' + post.slug,
-    });
-  }
-  const likeCount = db.prepare('SELECT COUNT(*) AS c FROM post_likes WHERE post_id = ?').get(post.id).c;
-
-  const html = ejs.render(fs.readFileSync(LIKE_PARTIAL, 'utf8'), {
-    post: { id: post.id }, likedByMe: !exists, likeCount, loggedIn: true, loginNext: '/',
-  });
-  res.send(html);
-});
-
-// Favourites = posts the logged-in user has liked. Solo: within the current
-// site. Hub: across all sites (with correct /user/<slug> links).
-router.get('/favorieten', requireAuth, (req, res) => {
-  const userId = req.session.user.id;
-  const isHub = res.locals.tenancy === 'hub';
-  const site = res.locals.site;
-  const rows = isHub
-    ? db.prepare(`
-        SELECT p.id, p.slug, p.title, p.excerpt, p.cover_image_url, p.published_at,
-               p.tags, p.type, p.pinned, p.status, s.slug AS site_slug
-        FROM post_likes pl JOIN posts p ON p.id = pl.post_id JOIN sites s ON s.id = p.site_id
-        WHERE pl.user_id = ? AND p.status = 'published'
-        ORDER BY pl.created_at DESC
-      `).all(userId)
-    : db.prepare(`
-        SELECT p.id, p.slug, p.title, p.excerpt, p.cover_image_url, p.published_at,
-               p.tags, p.type, p.pinned, p.status
-        FROM post_likes pl JOIN posts p ON p.id = pl.post_id
-        WHERE pl.user_id = ? AND p.site_id = ? AND p.status = 'published'
-        ORDER BY pl.created_at DESC
-      `).all(userId, site ? site.id : '');
-  const posts = rows.map((p) => ({ ...p, _urlBase: (isHub && p.site_slug) ? `/user/${p.site_slug}` : '' }));
-  renderPage(req, res, 'pages/favorites', { posts, pageTitle: 'Favorieten', bodyClass: 'on-favorites' });
-});
+// Local likes/favourites are removed — engagement is fediverse-only now
+// (the ⭐ on a post likes via the fediverse). No post_likes, no /favorieten.
 
 // Newer/Older neighbours across ALL posts in feed order. Shared by the full
@@ -869,9 +815,4 @@
   relatedPosts = relatedPosts.map(({ _overlap, tags, ...rest }) => ({ ...rest, _urlBase: urlBaseFor(rest) }));
 
-  // Likes / favourites: count + whether the logged-in user liked this post.
-  const likeCount = db.prepare('SELECT COUNT(*) AS c FROM post_likes WHERE post_id = ?').get(post.id).c;
-  const likedByMe = !!(req.session?.user &&
-    db.prepare('SELECT 1 FROM post_likes WHERE post_id = ? AND user_id = ?').get(post.id, req.session.user.id));
-
   // Inbound fediverse activity (threaded) for this post.
   let fediverse = { thread: [], likeCount: 0, announceCount: 0, total: 0 };
@@ -893,6 +834,4 @@
     canManageSite,
     siteAvatar,
-    likeCount,
-    likedByMe,
     pageTitle: post.title + ' - ' + site.title,
     socialDescr: post.excerpt || '',
Index: c/views/pages/favorites.ejs
===================================================================
--- src/views/pages/favorites.ejs	(revision e6272d126af1da85efbc5f054f8af5220f37d8df)
+++ 	(revision )
@@ -1,21 +1,0 @@
-<div class="container favorites-page">
-  <h1><%= t('fav.title') %></h1>
-  <p class="fav-sub"><%= t('fav.sub') %></p>
-
-  <% if (!posts || !posts.length) { %>
-    <p class="fav-empty"><%= t('fav.empty') %></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/partials/profile-sheet.ejs
===================================================================
--- src/views/partials/profile-sheet.ejs	(revision e6272d126af1da85efbc5f054f8af5220f37d8df)
+++ src/views/partials/profile-sheet.ejs	(revision 5410d4df71323137e60b05a38aa6eb7b4cd6e4e4)
@@ -60,13 +60,4 @@
           <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="M18 8a6 6 0 0 0-12 0c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>
           <span class="psi-label"><%= t('nav.notifications') %><% if (typeof notifUnread !== 'undefined' && notifUnread > 0) { %> (<%= notifUnread %>)<% } %></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 e6272d126af1da85efbc5f054f8af5220f37d8df)
+++ src/views/partials/topnav.ejs	(revision 5410d4df71323137e60b05a38aa6eb7b4cd6e4e4)
@@ -137,10 +137,4 @@
                 <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><%= t('nav.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><%= t('nav.favorites') %></span>
               </a>
               <% if (typeof canSeeBeheer !== 'undefined' && canSeeBeheer) { %>
