Index: src/routes/account.js
===================================================================
--- src/routes/account.js	(revision 31680c3360308110ee32435ada564ef21f612bce)
+++ src/routes/account.js	(revision 746d98a771aa1e4a4241958d88582d516570cf4b)
@@ -14,4 +14,5 @@
 
 import express from 'express';
+import { listPlatforms, buildProfileLinks, parseProfileLinks } from '../services/PlatformIcons.js';
 import path from 'path';
 import fs from 'fs';
@@ -69,4 +70,9 @@
     pageTitle: 'Account',
     bodyClass: 'on-special',
+    // De profiellinks staan sinds 30-9 hier, bij je profiel, en niet meer op de
+    // Appearance-pagina (Robins verzoek).
+    pageJs: 'profile-links',
+    platforms: listPlatforms(),
+    profileLinks: editableSite ? parseProfileLinks(editableSite.profile_links) : [],
     account,
     hasPassword,
@@ -106,5 +112,7 @@
 function ownedSite(user) {
   if (!user) return null;
-  let site = db.prepare('SELECT id, title, tagline, slug, owner_id, profile_photo FROM sites WHERE owner_id = ? ORDER BY created_at LIMIT 1').get(user.id);
+  // profile_links hoort erbij sinds de links hier staan (30-9). Zonder die kolom
+  // toonde de pagina nul links, en wiste opslaan ze dus.
+  let site = db.prepare('SELECT id, title, tagline, slug, owner_id, profile_photo, profile_links FROM sites WHERE owner_id = ? ORDER BY created_at LIMIT 1').get(user.id);
   if (!site && user.role === 'god') {
     site = getPrimarySite(); // primary/main site as fallback
@@ -128,4 +136,19 @@
 });
 
+// ==================== PROFIELLINKS ====================
+// Sinds 30-9 hier en niet meer op Appearance: ze horen bij je profiel, naast je
+// naam, bio en foto. Dezelfde rechten als de site-naam hierboven: de eigenaar
+// van de site, of god.
+router.post('/links', requireAuth, (req, res) => {
+  const site = ownedSite(req.session.user);
+  if (!site) return res.redirect('/account?error=' + encodeURIComponent('Geen site om te bewerken.'));
+  if (site.owner_id !== req.session.user.id && req.session.user.role !== 'god') {
+    return res.redirect('/account?error=' + encodeURIComponent('Geen rechten om deze site te bewerken.'));
+  }
+  db.prepare('UPDATE sites SET profile_links = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?')
+    .run(buildProfileLinks(req.body), site.id);
+  res.redirect('/account?success=' + encodeURIComponent('Links bijgewerkt') + '#links');
+});
+
 // ==================== UPDATE BIO ====================
 const RESERVED_USERNAMES = new Set(['admin', 'account', 'auth', 'login', 'register', 'logout', 'user', 'users', 'api', 'fediverse', 'posts', 'media', 'audio', 'assets', 'cirkel', 'authorize_interaction']);
Index: src/routes/admin-sites.js
===================================================================
--- src/routes/admin-sites.js	(revision 31680c3360308110ee32435ada564ef21f612bce)
+++ src/routes/admin-sites.js	(revision 746d98a771aa1e4a4241958d88582d516570cf4b)
@@ -55,22 +55,4 @@
 });
 
-/** Coerce req.body fields into the JSON profile_links array. */
-function buildProfileLinks(body) {
-  const platforms = body.profile_link_platform || [];
-  const urls = body.profile_link_url || [];
-  const arr = [];
-  const platformsArr = Array.isArray(platforms) ? platforms : [platforms];
-  const urlsArr      = Array.isArray(urls)      ? urls      : [urls];
-  for (let i = 0; i < platformsArr.length; i++) {
-    const p = (platformsArr[i] || '').toString().trim();
-    const u = (urlsArr[i] || '').toString().trim();
-    if (!p || !u) continue;
-    if (!PLATFORMS[p]) continue;
-    if (!/^https?:\/\//i.test(u) && p !== 'email') continue;
-    if (p === 'email' && !/^mailto:|^[^\s@]+@[^\s@]+$/i.test(u)) continue;
-    arr.push({ platform: p, url: u });
-  }
-  return arr.length ? JSON.stringify(arr) : null;
-}
 
 /**
@@ -211,5 +193,4 @@
     accents: ThemeService.listAccents(),
     platforms: listPlatforms(),
-    parsedLinks: [],
     apAliases: '',
     error: null,
@@ -275,8 +256,4 @@
   if (!site) return res.redirect('/admin/sites?error=Not+found');
 
-  let parsedLinks = [];
-  if (site.profile_links) {
-    try { parsedLinks = JSON.parse(site.profile_links) || []; } catch {}
-  }
 
   let apAliases = '';
@@ -293,5 +270,4 @@
     accents: ThemeService.listAccents(),
     platforms: listPlatforms(),
-    parsedLinks,
     apAliases,
     success: req.query.success || null,
@@ -333,5 +309,7 @@
   const feedAlt = ['timeline', 'auto'].includes(f.feed_alt_view) ? f.feed_alt_view : 'reader';
   const feedViewDef = f.feed_view_default === 'grid' ? 'grid' : feedAlt;
-  const profileLinksJson = buildProfileLinks(f);
+  // De profiellinks staan sinds 30-9 bij je profiel (/account). Deze pagina
+  // schrijft ze dus NIET meer: met de velden weg zou elke keer opslaan hier ze
+  // wissen. De kolom blijft van /account/links.
 
   // FEP-7628 aliases — validated/resolved before anything is written.
@@ -366,5 +344,4 @@
       palette = ?, accent = ?, theme_override = ?, profile_photo = ?,
       profile_enabled = ?,
-      profile_links = ?,
       ap_aliases = ?,
       is_public = ?, robots_index = ?, require_login_to_comment = ?,
@@ -386,5 +363,4 @@
     f.profile_photo || null,
     f.profile_enabled ? 1 : 0,
-    profileLinksJson,
     apAliasesJson,
     f.is_public ? 1 : 0,
