Index: src/views/pages/authorize-interaction.ejs
===================================================================
--- src/views/pages/authorize-interaction.ejs	(revision feced2ce628d8bee7974f77404806f4be6f2272b)
+++ src/views/pages/authorize-interaction.ejs	(revision 5190152c90d2d397b7f87f9c900eae8d8c1e2856)
@@ -41,8 +41,16 @@
               </form>
             </div>
-            <form method="post" action="/fediverse/<%= m.id %>/edit" class="fedi-edit-form">
-              <textarea name="text" rows="3" maxlength="2000" class="fedi-edit-ta"><%= m.editable %></textarea>
-              <div class="fedi-edit-actions"><button type="submit" class="fedi-edit-save"><%= t('fedi.save_edit') %></button></div>
-            </form>
+            <div class="fedi-edit-form">
+              <%- include('../partials/reply-editor', {
+                action: '/fediverse/' + m.id + '/edit',
+                placeholder: t('fedi.reply_ph'),
+                submitLabel: t('fedi.save_edit'),
+                rows: 3,
+                initialHtml: m.content,
+                initialText: m.editable,
+                defaultLang: m.language,
+                noAttach: true,
+              }) %>
+            </div>
           </li>
         <% }); %>
@@ -59,5 +67,5 @@
           b.classList.toggle('is-open', open);
           b.setAttribute('aria-expanded', open ? 'true' : 'false');
-          if (open) { var ta = form.querySelector('textarea'); if (ta) ta.focus(); }
+          if (open) { var ed = form.querySelector('.re-editor') || form.querySelector('textarea'); if (ed) ed.focus(); }
         });
       })();
Index: src/views/pages/messages.ejs
===================================================================
--- src/views/pages/messages.ejs	(revision feced2ce628d8bee7974f77404806f4be6f2272b)
+++ src/views/pages/messages.ejs	(revision 5190152c90d2d397b7f87f9c900eae8d8c1e2856)
@@ -78,8 +78,16 @@
                 <details class="msg-edit">
                   <summary><%= t('fedi.edit') %></summary>
-                  <form method="post" action="/fediverse/<%= n.outboxId %>/edit" class="msg-edit-form">
-                    <textarea name="text" rows="2" required><%= n.editable %></textarea>
-                    <button type="submit" class="btn"><%= t('fedi.save_edit') %></button>
-                  </form>
+                  <div class="msg-edit-form">
+                    <%- include('../partials/reply-editor', {
+                      action: '/fediverse/' + n.outboxId + '/edit',
+                      placeholder: t('fedi.reply_ph'),
+                      submitLabel: t('fedi.save_edit'),
+                      rows: 2,
+                      initialHtml: n.content,
+                      initialText: n.editable,
+                      defaultLang: n.language,
+                      noAttach: true,
+                    }) %>
+                  </div>
                 </details>
                 <form method="post" action="/fediverse/<%= n.outboxId %>/delete" data-confirm="<%= t('fedi.delete_confirm') %>">
Index: src/views/partials/reply-editor.ejs
===================================================================
--- src/views/partials/reply-editor.ejs	(revision feced2ce628d8bee7974f77404806f4be6f2272b)
+++ src/views/partials/reply-editor.ejs	(revision 5190152c90d2d397b7f87f9c900eae8d8c1e2856)
@@ -16,5 +16,11 @@
     rows          textarea rows for the no-JS fallback (default 3)
     defaultLang   preselected reply language (default: UI lang)
+    initialHtml   prefill for EDIT mode (our own sanitized HTML) (optional)
+    initialText   plain-text prefill for the no-JS textarea (optional)
+    noAttach      true hides the media button (edits do not touch attachments)
 %>
+<% var _reInitHtml = (typeof initialHtml !== 'undefined' && initialHtml) || ''; %>
+<% var _reInitText = (typeof initialText !== 'undefined' && initialText) || ''; %>
+<% var _reNoAttach = (typeof noAttach !== 'undefined' && noAttach); %>
 <% var _reLang = (typeof defaultLang !== 'undefined' && defaultLang) || (typeof lang !== 'undefined' ? lang : 'en'); %>
 <form method="post" action="<%= action %>" class="re-form" data-re
@@ -36,12 +42,16 @@
     <button type="button" data-cmd="list" title="<%= t('re.list') %>" aria-label="<%= t('re.list') %>">•≡</button>
     <button type="button" data-cmd="quote" title="<%= t('re.quote') %>" aria-label="<%= t('re.quote') %>">❝</button>
-    <button type="button" data-cmd="attach" title="<%= t('re.attach') %>" aria-label="<%= t('re.attach') %>">📎</button>
-    <input type="file" class="re-file" accept="image/*,audio/*,video/*" multiple hidden>
+    <% if (!_reNoAttach) { %>
+      <button type="button" data-cmd="attach" title="<%= t('re.attach') %>" aria-label="<%= t('re.attach') %>">📎</button>
+      <input type="file" class="re-file" accept="image/*,audio/*,video/*" multiple hidden>
+    <% } %>
   </div>
-  <input type="hidden" name="attachments" value="">
-  <div class="re-attachments" hidden></div>
-  <textarea name="text" rows="<%= typeof rows !== 'undefined' ? rows : 3 %>" required placeholder="<%= placeholder %>"></textarea>
+  <% if (!_reNoAttach) { %>
+    <input type="hidden" name="attachments" value="">
+    <div class="re-attachments" hidden></div>
+  <% } %>
+  <textarea name="text" rows="<%= typeof rows !== 'undefined' ? rows : 3 %>" required placeholder="<%= placeholder %>"><%= _reInitText %></textarea>
   <div class="re-editor" contenteditable="true" role="textbox" aria-multiline="true"
-       data-ph="<%= placeholder %>" aria-label="<%= placeholder %>" hidden></div>
+       data-ph="<%= placeholder %>" aria-label="<%= placeholder %>" hidden><%- _reInitHtml %></div>
   <div class="re-foot">
     <select name="language" class="re-lang" aria-label="<%= t('re.lang') %>" hidden>
