Index: src/views/pages/post.ejs
===================================================================
--- src/views/pages/post.ejs	(revision 28bf7f0bdd406f40398565567e14a085ed778279)
+++ src/views/pages/post.ejs	(revision ecbfa417315102faa2b0b25640f48006f7b172c7)
@@ -56,4 +56,9 @@
     </div>
   <% } %>
+
+  <div class="post-share" style="margin:1.25rem 0;display:flex;align-items:center;gap:.6rem;flex-wrap:wrap">
+    <button type="button" class="btn post-share-btn" data-share data-share-title="<%= post.title %>">🔗 <%= t('post.share') %></button>
+    <span class="post-share-feedback" id="post-share-feedback" style="color:var(--accent);font-size:.85rem" hidden><%= t('post.share_copied') %></span>
+  </div>
 
   <!-- Inline admin actions: only visible if user has permission -->
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision 28bf7f0bdd406f40398565567e14a085ed778279)
+++ src/views/shell.ejs	(revision ecbfa417315102faa2b0b25640f48006f7b172c7)
@@ -807,8 +807,19 @@
   // Misc click helpers (select-all in a field, history-back button).
   document.addEventListener('click', function (e) {
-    var el = e.target.closest && e.target.closest('[data-selectall],[data-back]');
+    var el = e.target.closest && e.target.closest('[data-selectall],[data-back],[data-share]');
     if (!el) return;
     if (el.dataset.selectall !== undefined && el.select) el.select();
     if (el.dataset.back !== undefined) { e.preventDefault(); history.back(); }
+    if (el.dataset.share !== undefined) {
+      e.preventDefault();
+      var url = location.href, title = el.dataset.shareTitle || document.title;
+      if (navigator.share) { navigator.share({ title: title, url: url }).catch(function () {}); }
+      else if (navigator.clipboard && navigator.clipboard.writeText) {
+        navigator.clipboard.writeText(url).then(function () {
+          var fb = document.getElementById('post-share-feedback');
+          if (fb) { fb.hidden = false; setTimeout(function () { fb.hidden = true; }, 2000); }
+        }).catch(function () { window.prompt('Copy link:', url); });
+      } else { window.prompt('Copy link:', url); }
+    }
   });
   // Image fallback (the error event doesn't bubble → capture phase).
