Index: src/assets/js/mod/playlist-editor.js
===================================================================
--- src/assets/js/mod/playlist-editor.js	(revision b0ccd0d9b11ffb2a364ca71fd3a63aeff057890e)
+++ src/assets/js/mod/playlist-editor.js	(revision 25dd08f3833da4deb81ef7a027a7e4382dbc5181)
@@ -123,4 +123,5 @@
                     <option value="album"    ${initial.kind === 'album' ? 'selected' : ''}>💿 ${T('k_album')}</option>
                     <option value="playlist" ${initial.kind === 'playlist' ? 'selected' : ''}>📃 ${T('k_playlist')}</option>
+                    <option value="mixtape"  ${initial.kind === 'mixtape' ? 'selected' : ''}>📼 ${T('k_mixtape')}</option>
                   </select>
                 </label>
@@ -197,6 +198,9 @@
     // verdwijnen dus als je omschakelt, en de server maakt ze dan ook leeg;
     // dit scherm is de uitleg, niet de bewaking.
+    // ALLEEN een album, en niet "alles behalve playlist". Dat stond er eerst, en
+    // met een derde soort erbij zou een mixtape ineens uitgavevelden tonen die
+    // de server toch weggooit -- een scherm dat iets anders belooft dan het doet.
     const toonUitgave = () => {
-      const album = kindEl.value !== 'playlist';
+      const album = kindEl.value === 'album';
       for (const el of backdrop.querySelectorAll('.pl-uitgave')) el.hidden = !album;
     };
@@ -420,5 +424,9 @@
         year:   parseInt(yearEl.value, 10) || 0,
         cover:  coverEl.value.trim(),
-        kind:   kindEl.value === 'playlist' ? 'playlist' : 'album',
+        // De waarde zelf. Deze regel was `=== 'playlist' ? 'playlist' : 'album'`,
+        // en dat is precies de vorm die een nieuwe soort niet afwijst maar
+        // opslokt: een mixtape werd hier stil een album. De server heeft het
+        // laatste woord via normKind().
+        kind:   kindEl.value,
         release_date:  releaseEl.value.trim(),
         mb_release_id: mbReleaseEl.value.trim(),
Index: src/services/i18n.js
===================================================================
--- src/services/i18n.js	(revision b0ccd0d9b11ffb2a364ca71fd3a63aeff057890e)
+++ src/services/i18n.js	(revision 25dd08f3833da4deb81ef7a027a7e4382dbc5181)
@@ -91,5 +91,5 @@
     'ple.type': 'Type',
     'ple.k_album': 'Album (genummerd)',
-    'ple.k_playlist': 'Playlist (track-covers)',
+    'ple.k_playlist': 'Playlist (track-covers)', 'ple.k_mixtape': 'Mixtape (bandje: alleen vooruit en achteruit)',
     'ple.uitgave': 'Uitgavedatum',
     'ple.mb_release': 'MusicBrainz release-id',
@@ -475,5 +475,5 @@
     'apl.none_sub': 'Maak er een via de knop hierboven, of via de 📃 knop in de post-editor.',
     'apl.pill_playlist': 'playlist',
-    'apl.pill_album': 'album',
+    'apl.pill_album': 'album', 'apl.pill_mixtape': 'mixtape',
     'apl.track': 'track',
     'apl.tracks': 'tracks',
@@ -1106,5 +1106,5 @@
     'ple.type': 'Type',
     'ple.k_album': 'Album (numbered)',
-    'ple.k_playlist': 'Playlist (track covers)',
+    'ple.k_playlist': 'Playlist (track covers)', 'ple.k_mixtape': 'Mixtape (a tape: forwards and back only)',
     'ple.uitgave': 'Release date',
     'ple.mb_release': 'MusicBrainz release ID',
@@ -1485,5 +1485,5 @@
     'apl.none_sub': 'Create one with the button above, or via the 📃 button in the post editor.',
     'apl.pill_playlist': 'playlist',
-    'apl.pill_album': 'album',
+    'apl.pill_album': 'album', 'apl.pill_mixtape': 'mixtape',
     'apl.track': 'track',
     'apl.tracks': 'tracks',
@@ -2115,5 +2115,5 @@
     'ple.type': 'Typ',
     'ple.k_album': 'Album (nummeriert)',
