Index: src/views/pages/ward.ejs
===================================================================
--- src/views/pages/ward.ejs	(revision 5412cbbcf42cb02fb3fb6d67ef433290c95bb38c)
+++ src/views/pages/ward.ejs	(revision 2086ea255ae8ea5a474fc805eda10bd71146c947)
@@ -30,5 +30,8 @@
 
     <section id="feed">
-      <h2><%= state.strings.feed %></h2>
+      <div class="feed-head">
+        <h2><%= state.strings.feed %></h2>
+        <button id="compose-open" type="button" class="primary"><%= state.strings.write %></button>
+      </div>
       <div class="cards" id="card-list"></div>
       <p class="empty" id="feed-empty" hidden><%= state.strings.feedEmpty %></p>
@@ -51,4 +54,33 @@
     </section>
   </main>
+
+  <!-- De composer: schrijven met foto, geluid of video. De posttypes
+       dicteren hoe de widget eruitziet (Robins wens), maar de kern is een
+       tekstvak plus tot vier media; de server maakt de rest af (poster,
+       waveform) zoals bij de app. -->
+  <dialog id="compose-dialog">
+    <div class="compose-head">
+      <button id="compose-cancel" type="button" aria-label="<%= state.strings.cancel %>">✕</button>
+      <select id="compose-vis" aria-label="<%= state.strings.visibility %>">
+        <option value="friends"><%= state.strings.visFriends %></option>
+        <option value="public"><%= state.strings.visPublic %></option>
+      </select>
+      <button id="compose-send" type="button" class="primary"><%= state.strings.post %></button>
+    </div>
+    <textarea id="compose-text" rows="4" maxlength="5000" placeholder="<%= state.strings.writeHere %>"></textarea>
+    <div id="compose-media" class="compose-media"></div>
+    <div class="compose-tools">
+      <label class="tool" title="<%= state.strings.addPhoto %>">
+        📷<input type="file" accept="image/*" hidden data-kind="image">
+      </label>
+      <label class="tool" title="<%= state.strings.addAudio %>">
+        🎤<input type="file" accept="audio/*" hidden data-kind="audio">
+      </label>
+      <label class="tool" title="<%= state.strings.addVideo %>">
+        🎬<input type="file" accept="video/*" hidden data-kind="video">
+      </label>
+      <span id="compose-status" class="hint"></span>
+    </div>
+  </dialog>
 
   <!-- De reddingsboei zweeft boven de pagina en is sleepbaar, net als in
