Index: src/assets/css/style.css
===================================================================
--- src/assets/css/style.css	(revision 6dd26e55b97a257fb828412f04951bb77f39914a)
+++ src/assets/css/style.css	(revision 1f640ff1441ede5e292fef99352589aa59918bbd)
@@ -2423,12 +2423,18 @@
 /* Audio tile (Shaer, Robins vraag 30-7): the waveform PNG is white on
    transparent and floats OVER the tile's own hue gradient, so every audio
-   post keeps its color and gets its shape. Contain + padding leaves the
-   centered title readable. */
+   post keeps its color and gets its shape. Wave and title each get their
+   own band (wave upper, title lower): centering both stacked them right
+   through each other (Robins schermafdruk). */
 .grid-tile-img.grid-tile-wave {
     background-color: transparent;
     object-fit: contain;
-    padding: 26% 10%;
+    /* explicit box, not auto: an absolutely positioned img falls back to its
+       intrinsic size when width/height are auto, collapsing the band */
+    top: 8%; left: 8%; right: auto; bottom: auto;
+    width: 84%; height: 46%;
     opacity: .85;
 }
+.grid-tile-audio .grid-tile-title { position: absolute; left: 10%; right: 10%; top: 60%; }
+.grid-tile-audio .grid-tile-gradient-src { position: absolute; left: 10%; right: 10%; top: 76%; }
 /* Cover videos are decorative, not players: let clicks + right-click pass through to the
    tile link so you get the normal link menu (not the browser's <video> menu/controls).
Index: src/routes/activitypub.js
===================================================================
--- src/routes/activitypub.js	(revision 6dd26e55b97a257fb828412f04951bb77f39914a)
+++ src/routes/activitypub.js	(revision 1f640ff1441ede5e292fef99352589aa59918bbd)
@@ -357,5 +357,9 @@
     // audio-tegel op): ffmpeg draws the waveform into <name>.poster.png.
     // White on transparent, so the tile's own gradient stays the backdrop
-    // and every audio post keeps its own hue.
+    // and every audio post keeps its own hue. The shape is bars, not the
+    // raw hairy wave (Robins tweede vraag): peak and average sampled into
+    // 57 columns (soft tip over bright core), blown up nearest-neighbor to
+    // 14px bars, and drawgrid ERASES 5px gaps (c=black@0 + replace=1 writes
+    // transparent pixels; h=2*ih keeps horizontal grid lines out of frame).
     if (mime.startsWith('audio/')) {
       Promise.all([import('child_process'), import('ffmpeg-static')]).then(([{ execFile }, ff]) => {
@@ -363,5 +367,9 @@
         if (!bin) return;
         const poster = req.file.path + '.poster.png';
-        execFile(bin, ['-hide_banner', '-loglevel', 'error', '-y', '-i', req.file.path, '-filter_complex', 'showwavespic=s=800x256:colors=white', '-frames:v', '1', poster],
+        const graph = '[0:a]aformat=channel_layouts=mono,asplit[a][b];'
+          + '[a]showwavespic=s=57x256:colors=white@0.5:filter=peak:scale=sqrt:draw=full[pk];'
+          + '[b]showwavespic=s=57x256:colors=white:filter=average:scale=sqrt:draw=full[av];'
+          + '[pk][av]overlay=format=auto,scale=798:256:flags=neighbor,drawgrid=w=14:h=2*ih:t=5:c=black@0:replace=1';
+        execFile(bin, ['-hide_banner', '-loglevel', 'error', '-y', '-i', req.file.path, '-filter_complex', graph, '-frames:v', '1', poster],
           { timeout: 30000 }, (e) => { if (e && e.code !== 'ENOENT') console.warn('[media] waveform failed:', e.message); });
       }).catch(() => { /* never blocks the upload */ });
Index: src/views/partials/post-tile.ejs
===================================================================
--- src/views/partials/post-tile.ejs	(revision 6dd26e55b97a257fb828412f04951bb77f39914a)
+++ src/views/partials/post-tile.ejs	(revision 1f640ff1441ede5e292fef99352589aa59918bbd)
@@ -43,5 +43,5 @@
 const _ext = !!_external;
 %>
-<a class="grid-tile<%= _showCover ? '' : ' grid-tile-gradient' %><%= (_isPinned || _isBoost) ? ' is-pinned' : '' %><%= post.nsfw ? ' nsfw-media' : '' %>"
+<a class="grid-tile<%= _showCover ? '' : ' grid-tile-gradient' %><%= _cWave ? ' grid-tile-audio' : '' %><%= (_isPinned || _isBoost) ? ' is-pinned' : '' %><%= post.nsfw ? ' nsfw-media' : '' %>"
    href="<%= _href %>"
    style="--tile-hue: <%= _tileHue %>;"
