{"id":"698a6d1b18e16e42a5025667","title":"2026 02 09","path":"how-to/committee/release-notes/2026-02-09","contentMarkdown":"# 09-Feb-2026 — committee email routing, sender management, and environment config [ref: #125](https://github.com/nbarrett/ngx-ramblers/issues/125)\n\n## [build 471](https://github.com/nbarrett/ngx-ramblers/actions/runs/21844591806) — [commit 3c9ac46](https://github.com/nbarrett/ngx-ramblers/commit/3c9ac46d152216cc46c6b4fd792c0a00364f6453)\n\n_____\n\n## Committee Email Routing\n### Manage email forwarding from Committee Settings\n- Each committee role now has a dedicated **Inbound Forwarding** tab where admins\ncan configure how incoming emails to the role address are delivered\n- Choose from four forwarding modes: **Member's personal email**, **Custom address**,\n**Multiple recipients**, or **No forwarding**\n- Multiple-recipient forwarding uses Cloudflare Email Workers, with recipients\nselectable from existing members or entered manually\n- Existing Cloudflare Worker recipients can be imported automatically when detected\n### Email routing status and actions\n- A live status banner shows the current state of each role's Cloudflare routing rule:\n**Forwarding Active** (green), **Not Configured** (amber), **Outdated** (amber),\n**Not Available**, or **Error** (red)\n- One-click **Create**, **Update**, and **Delete** buttons manage routing rules\ndirectly — no need to log into the Cloudflare dashboard\n- Destination email addresses are automatically registered and verified in Cloudflare\n### Email routing logs\n- A new **Email Logs** tab appears on roles that have an active Cloudflare Worker\n- View timestamped logs of inbound email processing including sender, recipient,\nand delivery status\n- Logs are sortable and filterable for easy troubleshooting\n### Outbound email sender configuration\n- The **Outbound Email** tab lets admins derive the sender address from the **Role**\nname or the member's **Full Name**, with domain validation\n- Inline Brevo sender creation and verification — register, amend, or delete senders\nwithout leaving the page\n- Sender status is shown at a glance with verification badges\n### Contact Us integration\n- The **Contact Us** tab configures how contact form submissions are routed for each role\n- A ready-to-use markdown link is generated for embedding in page content, directing\nvisitors to the contact form pre-filled with the correct role\n### Inline help documentation\n- Every tab (Role Details, Outbound Email, Inbound Forwarding, Contact Us, Email Logs)\nnow includes an editable markdown help section at the top explaining its purpose\n- Help content is pre-populated with sensible defaults and can be customised per site\n### Committee settings page improvements\n- Redesigned committee settings with a sortable, searchable table and inline role editing\n- URL deep-linking to individual roles via `?edit=role-type` query parameter\n- Role type categorisation (Committee, Group, System) with built-in role mapping\n## Mail Settings Enhancements\n### Senders management\n- New **Senders** tab in Mail Settings provides a searchable, sortable table of all\nBrevo senders\n- View verification status, associated committee role, and active/inactive state\n- Delete orphaned or unused senders directly from the list\n- Senders linked to committee roles are cross-referenced for easy navigation\n### Brevo template management\n- New **Push Default Template** action overwrites the Brevo template content from\nlocal HTML defaults\n- **Template Diff** indicator shows whether a Brevo template matches the local default\n(colour-coded badge: green = in sync, amber = differs)\n- Brevo editor links now offer both Rich Text and HTML/Setup editor options via dropdown\n### Mail settings loading states\n- All mail settings tabs now show a spinner while configuration is loading, preventing\nblank or broken UI during initial load\n## Environment & Cloudflare Configuration\n### Per-environment Cloudflare configuration\n- Cloudflare settings (API token, Zone ID) are now configured per environment,\nsupporting multi-site deployments where each site has its own Cloudflare zone\n- Configuration is encrypted with AES-256-GCM when passed as an environment variable\n- The base domain is automatically derived from each environment's group URL\n### Environment settings refactor\n- The environment settings page has been split into focused sub-components:\nGlobal Settings, Per-Environment Settings, and Config Tools\n- New Cloudflare URL input component for consistent Cloudflare dashboard links\n- New Cloudflare Settings section showing the resolved per-environment configuration\n## Technical Changes\n### New components and services\n- `CloudflareEmailRoutingService` — frontend service with BehaviorSubject caching for\nrules, destination addresses, workers, catch-all rules, and non-sensitive config\n- `EmailRoutingStatusComponent` — reusable routing status display with action buttons\n- `EmailRoutingLogComponent` — Cloudflare Worker log viewer with sorting and filtering\n- `MailSendersListComponent` — searchable/sortable senders table\n- `CloudflareButtonComponent` — branded Cloudflare action button\n- `DisplayDateAbbreviatedTimePipe` — date formatting pipe for log timestamps\n### New server-side API endpoints\n- `/api/cloudflare/email-routing/rules` — CRUD for email routing rules\n- `/api/cloudflare/email-routing/destination-addresses` — manage verified destinations\n- `/api/cloudflare/email-routing/workers` — list email worker scripts\n- `/api/cloudflare/email-routing/catch-all` — get catch-all rule\n- `/api/cloudflare/email-routing/config` — non-sensitive Cloudflare config\n- `/api/cloudflare/email-routing/analytics` — Cloudflare GraphQL analytics queries\n- `/api/cloudflare/email-routing/worker-invocations` — worker invocation logs\n- `/api/brevo/senders/delete` — delete a Brevo sender\n- `/api/brevo/senders/update` — update a Brevo sender\n- `/api/brevo/templates/push-default` — push local template to Brevo\n- `/api/brevo/templates/diff` — compare local vs Brevo template content\n### Models and utilities\n- Extended `CommitteeMember` model with `emailDerivation`, `forwardEmailTarget`,\n`forwardEmailCustom`, `forwardEmailRecipients`, and `nameAndDescription` fields\n- New `cloudflare-email-routing.model.ts` with comprehensive types for rules,\ndestinations, workers, analytics, and log entries\n- Extended mail model with `Sender`, `SenderSortField`, and `SendersResponse` types\n- `BrevoDropdownItem` model for dropdown menu entries\n- Extracted `validEmail()` and `normaliseEmail()` utilities to shared `strings.ts`\n### Refactoring\n- Streamlined AGENTS.md guidance documentation\n- Split monolithic environment-settings component into sub-components\n- Refactored third-party button components with consistent loading/disabled states\n- Renamed `ENVIRONMENT_SETUP_ENABLED` to `PLATFORM_ADMIN_ENABLED`\n- `CommitteeConfigService` extended with `nameAndDescriptionFrom()` helper","contentHtml":"<h1>09-Feb-2026 — committee email routing, sender management, and environment config <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/125\">ref: #125</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/21844591806\">build 471</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/3c9ac46d152216cc46c6b4fd792c0a00364f6453\">commit 3c9ac46</a></h2>\n<hr>\n<h2>Committee Email Routing</h2>\n<h3>Manage email forwarding from Committee Settings</h3>\n<ul>\n<li>Each committee role now has a dedicated <strong>Inbound Forwarding</strong> tab where admins\ncan configure how incoming emails to the role address are delivered</li>\n<li>Choose from four forwarding modes: <strong>Member&#39;s personal email</strong>, <strong>Custom address</strong>,\n<strong>Multiple recipients</strong>, or <strong>No forwarding</strong></li>\n<li>Multiple-recipient forwarding uses Cloudflare Email Workers, with recipients\nselectable from existing members or entered manually</li>\n<li>Existing Cloudflare Worker recipients can be imported automatically when detected</li>\n</ul>\n<h3>Email routing status and actions</h3>\n<ul>\n<li>A live status banner shows the current state of each role&#39;s Cloudflare routing rule:\n<strong>Forwarding Active</strong> (green), <strong>Not Configured</strong> (amber), <strong>Outdated</strong> (amber),\n<strong>Not Available</strong>, or <strong>Error</strong> (red)</li>\n<li>One-click <strong>Create</strong>, <strong>Update</strong>, and <strong>Delete</strong> buttons manage routing rules\ndirectly — no need to log into the Cloudflare dashboard</li>\n<li>Destination email addresses are automatically registered and verified in Cloudflare</li>\n</ul>\n<h3>Email routing logs</h3>\n<ul>\n<li>A new <strong>Email Logs</strong> tab appears on roles that have an active Cloudflare Worker</li>\n<li>View timestamped logs of inbound email processing including sender, recipient,\nand delivery status</li>\n<li>Logs are sortable and filterable for easy troubleshooting</li>\n</ul>\n<h3>Outbound email sender configuration</h3>\n<ul>\n<li>The <strong>Outbound Email</strong> tab lets admins derive the sender address from the <strong>Role</strong>\nname or the member&#39;s <strong>Full Name</strong>, with domain validation</li>\n<li>Inline Brevo sender creation and verification — register, amend, or delete senders\nwithout leaving the page</li>\n<li>Sender status is shown at a glance with verification badges</li>\n</ul>\n<h3>Contact Us integration</h3>\n<ul>\n<li>The <strong>Contact Us</strong> tab configures how contact form submissions are routed for each role</li>\n<li>A ready-to-use markdown link is generated for embedding in page content, directing\nvisitors to the contact form pre-filled with the correct role</li>\n</ul>\n<h3>Inline help documentation</h3>\n<ul>\n<li>Every tab (Role Details, Outbound Email, Inbound Forwarding, Contact Us, Email Logs)\nnow includes an editable markdown help section at the top explaining its purpose</li>\n<li>Help content is pre-populated with sensible defaults and can be customised per site</li>\n</ul>\n<h3>Committee settings page improvements</h3>\n<ul>\n<li>Redesigned committee settings with a sortable, searchable table and inline role editing</li>\n<li>URL deep-linking to individual roles via <code>?edit=role-type</code> query parameter</li>\n<li>Role type categorisation (Committee, Group, System) with built-in role mapping</li>\n</ul>\n<h2>Mail Settings Enhancements</h2>\n<h3>Senders management</h3>\n<ul>\n<li>New <strong>Senders</strong> tab in Mail Settings provides a searchable, sortable table of all\nBrevo senders</li>\n<li>View verification status, associated committee role, and active/inactive state</li>\n<li>Delete orphaned or unused senders directly from the list</li>\n<li>Senders linked to committee roles are cross-referenced for easy navigation</li>\n</ul>\n<h3>Brevo template management</h3>\n<ul>\n<li>New <strong>Push Default Template</strong> action overwrites the Brevo template content from\nlocal HTML defaults</li>\n<li><strong>Template Diff</strong> indicator shows whether a Brevo template matches the local default\n(colour-coded badge: green = in sync, amber = differs)</li>\n<li>Brevo editor links now offer both Rich Text and HTML/Setup editor options via dropdown</li>\n</ul>\n<h3>Mail settings loading states</h3>\n<ul>\n<li>All mail settings tabs now show a spinner while configuration is loading, preventing\nblank or broken UI during initial load</li>\n</ul>\n<h2>Environment &amp; Cloudflare Configuration</h2>\n<h3>Per-environment Cloudflare configuration</h3>\n<ul>\n<li>Cloudflare settings (API token, Zone ID) are now configured per environment,\nsupporting multi-site deployments where each site has its own Cloudflare zone</li>\n<li>Configuration is encrypted with AES-256-GCM when passed as an environment variable</li>\n<li>The base domain is automatically derived from each environment&#39;s group URL</li>\n</ul>\n<h3>Environment settings refactor</h3>\n<ul>\n<li>The environment settings page has been split into focused sub-components:\nGlobal Settings, Per-Environment Settings, and Config Tools</li>\n<li>New Cloudflare URL input component for consistent Cloudflare dashboard links</li>\n<li>New Cloudflare Settings section showing the resolved per-environment configuration</li>\n</ul>\n<h2>Technical Changes</h2>\n<h3>New components and services</h3>\n<ul>\n<li><code>CloudflareEmailRoutingService</code> — frontend service with BehaviorSubject caching for\nrules, destination addresses, workers, catch-all rules, and non-sensitive config</li>\n<li><code>EmailRoutingStatusComponent</code> — reusable routing status display with action buttons</li>\n<li><code>EmailRoutingLogComponent</code> — Cloudflare Worker log viewer with sorting and filtering</li>\n<li><code>MailSendersListComponent</code> — searchable/sortable senders table</li>\n<li><code>CloudflareButtonComponent</code> — branded Cloudflare action button</li>\n<li><code>DisplayDateAbbreviatedTimePipe</code> — date formatting pipe for log timestamps</li>\n</ul>\n<h3>New server-side API endpoints</h3>\n<ul>\n<li><code>/api/cloudflare/email-routing/rules</code> — CRUD for email routing rules</li>\n<li><code>/api/cloudflare/email-routing/destination-addresses</code> — manage verified destinations</li>\n<li><code>/api/cloudflare/email-routing/workers</code> — list email worker scripts</li>\n<li><code>/api/cloudflare/email-routing/catch-all</code> — get catch-all rule</li>\n<li><code>/api/cloudflare/email-routing/config</code> — non-sensitive Cloudflare config</li>\n<li><code>/api/cloudflare/email-routing/analytics</code> — Cloudflare GraphQL analytics queries</li>\n<li><code>/api/cloudflare/email-routing/worker-invocations</code> — worker invocation logs</li>\n<li><code>/api/brevo/senders/delete</code> — delete a Brevo sender</li>\n<li><code>/api/brevo/senders/update</code> — update a Brevo sender</li>\n<li><code>/api/brevo/templates/push-default</code> — push local template to Brevo</li>\n<li><code>/api/brevo/templates/diff</code> — compare local vs Brevo template content</li>\n</ul>\n<h3>Models and utilities</h3>\n<ul>\n<li>Extended <code>CommitteeMember</code> model with <code>emailDerivation</code>, <code>forwardEmailTarget</code>,\n<code>forwardEmailCustom</code>, <code>forwardEmailRecipients</code>, and <code>nameAndDescription</code> fields</li>\n<li>New <code>cloudflare-email-routing.model.ts</code> with comprehensive types for rules,\ndestinations, workers, analytics, and log entries</li>\n<li>Extended mail model with <code>Sender</code>, <code>SenderSortField</code>, and <code>SendersResponse</code> types</li>\n<li><code>BrevoDropdownItem</code> model for dropdown menu entries</li>\n<li>Extracted <code>validEmail()</code> and <code>normaliseEmail()</code> utilities to shared <code>strings.ts</code></li>\n</ul>\n<h3>Refactoring</h3>\n<ul>\n<li>Streamlined AGENTS.md guidance documentation</li>\n<li>Split monolithic environment-settings component into sub-components</li>\n<li>Refactored third-party button components with consistent loading/disabled states</li>\n<li>Renamed <code>ENVIRONMENT_SETUP_ENABLED</code> to <code>PLATFORM_ADMIN_ENABLED</code></li>\n<li><code>CommitteeConfigService</code> extended with <code>nameAndDescriptionFrom()</code> helper</li>\n</ul>\n"}