Index: src/config/features.js
===================================================================
--- src/config/features.js	(revision cb01666b8ba6e2c17dcfd2f48eaf0a16fb172129)
+++ src/config/features.js	(revision cb01666b8ba6e2c17dcfd2f48eaf0a16fb172129)
@@ -0,0 +1,12 @@
+// Feature-flags (boot-tijd, via env).
+//
+// Lite-modus: zet KLONKT_AUDIO=off in .env om de HELE audio-feature uit te
+// schakelen — geen audio-/playlist-/download-/embed-routes, geen ffmpeg-aanroep,
+// geen speler en geen [[track]]/[[playlist]]-shortcodes. Zo draait Klonkt als
+// lichte blog/foto/EPK-site op een omgeving zónder ffmpeg/exec. Hub én Cirkels
+// blijven gewoon werken (die hangen niet van audio af).
+//
+// Default = aan (volledige versie). Alleen de letterlijke waarde 'off' schakelt uit.
+export function audioEnabled() {
+  return String(process.env.KLONKT_AUDIO ?? 'on').toLowerCase() !== 'off';
+}
Index: src/middleware/render.js
===================================================================
--- src/middleware/render.js	(revision 8f2f97ce2ca4540506ee22910e99a093826a9555)
+++ src/middleware/render.js	(revision cb01666b8ba6e2c17dcfd2f48eaf0a16fb172129)
@@ -20,4 +20,5 @@
 import { isPremium as isPremiumInstance, premiumEnabled, premiumUnlocked } from '../services/PatreonService.js';
 import { unreadCount as notifUnreadCount } from '../services/NotificationService.js';
+import { audioEnabled as audioFeatureEnabled } from '../config/features.js';
 import { PLATFORMS as PLATFORMS_CATALOG } from '../services/PlatformIcons.js';
 import { t as i18nT, resolveLang, SUPPORTED as LANGS, LANG_NAMES } from '../services/i18n.js';
@@ -111,4 +112,5 @@
     siteOwnerAvatar,
     site: _site,
+    audioEnabled: audioFeatureEnabled(),
     audioTracks: data.audioTracks || res.locals.audioTracks || [],
     siteUrlBase: res.locals.siteUrlBase || '',
Index: src/middleware/site.js
===================================================================
--- src/middleware/site.js	(revision 8f2f97ce2ca4540506ee22910e99a093826a9555)
+++ src/middleware/site.js	(revision cb01666b8ba6e2c17dcfd2f48eaf0a16fb172129)
@@ -12,4 +12,5 @@
 import { getTenancy } from '../services/SettingsService.js';
 import { audioUrl } from '../services/AudioStreamService.js';
+import { audioEnabled } from '../config/features.js';
 
 /**
@@ -70,4 +71,5 @@
  */
 export function loadAudioTracks(req, res, next) {
+  if (!audioEnabled()) { res.locals.audioTracks = []; return next(); }   // lite-modus
   const site = res.locals.site;
   if (!site || site.enable_audio_player === 0) {
Index: src/routes/posts.js
===================================================================
--- src/routes/posts.js	(revision 8f2f97ce2ca4540506ee22910e99a093826a9555)
+++ src/routes/posts.js	(revision cb01666b8ba6e2c17dcfd2f48eaf0a16fb172129)
@@ -16,4 +16,5 @@
 import AudioEmbedService from '../services/AudioEmbedService.js';
 import PlaylistService from '../services/PlaylistService.js';
+import { audioEnabled } from '../config/features.js';
 import { audioUrl } from '../services/AudioStreamService.js';
 import { toWebp } from '../services/ImageWebpService.js';
@@ -538,4 +539,5 @@
   //   stored HTML → autoembed → [[track]]/[[album]]/[[playlist]] → response
   let html = post.content || '';
+  if (audioEnabled()) {
   if (site.enable_audio_player !== 0) {
     html = AudioEmbedService.autoembed(html);
@@ -622,4 +624,13 @@
     }
   }
+  } else {
+    // LITE-modus (KLONKT_AUDIO=off): geen eigen audio (geen ffmpeg/stream-route).
+    // Externe embeds (YouTube/SoundCloud/Spotify) blijven wel; de eigen-audio-
+    // shortcodes ([[track]]/[[album]]/[[playlist]]) verwijderen we netjes.
+    html = AudioEmbedService.autoembed(html);
+    html = AudioEmbedService.embedMediaShortcodes(html);
+    html = AudioEmbedService.embedExternalLinkShortcodes(html);
+    html = html.replace(/\[\[(track|album|playlist):[^\]]+\]\]/gi, '');
+  }
   post.content_html = html;
 
Index: src/server.js
===================================================================
--- src/server.js	(revision 8f2f97ce2ca4540506ee22910e99a093826a9555)
+++ src/server.js	(revision cb01666b8ba6e2c17dcfd2f48eaf0a16fb172129)
@@ -22,4 +22,5 @@
 import { isViewer } from './middleware/auth.js';
 import { renderPage } from './middleware/render.js';