-    'ple.k_playlist': 'Playlist (Titelbilder)',
+    'ple.k_playlist': 'Playlist (Titelbilder)', 'ple.k_mixtape': 'Mixtape (Kassette: nur vor und zurück)',
     'ple.uitgave': 'Veröffentlichungsdatum',
     'ple.mb_release': 'MusicBrainz-Release-ID',
@@ -2494,5 +2494,5 @@
     'apl.none_sub': 'Erstelle eine über die Schaltfläche oben oder über die 📃-Schaltfläche im Beitrags-Editor.',
     'apl.pill_playlist': 'Playlist',
-    'apl.pill_album': 'Album',
+    'apl.pill_album': 'Album', 'apl.pill_mixtape': 'Mixtape',
     'apl.track': 'Track',
     'apl.tracks': 'Tracks',
Index: src/views/pages/admin-playlists.ejs
===================================================================
--- src/views/pages/admin-playlists.ejs	(revision b0ccd0d9b11ffb2a364ca71fd3a63aeff057890e)
+++ src/views/pages/admin-playlists.ejs	(revision 25dd08f3833da4deb81ef7a027a7e4382dbc5181)
@@ -42,4 +42,9 @@
       var _aplPlaylist = t('apl.pill_playlist');
       var _aplAlbum    = t('apl.pill_album');
+      var _aplMixtape  = t('apl.pill_mixtape');
+      // Een soort met een eigen teken en een eigen woord. De ternair die hier
+      // stond kende er maar twee, en toonde een mixtape dus als album.
+      var _aplTeken = { album: '💿', playlist: '📃', mixtape: '📼' };
+      var _aplWoord = { album: _aplAlbum, playlist: _aplPlaylist, mixtape: _aplMixtape };
       var _aplTrack    = t('apl.track');
       var _aplTracks   = t('apl.tracks');
@@ -52,5 +57,5 @@
         <li class="ax-track" data-id="<%= p.id %>">
           <div class="ax-track-cover" <%- p.cover ? `style="background-image:url('${p.cover}'); background-size:cover; background-position:center"` : '' %>>
-            <% if (!p.cover) { %><span><%= p.kind === 'playlist' ? '📃' : '💿' %></span><% } %>
+            <% if (!p.cover) { %><span><%= _aplTeken[p.kind] || _aplTeken.album %></span><% } %>
           </div>
 
@@ -58,5 +63,5 @@
             <div class="ax-track-title">
               <%= p.title %>
-              <span class="ax-pill"><%= p.kind === 'playlist' ? '📃 ' + _aplPlaylist : '💿 ' + _aplAlbum %></span>
+              <span class="ax-pill"><%= (_aplTeken[p.kind] || _aplTeken.album) + ' ' + (_aplWoord[p.kind] || _aplAlbum) %></span>
             </div>
             <div class="ax-track-sub">
Index: src/views/partials/playlist-editor.ejs
===================================================================
--- src/views/partials/playlist-editor.ejs	(revision b0ccd0d9b11ffb2a364ca71fd3a63aeff057890e)
+++ src/views/partials/playlist-editor.ejs	(revision 25dd08f3833da4deb81ef7a027a7e4382dbc5181)
@@ -297,5 +297,5 @@
 <script type="application/json" data-playlist-editor-i18n><%- JSON.stringify({
   titel: t('ple.titel'), artiest: t('ple.artiest'), jaar: t('ple.jaar'), type: t('ple.type'),
-  k_album: t('ple.k_album'), k_playlist: t('ple.k_playlist'),
+  k_album: t('ple.k_album'), k_playlist: t('ple.k_playlist'), k_mixtape: t('ple.k_mixtape'),
   uitgave: t('ple.uitgave'), mb_release: t('ple.mb_release'),
   cover: t('ple.cover'), cover_kies: t('ple.cover_kies'), cover_url: t('ple.cover_url'),
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision b0ccd0d9b11ffb2a364ca71fd3a63aeff057890e)
+++ src/views/shell.ejs	(revision 25dd08f3833da4deb81ef7a027a7e4382dbc5181)
@@ -505,5 +505,5 @@
   // Eén nummer voor de hele map. Te vaak bumpen kost één download; te weinig
   // bumpen kost een bugfix die nooit aankomt.
-  var MOD_V = 49;
+  var MOD_V = 50;
 
   // name -> 1 (aan het laden) of de module-namespace (geladen). Een module
