{"id":"6a34820b5abb57537db5e11a","title":"2026 06 19","path":"how-to/committee/release-notes/2026-06-19","contentMarkdown":"# 19-Jun-2026 —  Inbox & membership-run follow-ups from committee testing (June 2026) [#293](https://github.com/nbarrett/ngx-ramblers/issues/293)\n\n## [build 705](https://github.com/nbarrett/ngx-ramblers/actions/runs/27795528715) — [commit a3f5247](https://github.com/nbarrett/ngx-ramblers/commit/a3f52479ac2b0d41a347b38f57da5148fa3e18eb)\n\n_____\n\nFollow-ups from committee testing of the new inbox: the two inbox bugs EKWG committee (early testers) hit (read state shared by everyone, role filter showing \"no messages\"),\nthe gap where members who can't be emailed were never deleted, a click-\nheavy composer, several email-client conveniences for the inbox, and a fix\nfor broken welcome-email images.\n\n## What's new\n\nSee https://github.com/nbarrett/ngx-ramblers/issues/293\n\n- Marking a conversation read no longer marks it read for everyone -\nread/unread is tracked per committee member.\n- Role filters (Membership, Walks, etc.) now show messages sent from a\ncommittee member's own identity, not only messages addressed to the role,\nso a \"no messages\" view that should have had mail now shows it.\n- The expiry run now includes members who cannot be emailed (no address, or\nblocked in Brevo) so they are removed in the same pass instead of being\nleft in the database; they appear tagged \"not emailable\".\n- Email types can skip the Compose and Events steps when they are not needed\n(e.g. the welcome email), so a routine run has fewer steps.\n- Inbox keyboard navigation: Up/Down arrows move between conversations and\nDelete removes the highlighted one, like a normal email client.\n- A funnel toggle filters the conversation list to unread only, and the\nfilter is kept in the URL so it survives reload and can be shared.\n- Landing on a mailbox no longer marks the first conversation read\n- it is\npreviewed only, and marked read when you click it, arrow onto it, or land\non it after a delete.\n- The unread-count badge tooltip lists one role per line with no wrapping.\n- Welcome-email images that were rendering broken now display correctly.\n\n## At a glance\n\n| Area | Before | Now |\n| --- | --- | --- |\n| Marking read | Cleared unread for everyone | Per committee member |\n| Role filter | Only mail addressed to the role | Also mail sent from the member's identity |\n| Expiry run, un-emailable members | Skipped, left in the database | Included, tagged \"not emailable\", deleted in the same pass |\n| Composer steps | Always six steps | Compose/Events skippable per email type |\n| Thread list | Mouse only | Arrow keys to move, Delete to delete |\n| Read filter | None | Funnel toggle for unread only |\n| Opening a mailbox | First conversation auto-marked read | Previewed only; read on user action |\n| Welcome-email images | Broken (editing host baked into the URL) | Relative paths, render correctly |\n\n## Where to find it\n\n- Admin -> Email inbox: per-member read state, the role/identity filter, the\nunread funnel toggle, arrow-key navigation, Delete to remove, and the\nbadge tooltip in the top bar.\n- Email composer: un-emailable members shown in the recipient list, and the\nsteps that disappear for fixed-content email types.\n- System Settings -> Mail -> notification template editor: the \"Skip the\nCompose step\" and \"Skip the Events step\" toggles per email type.\n\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/ae5010a9-877b-493b-bf66-2396c22f12b3.jpeg)\n\n_Above: how the inbox looks when you first visit it_\n\n## How it behaves\n\n- Read state: a thread is unread for a member until that member opens it.\nMarking read/unread, the unread counts and the badge are all per member;\nnew inbound mail resets a thread to unread for everyone.\n- Role filter: each role resolves to a set of identity emails (the role\naddress, its forward targets and the assigned member's own email), and a\nmessage is attributed to that role when any of From/To/Cc matches. This\nfixes sent mail (welcome/expiry) that previously only landed in the\nall-accessible mailbox.\n- Un-emailable members: in the missing-from-bulk-load flow they are included\nand auto-selected, shown under the existing \"no email address\" / \"blocked\"\ngroupings, skipped for the actual send, and fed into the bulk-delete\npost-send action. Each selected recipient chip shows its grouping status\n(e.g. \"no email address\") alongside the last-bulk-load detail, and the send\nprogress lists them as \"not emailable\" with the reason and the deletion note.\n- Composer steps: a notification config can skip Compose and Events; the\nstepper hides them and no longer requires them.\n- Keyboard: with the thread list focused, Up/Down open the next/previous\nconversation and scroll it into view; Delete/Backspace removes the\nhighlighted conversation and selects the next. Arrows do nothing while\ntyping in the reply editor or search box.\n- Unread filter: one click shows unread only, click again for all.\n- Opening a mailbox: the first conversation opens as a preview without being\nmarked read.\n- Welcome-email images: stored as relative paths and made absolute against\nthe site host only when the email is sent.\n\n## Why it is restricted\n\n- The composer always keeps Sender & Template, Recipients, Review and Send,\nin that order with Send last; only Compose and Events can ever be skipped,\nso a sender always chooses the email type and the recipients before Send.\n- Un-emailable members are only deleted where the email type carries the\nbulk-delete action (the expiry run). On the warning run they appear tagged\nbut are not deleted.\n\n## How to try it out\n\n1. Admin -> Email inbox: open a conversation as one member, then check it is\nstill unread for another member. Use the funnel to show unread only.\n2. Click into the list and use Up/Down to move between conversations and\nDelete to remove one. Land on the mailbox fresh and confirm the first\nconversation is previewed but stays unread until you act on it.\n3. Select the Membership role filter and confirm sent membership mail now\nappears (run \"rescan general\" once to re-bucket existing threads).\n4. In the composer, choose the missing-from-bulk-load email type and confirm\nno-email and blocked members are included and tagged. Tick \"Skip the\nCompose step\" / \"Skip the Events step\" on the welcome type in the\nnotification template editor and confirm those steps disappear.\n\n## Technical changes\n\nUser-facing behaviour is above; the implementation details follow.","contentHtml":"<h1>19-Jun-2026 —  Inbox &amp; membership-run follow-ups from committee testing (June 2026) <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/293\">#293</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/27795528715\">build 705</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/a3f52479ac2b0d41a347b38f57da5148fa3e18eb\">commit a3f5247</a></h2>\n<hr>\n<p>Follow-ups from committee testing of the new inbox: the two inbox bugs EKWG committee (early testers) hit (read state shared by everyone, role filter showing &quot;no messages&quot;),\nthe gap where members who can&#39;t be emailed were never deleted, a click-\nheavy composer, several email-client conveniences for the inbox, and a fix\nfor broken welcome-email images.</p>\n<h2>What&#39;s new</h2>\n<p>See <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/293\">https://github.com/nbarrett/ngx-ramblers/issues/293</a></p>\n<ul>\n<li>Marking a conversation read no longer marks it read for everyone -\nread/unread is tracked per committee member.</li>\n<li>Role filters (Membership, Walks, etc.) now show messages sent from a\ncommittee member&#39;s own identity, not only messages addressed to the role,\nso a &quot;no messages&quot; view that should have had mail now shows it.</li>\n<li>The expiry run now includes members who cannot be emailed (no address, or\nblocked in Brevo) so they are removed in the same pass instead of being\nleft in the database; they appear tagged &quot;not emailable&quot;.</li>\n<li>Email types can skip the Compose and Events steps when they are not needed\n(e.g. the welcome email), so a routine run has fewer steps.</li>\n<li>Inbox keyboard navigation: Up/Down arrows move between conversations and\nDelete removes the highlighted one, like a normal email client.</li>\n<li>A funnel toggle filters the conversation list to unread only, and the\nfilter is kept in the URL so it survives reload and can be shared.</li>\n<li>Landing on a mailbox no longer marks the first conversation read</li>\n<li>it is\npreviewed only, and marked read when you click it, arrow onto it, or land\non it after a delete.</li>\n<li>The unread-count badge tooltip lists one role per line with no wrapping.</li>\n<li>Welcome-email images that were rendering broken now display correctly.</li>\n</ul>\n<h2>At a glance</h2>\n<table>\n<thead>\n<tr>\n<th>Area</th>\n<th>Before</th>\n<th>Now</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>Marking read</td>\n<td>Cleared unread for everyone</td>\n<td>Per committee member</td>\n</tr>\n<tr>\n<td>Role filter</td>\n<td>Only mail addressed to the role</td>\n<td>Also mail sent from the member&#39;s identity</td>\n</tr>\n<tr>\n<td>Expiry run, un-emailable members</td>\n<td>Skipped, left in the database</td>\n<td>Included, tagged &quot;not emailable&quot;, deleted in the same pass</td>\n</tr>\n<tr>\n<td>Composer steps</td>\n<td>Always six steps</td>\n<td>Compose/Events skippable per email type</td>\n</tr>\n<tr>\n<td>Thread list</td>\n<td>Mouse only</td>\n<td>Arrow keys to move, Delete to delete</td>\n</tr>\n<tr>\n<td>Read filter</td>\n<td>None</td>\n<td>Funnel toggle for unread only</td>\n</tr>\n<tr>\n<td>Opening a mailbox</td>\n<td>First conversation auto-marked read</td>\n<td>Previewed only; read on user action</td>\n</tr>\n<tr>\n<td>Welcome-email images</td>\n<td>Broken (editing host baked into the URL)</td>\n<td>Relative paths, render correctly</td>\n</tr>\n</tbody></table>\n<h2>Where to find it</h2>\n<ul>\n<li>Admin -&gt; Email inbox: per-member read state, the role/identity filter, the\nunread funnel toggle, arrow-key navigation, Delete to remove, and the\nbadge tooltip in the top bar.</li>\n<li>Email composer: un-emailable members shown in the recipient list, and the\nsteps that disappear for fixed-content email types.</li>\n<li>System Settings -&gt; Mail -&gt; notification template editor: the &quot;Skip the\nCompose step&quot; and &quot;Skip the Events step&quot; toggles per email type.</li>\n</ul>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/ae5010a9-877b-493b-bf66-2396c22f12b3.jpeg\" alt=\"\"></p>\n<p><em>Above: how the inbox looks when you first visit it</em></p>\n<h2>How it behaves</h2>\n<ul>\n<li>Read state: a thread is unread for a member until that member opens it.\nMarking read/unread, the unread counts and the badge are all per member;\nnew inbound mail resets a thread to unread for everyone.</li>\n<li>Role filter: each role resolves to a set of identity emails (the role\naddress, its forward targets and the assigned member&#39;s own email), and a\nmessage is attributed to that role when any of From/To/Cc matches. This\nfixes sent mail (welcome/expiry) that previously only landed in the\nall-accessible mailbox.</li>\n<li>Un-emailable members: in the missing-from-bulk-load flow they are included\nand auto-selected, shown under the existing &quot;no email address&quot; / &quot;blocked&quot;\ngroupings, skipped for the actual send, and fed into the bulk-delete\npost-send action. Each selected recipient chip shows its grouping status\n(e.g. &quot;no email address&quot;) alongside the last-bulk-load detail, and the send\nprogress lists them as &quot;not emailable&quot; with the reason and the deletion note.</li>\n<li>Composer steps: a notification config can skip Compose and Events; the\nstepper hides them and no longer requires them.</li>\n<li>Keyboard: with the thread list focused, Up/Down open the next/previous\nconversation and scroll it into view; Delete/Backspace removes the\nhighlighted conversation and selects the next. Arrows do nothing while\ntyping in the reply editor or search box.</li>\n<li>Unread filter: one click shows unread only, click again for all.</li>\n<li>Opening a mailbox: the first conversation opens as a preview without being\nmarked read.</li>\n<li>Welcome-email images: stored as relative paths and made absolute against\nthe site host only when the email is sent.</li>\n</ul>\n<h2>Why it is restricted</h2>\n<ul>\n<li>The composer always keeps Sender &amp; Template, Recipients, Review and Send,\nin that order with Send last; only Compose and Events can ever be skipped,\nso a sender always chooses the email type and the recipients before Send.</li>\n<li>Un-emailable members are only deleted where the email type carries the\nbulk-delete action (the expiry run). On the warning run they appear tagged\nbut are not deleted.</li>\n</ul>\n<h2>How to try it out</h2>\n<ol>\n<li>Admin -&gt; Email inbox: open a conversation as one member, then check it is\nstill unread for another member. Use the funnel to show unread only.</li>\n<li>Click into the list and use Up/Down to move between conversations and\nDelete to remove one. Land on the mailbox fresh and confirm the first\nconversation is previewed but stays unread until you act on it.</li>\n<li>Select the Membership role filter and confirm sent membership mail now\nappears (run &quot;rescan general&quot; once to re-bucket existing threads).</li>\n<li>In the composer, choose the missing-from-bulk-load email type and confirm\nno-email and blocked members are included and tagged. Tick &quot;Skip the\nCompose step&quot; / &quot;Skip the Events step&quot; on the welcome type in the\nnotification template editor and confirm those steps disappear.</li>\n</ol>\n<h2>Technical changes</h2>\n<p>User-facing behaviour is above; the implementation details follow.</p>\n"}