Index: src/routes/admin-settings.js
===================================================================
--- src/routes/admin-settings.js	(revision 34875673eb7989a5ab1986334ece32f689bab211)
+++ src/routes/admin-settings.js	(revision 2dd1dc40db2f7dab2c095eeb309e5aaa02369b4b)
@@ -16,5 +16,4 @@
 import path from 'path';
 import fs from 'fs';
-import { fileURLToPath } from 'url';
 import multer from 'multer';
 import { v4 as uuid } from 'uuid';
@@ -26,4 +25,5 @@
 import { entitlementStatus, premiumUnlocked } from '../services/PatreonService.js';
 import { toWebp } from '../services/ImageWebpService.js';
+import { mediaDir } from '../config/paths.js';
 
 const router = express.Router();
@@ -36,10 +36,7 @@
 }
 
-const __dirname = path.dirname(fileURLToPath(import.meta.url));
 // Hero uploads land in storage/media/hero → accessible as /media/hero/<file>
 // (the /media static handler serves storage/media). Same model as avatars.
-const HERO_DIR = path.resolve(
-  process.env.HERO_PATH || path.join(__dirname, '..', '..', 'storage', 'media', 'hero')
-);
+const HERO_DIR = mediaDir('HERO_PATH', 'hero');
 fs.mkdirSync(HERO_DIR, { recursive: true });
 