+import { audioEnabled } from './config/features.js';
 import authRoutes from './routes/auth.js';
 import accountRoutes from './routes/account.js';
@@ -251,6 +252,8 @@
 app.use('/account', accountRoutes);
 app.use('/notifications', notificationsRoutes);
-app.use('/admin/audio', adminAudioRoutes);
-app.use('/admin/playlists', adminPlaylistsRoutes);
+if (audioEnabled()) {
+  app.use('/admin/audio', adminAudioRoutes);
+  app.use('/admin/playlists', adminPlaylistsRoutes);
+}
 app.use('/admin/sites', adminSitesRoutes);
 app.use('/admin/users', adminUsersRoutes);
@@ -266,5 +269,5 @@
 app.use('/admin/epk', adminEpkRoutes);
 app.use('/admin', adminRoutes);
-app.use('/audio', audioRoutes);
+if (audioEnabled()) app.use('/audio', audioRoutes);
 app.use('/search', searchRoutes);
 app.use('/comments', commentsRoutes);
@@ -280,7 +283,7 @@
 app.use('/', epkRoutes); // /pers perskit (premium; niet-premium: next() -> 404)
 app.use('/', newsletterRoutes); // /nieuwsbrief in/uitschrijven (premium; niet-premium: next())
-app.use('/', downloadRoutes); // /downloads + /download/:id download-voor-email (premium)
+if (audioEnabled()) app.use('/', downloadRoutes); // /downloads + /download/:id (audio; lite: uit)
 app.use('/', linkbioRoutes); // /links link-in-bio + klikstats (premium)
-app.use('/', embedRoutes); // /embed inbedbare audiospeler (premium)
+if (audioEnabled()) app.use('/', embedRoutes); // /embed inbedbare audiospeler (audio; lite: uit)
 app.use('/', showsRoutes); // /shows agenda + notify-me (premium)
 app.use('/', changelogRoutes); // /changelog publieke release-/wijzigingen-pagina
Index: src/views/pages/admin-site-edit.ejs
===================================================================
--- src/views/pages/admin-site-edit.ejs	(revision 8f2f97ce2ca4540506ee22910e99a093826a9555)
+++ src/views/pages/admin-site-edit.ejs	(revision cb01666b8ba6e2c17dcfd2f48eaf0a16fb172129)
@@ -159,8 +159,10 @@
         </select>
       </label>
+      <% if (typeof audioEnabled === 'undefined' || audioEnabled) { %>
       <label class="cb">
         <input type="checkbox" name="enable_audio_player" value="1" <%= site.enable_audio_player ? 'checked' : '' %>>
         <span><%= t('asite.enable_audio') %></span>
       </label>
+      <% } %>
     </fieldset>
 
Index: src/views/pages/admin.ejs
===================================================================
--- src/views/pages/admin.ejs	(revision 8f2f97ce2ca4540506ee22910e99a093826a9555)
+++ src/views/pages/admin.ejs	(revision cb01666b8ba6e2c17dcfd2f48eaf0a16fb172129)
@@ -11,6 +11,8 @@
       <a href="/admin/sites" class="btn"><%= t('admin.b_sites') %></a>
       <a href="/admin/users" class="btn"><%= t('admin.b_users') %></a>
+      <% if (typeof audioEnabled === 'undefined' || audioEnabled) { %>
       <a href="/admin/audio" class="btn"><%= t('admin.b_audio') %></a>
       <a href="/admin/playlists" class="btn"><%= t('admin.b_playlists') %></a>
+      <% } %>
       <a href="/admin/comments" class="btn"><%= t('admin.b_comments') %></a>
       <% if (primarySite) { %><a href="/admin/seo" class="btn"><%= t('admin.b_seo') %></a><% } %>
@@ -18,5 +20,7 @@
     <% } else { %>
       <a href="/posts/new" class="btn"><%= t('admin.b_newpost') %></a>
+      <% if (typeof audioEnabled === 'undefined' || audioEnabled) { %>
       <a href="/admin/audio" class="btn"><%= t('admin.b_audio') %></a>
+      <% } %>
       <a href="/admin/comments" class="btn"><%= t('admin.b_comments') %></a>
       <% if (primarySite) { %>
Index: src/views/partials/profile-header.ejs
===================================================================
--- src/views/partials/profile-header.ejs	(revision 8f2f97ce2ca4540506ee22910e99a093826a9555)
+++ src/views/partials/profile-header.ejs	(revision cb01666b8ba6e2c17dcfd2f48eaf0a16fb172129)
@@ -41,5 +41,5 @@
       <% } else if (typeof siteOwnerAvatar !== 'undefined' && siteOwnerAvatar) { %>
         <img src="<%= siteOwnerAvatar %>" alt="">
-      <% } else if (site.enable_audio_player) { %>
+      <% } else if (site.enable_audio_player && (typeof audioEnabled === 'undefined' || audioEnabled)) { %>
         <span class="profile-photo-fallback profile-photo-fallback--music" aria-hidden="true">
           <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
