Index: src/server.js
===================================================================
--- src/server.js	(revision f6b2c684c90dcd944223b0b83aeb85ee4c2d42da)
+++ src/server.js	(revision 9327a858cd7930e9e11b21370b9c2b00ac96a3c2)
@@ -395,5 +395,5 @@
   res.set('Cache-Control', 'no-cache');
   res.send(`
-const CACHE_VERSION = 'pcms-v14-' + new Date().toISOString().split('T')[0];
+const CACHE_VERSION = 'pcms-v15-' + new Date().toISOString().split('T')[0];
 self.addEventListener('install', e => {
   e.waitUntil(caches.open(CACHE_VERSION).then(c => c.addAll(['/'])));
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision f6b2c684c90dcd944223b0b83aeb85ee4c2d42da)
+++ src/views/shell.ejs	(revision 9327a858cd7930e9e11b21370b9c2b00ac96a3c2)
@@ -220,5 +220,11 @@
     p.remove();
     var i = rawEnv;
-    if (i < 20 && Math.max(screen.width, screen.height) >= 812) i = standalone ? 59 : 47;
+    if (i < 20 && Math.max(screen.width, screen.height) >= 812) {
+      // Portrait: the island sits at the TOP → full inset (UNCHANGED: standalone?59:47).
+      // Landscape: the island moves to the SIDE, so the top inset is ~0 → no top padding
+      // (only the masthead's own base padding remains). env() can't tell us (returns 0),
+      // so we key off orientation directly.
+      i = (window.innerWidth > window.innerHeight) ? 0 : (standalone ? 59 : 47);
+    }
     document.documentElement.style.setProperty('--ios-safe-top', i + 'px');
     var mh = document.querySelector('.masthead');
