Index: src/assets/js/audio-player.js
===================================================================
--- src/assets/js/audio-player.js	(revision 1720482bc8e10937812eea5cdd213db0cc85a347)
+++ src/assets/js/audio-player.js	(revision 5f47671b8c8beb7dbe7dcbfc46d88c69727697ba)
@@ -605,6 +605,8 @@
   expandTrigger.addEventListener('click', () => {
     const t = queue[currentIndex];
-    const isDesktop = window.matchMedia && window.matchMedia('(min-width: 768px)').matches;
-    if (isDesktop && t) {
+    // Alleen op échte desktop (≥1200, geen full-player) springen we naar de post.
+    // Tablet + telefoon hebben een full-player → open die (zoals mobiel).
+    const jumpToPost = !hasFullPlayer();
+    if (jumpToPost && t) {
       // 1) Track speelde vanuit een post → die URL kennen we al.
       if (t.postUrl) { goToPost(t.postUrl, t.id); return; }
Index: src/routes/search.js
===================================================================
--- src/routes/search.js	(revision 1720482bc8e10937812eea5cdd213db0cc85a347)
+++ src/routes/search.js	(revision 5f47671b8c8beb7dbe7dcbfc46d88c69727697ba)
@@ -37,4 +37,20 @@
 function likeArg(q) {
   return '%' + q.replace(/[%_\\]/g, '\\$&') + '%';
+}
+
+// Maak de FTS-snippet leesbaar: shortcodes ([[...]]) en markdown-tekens eruit.
+// De <mark>…</mark>-highlights van FTS blijven staan. Valt terug op de excerpt
+// (geëscaped) als er na het schoonmaken niets leesbaars overblijft.
+function cleanSnippet(html, excerpt) {
+  const esc = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
+  const s = (html || '')
+    .replace(/!\[[^\]]*\]\([^)]*\)/g, ' ')   // markdown-afbeeldingen
+    .replace(/\[\[[^\]]*?\]\]/g, ' ')         // shortcodes (incl. <mark> erin)
+    .replace(/\[\[|\]\]/g, ' ')               // losse haakjes door truncatie
+    .replace(/[#>*_`~]+/g, ' ')               // markdown-opmaaktekens
+    .replace(/\s+/g, ' ')
+    .trim();
+  if (!s || /^[…\s]*$/.test(s)) return esc((excerpt || '').slice(0, 160));
+  return s;
 }
 
@@ -85,4 +101,5 @@
         LIMIT 50
       `).all(ftsQuery, site.id);
+      results = results.map((r) => ({ ...r, snippet: cleanSnippet(r.snippet, r.excerpt) }));
     } catch (err) {
       queryError = err.message;
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 1720482bc8e10937812eea5cdd213db0cc85a347)
+++ src/views/shell.ejs	(revision 5f47671b8c8beb7dbe7dcbfc46d88c69727697ba)
@@ -300,5 +300,5 @@
      ?v=N — cache-buster: bump bij elke audio-player.js wijziging zodat
      Cloudflare (max-age=1y) niet de oude versie blijft serveren. -->
-<script src="/assets/js/audio-player.js?v=19"></script>
+<script src="/assets/js/audio-player.js?v=20"></script>
 <!-- Eigen custom media-embeds (YouTube/SoundCloud/Spotify) via de echte
      player-API's + gedeelde mutual-exclusion registry met de site-speler. -->
