Index: src/services/music/index.js
===================================================================
--- src/services/music/index.js	(revision 0677bace4cb40bd7d08fdea74f3cb74c579b6229)
+++ src/services/music/index.js	(revision d60c4987ede7cf7153f26e47e9178acea6dd38de)
@@ -420,4 +420,8 @@
     .replace(/&nbsp;/gi, ' ')
     .replace(/&[a-z#0-9]+;/gi, ' ')
+    // Losse hashtags gaan eruit: die staan al in `tag`, en een description die
+    // de tagwolk herhaalt is ruis. Live leverde dit "#DoenweNiet #DoenWeNiet
+    // #devs" op als omschrijving van een post die verder geen tekst heeft.
+    .replace(/(^|\s)#[\p{L}\p{M}\p{N}_]+/gu, ' ')
     .replace(/\s+/g, ' ')
     .trim();
Index: test/music-uitgave.test.js
===================================================================
--- test/music-uitgave.test.js	(revision 0677bace4cb40bd7d08fdea74f3cb74c579b6229)
+++ test/music-uitgave.test.js	(revision d60c4987ede7cf7153f26e47e9178acea6dd38de)
@@ -177,2 +177,21 @@
   assert.equal(col.content, undefined, 'een leeg veld is slechter dan geen veld');
 });
+
+test('losse hashtags horen niet in de omschrijving -- die staan al in tag', () => {
+  // Live leverde dit "#DoenweNiet #DoenWeNiet #devs" op als omschrijving van
+  // een post die verder geen tekst heeft. Een description die de tagwolk
+  // herhaalt is ruis.
+  const p = maakPost({
+    id: 'p-tags', slug: 'alleen-tags', titel: 'Alleen tags',
+    content: '[[track:t-een]]<div>#lofi #zolder</div>',
+  });
+  assert.equal(M.buildPostTrackCollection(BASE, site, p).content, undefined);
+});
+
+test('maar tekst MET een hashtag erin blijft gewoon staan', () => {
+  const p = maakPost({
+    id: 'p-mix', slug: 'tekst-en-tags', titel: 'Tekst en tags',
+    content: '<p>Opgenomen in de schuur.</p>[[track:t-twee]]<div>#lofi</div>',
+  });
+  assert.equal(M.buildPostTrackCollection(BASE, site, p).content, 'Opgenomen in de schuur.');
+});
