<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>euromail.dev Changelog</title>
  <subtitle>New features, improvements, and fixes in euromail.dev — GDPR-compliant transactional email for European developers.</subtitle>
  <link href="https://euromail.dev/changelog/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://euromail.dev/changelog/"/>
  <updated>2026-06-11T00:00:00+00:00</updated>
  <id>https://euromail.dev/changelog/</id>
  <generator>euromail.dev</generator>
  <entry>
    <title>June 11, 2026</title>
    <published>2026-06-11T00:00:00+00:00</published>
    <updated>2026-06-11T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-06-11/</id>
    <link href="https://euromail.dev/changelog/2026-06-11/" rel="alternate" type="text/html"/>
    <summary type="text">1 fix</summary>
    <content type="html"><![CDATA[<h3>Fixed</h3><ul><li><strong>landing:</strong> WCAG keyboard and screen-reader accessibility pass <a href="https://github.com/kalle-works/euromail.dev/issues/548" rel="noopener">#548</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>June 8, 2026</title>
    <published>2026-06-08T00:00:00+00:00</published>
    <updated>2026-06-08T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-06-08/</id>
    <link href="https://euromail.dev/changelog/2026-06-08/" rel="alternate" type="text/html"/>
    <summary type="text">1 fix</summary>
    <content type="html"><![CDATA[<h3>Fixed</h3><ul><li><strong>daily-report:</strong> count direct-MX 'sent' status as delivered <a href="https://github.com/kalle-works/euromail.dev/issues/546" rel="noopener">#546</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>June 3, 2026</title>
    <published>2026-06-03T00:00:00+00:00</published>
    <updated>2026-06-03T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-06-03/</id>
    <link href="https://euromail.dev/changelog/2026-06-03/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature, 7 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>api:</strong> add new-account burst circuit-breaker</li></ul><h3>Fixed</h3><ul><li><strong>auth:</strong> invalidate JWT sessions on password reset/change <a href="https://github.com/kalle-works/euromail.dev/issues/541" rel="noopener">#541</a></li><li><strong>gdpr:</strong> make account hard-delete all-or-nothing in a transaction <a href="https://github.com/kalle-works/euromail.dev/issues/542" rel="noopener">#542</a></li><li><strong>k8s:</strong> move ollama to a dedicated namespace so the LLM can schedule</li><li><strong>k8s:</strong> stop release tag-bump from clobbering the ollama image</li><li><strong>api:</strong> keep scam classification alive past the sync timeout (AUDIT L9)</li><li><strong>api:</strong> ramp send-velocity limits by account age and fix off-by-one</li><li><strong>auth:</strong> prevent email verification from lifting an abuse suspension</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>June 2, 2026</title>
    <published>2026-06-02T00:00:00+00:00</published>
    <updated>2026-06-02T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-06-02/</id>
    <link href="https://euromail.dev/changelog/2026-06-02/" rel="alternate" type="text/html"/>
    <summary type="text">3 fixes</summary>
    <content type="html"><![CDATA[<h3>Fixed</h3><ul><li><strong>auth:</strong> run Argon2 password verification on the blocking pool <a href="https://github.com/kalle-works/euromail.dev/issues/539" rel="noopener">#539</a></li><li><strong>k8s:</strong> pin ollama image to 0.30.0 and harden pod security <a href="https://github.com/kalle-works/euromail.dev/issues/538" rel="noopener">#538</a></li><li><strong>worker:</strong> only suppress on Message-ID-verified ARF complaints <a href="https://github.com/kalle-works/euromail.dev/issues/543" rel="noopener">#543</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 21, 2026</title>
    <published>2026-05-21T00:00:00+00:00</published>
    <updated>2026-05-21T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-21/</id>
    <link href="https://euromail.dev/changelog/2026-05-21/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>spa:</strong> best-in-class UI polish pass <a href="https://github.com/kalle-works/euromail.dev/issues/536" rel="noopener">#536</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 20, 2026</title>
    <published>2026-05-20T00:00:00+00:00</published>
    <updated>2026-05-20T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-20/</id>
    <link href="https://euromail.dev/changelog/2026-05-20/" rel="alternate" type="text/html"/>
    <summary type="text">3 new features, 3 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>auth:</strong> add MFA verification step to SPA login flow</li><li><strong>spa:</strong> add favicon and dynamic page titles per route</li><li><strong>spa:</strong> complete dashboard with all pages, analytics, and full API coverage</li></ul><h3>Fixed</h3><ul><li><strong>spa:</strong> add aria-modal, role=dialog, and aria-labelledby to Modal component</li><li><strong>spa:</strong> allow session auth on API endpoints for SPA dashboard access</li><li><strong>ci:</strong> allowlist frontend SPA pages in gitleaks to permit curl example snippets</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 19, 2026</title>
    <published>2026-05-19T00:00:00+00:00</published>
    <updated>2026-05-19T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-19/</id>
    <link href="https://euromail.dev/changelog/2026-05-19/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature, 1 fix</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>spa:</strong> deploy React SPA as app.euromail.dev <a href="https://github.com/kalle-works/euromail.dev/issues/534" rel="noopener">#534</a></li></ul><h3>Fixed</h3><ul><li><strong>spa:</strong> add missing frontend/index.html and unblock it from .gitignore</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 18, 2026</title>
    <published>2026-05-18T00:00:00+00:00</published>
    <updated>2026-05-18T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-18/</id>
    <link href="https://euromail.dev/changelog/2026-05-18/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>spa:</strong> React SPA foundation with session auth, Redis login guard, CSRF protection <a href="https://github.com/kalle-works/euromail.dev/issues/533" rel="noopener">#533</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 17, 2026</title>
    <published>2026-05-17T00:00:00+00:00</published>
    <updated>2026-05-17T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-17/</id>
    <link href="https://euromail.dev/changelog/2026-05-17/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature, 1 fix</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>streams:</strong> message streams for isolated email reputation tracking <a href="https://github.com/kalle-works/euromail.dev/issues/531" rel="noopener">#531</a></li></ul><h3>Fixed</h3><ul><li><strong>fbl:</strong> deduplicate reports and link complaints to original email <a href="https://github.com/kalle-works/euromail.dev/issues/532" rel="noopener">#532</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 10, 2026</title>
    <published>2026-05-10T00:00:00+00:00</published>
    <updated>2026-05-10T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-10/</id>
    <link href="https://euromail.dev/changelog/2026-05-10/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature, 3 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> complete dark mode migration across all templates <a href="https://github.com/kalle-works/euromail.dev/issues/525" rel="noopener">#525</a></li></ul><h3>Fixed</h3><ul><li><strong>migrations:</strong> include 'fbl' in suppressions_reason_check from migration 084 <a href="https://github.com/kalle-works/euromail.dev/issues/526" rel="noopener">#526</a></li><li><strong>dashboard:</strong> pluralize count labels correctly when N=1 <a href="https://github.com/kalle-works/euromail.dev/issues/524" rel="noopener">#524</a></li><li><strong>ci:</strong> align team-invite test with upsert behavior and ignore alpha-pin advisories <a href="https://github.com/kalle-works/euromail.dev/issues/523" rel="noopener">#523</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 9, 2026</title>
    <published>2026-05-09T00:00:00+00:00</published>
    <updated>2026-05-09T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-09/</id>
    <link href="https://euromail.dev/changelog/2026-05-09/" rel="alternate" type="text/html"/>
    <summary type="text">6 new features</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>sending-ips:</strong> admin /admin/sending-ips dashboard + docs update <a href="https://github.com/kalle-works/euromail.dev/issues/522" rel="noopener">#522</a></li><li><strong>sending-ips:</strong> worker reads active set from DB + auto-retire stale rows <a href="https://github.com/kalle-works/euromail.dev/issues/521" rel="noopener">#521</a></li><li><strong>sending-ips:</strong> add SPF auto-sync via Cloudflare DNS API <a href="https://github.com/kalle-works/euromail.dev/issues/520" rel="noopener">#520</a></li><li><strong>sending-ips:</strong> persist PTR + DNSBL state, auto-pause on bad signals <a href="https://github.com/kalle-works/euromail.dev/issues/519" rel="noopener">#519</a></li><li><strong>sending-ips:</strong> add Hetzner Robot API reconciler with Redis lease <a href="https://github.com/kalle-works/euromail.dev/issues/518" rel="noopener">#518</a></li><li><strong>sending-ips:</strong> add lifecycle registry and node-local discovery <a href="https://github.com/kalle-works/euromail.dev/issues/517" rel="noopener">#517</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 6, 2026</title>
    <published>2026-05-06T00:00:00+00:00</published>
    <updated>2026-05-06T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-06/</id>
    <link href="https://euromail.dev/changelog/2026-05-06/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>worker:</strong> add smtp-2 and smtp-3 outbound relays on bare-metal nodes <a href="https://github.com/kalle-works/euromail.dev/issues/515" rel="noopener">#515</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 3, 2026</title>
    <published>2026-05-03T00:00:00+00:00</published>
    <updated>2026-05-03T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-03/</id>
    <link href="https://euromail.dev/changelog/2026-05-03/" rel="alternate" type="text/html"/>
    <summary type="text">2 new features</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>api:</strong> add transactional field with default true to suppress list headers <a href="https://github.com/kalle-works/euromail.dev/issues/512" rel="noopener">#512</a></li><li><strong>deliverability:</strong> spamtrap and typo-domain recipient guard <a href="https://github.com/kalle-works/euromail.dev/issues/511" rel="noopener">#511</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 2, 2026</title>
    <published>2026-05-02T00:00:00+00:00</published>
    <updated>2026-05-02T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-02/</id>
    <link href="https://euromail.dev/changelog/2026-05-02/" rel="alternate" type="text/html"/>
    <summary type="text">8 new features, 3 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>deliverability:</strong> block sends to spamtrap and typo-domain recipients <a href="https://github.com/kalle-works/euromail.dev/issues/510" rel="noopener">#510</a></li><li><strong>deliverability:</strong> auto-suppress stale recipients after 90 days of inactivity <a href="https://github.com/kalle-works/euromail.dev/issues/509" rel="noopener">#509</a></li><li><strong>deliverability:</strong> per-recipient engagement tracking <a href="https://github.com/kalle-works/euromail.dev/issues/508" rel="noopener">#508</a></li><li><strong>bounces:</strong> suppress addresses after 5 cumulative soft bounces</li><li><strong>delivery:</strong> parse Retry-After hints from SMTP 4xx responses</li><li><strong>reporting:</strong> add TLS-RPT report receiver (RFC 8460)</li><li><strong>dkim:</strong> add ED25519 key generation and signing support</li><li><strong>inbound:</strong> add SPF verification for incoming email</li></ul><h3>Fixed</h3><ul><li><strong>delivery:</strong> increase retry window from 3min to 42h</li><li><strong>dkim:</strong> add missing AUID to ED25519 signer for consistency with RSA</li><li><strong>api:</strong> bound scam classifier accept latency <a href="https://github.com/kalle-works/euromail.dev/issues/507" rel="noopener">#507</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>May 1, 2026</title>
    <published>2026-05-01T00:00:00+00:00</published>
    <updated>2026-05-01T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-05-01/</id>
    <link href="https://euromail.dev/changelog/2026-05-01/" rel="alternate" type="text/html"/>
    <summary type="text">3 fixes</summary>
    <content type="html"><![CDATA[<h3>Fixed</h3><ul><li><strong>team:</strong> upsert invitation on resend instead of failing silently <a href="https://github.com/kalle-works/euromail.dev/issues/506" rel="noopener">#506</a></li><li><strong>dashboard:</strong> org switcher can't return home and invite not accepted when logged in <a href="https://github.com/kalle-works/euromail.dev/issues/505" rel="noopener">#505</a></li><li><strong>smtp:</strong> accept all recipient domains for inbound email <a href="https://github.com/kalle-works/euromail.dev/issues/504" rel="noopener">#504</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 30, 2026</title>
    <published>2026-04-30T00:00:00+00:00</published>
    <updated>2026-04-30T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-30/</id>
    <link href="https://euromail.dev/changelog/2026-04-30/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature, 8 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> show sending IP in email detail view and delivery log <a href="https://github.com/kalle-works/euromail.dev/issues/502" rel="noopener">#502</a></li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> use system DNS resolver for DNSBL blacklist checks <a href="https://github.com/kalle-works/euromail.dev/issues/500" rel="noopener">#500</a></li><li><strong>dns:</strong> use system resolver in dns_verification and validate route <a href="https://github.com/kalle-works/euromail.dev/issues/501" rel="noopener">#501</a></li><li><strong>worker:</strong> suppress Feedback-Id and Cfbl-Address on transactional emails <a href="https://github.com/kalle-works/euromail.dev/issues/498" rel="noopener">#498</a></li><li><strong>dashboard:</strong> replace IP whitelist with rate-limit on public dashboard ingress <a href="https://github.com/kalle-works/euromail.dev/issues/499" rel="noopener">#499</a></li><li><strong>security:</strong> restrict dashboard to operator IP and rate-limit API <a href="https://github.com/kalle-works/euromail.dev/issues/494" rel="noopener">#494</a></li><li><strong>worker:</strong> correct COUNT(*) type from i32 to i64 in domain health analyzer <a href="https://github.com/kalle-works/euromail.dev/issues/497" rel="noopener">#497</a></li><li><strong>smtp:</strong> use system DNS resolver instead of hardcoded Google DNS <a href="https://github.com/kalle-works/euromail.dev/issues/496" rel="noopener">#496</a></li><li><strong>security:</strong> apply 6 unmerged security audit fixes ()</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 29, 2026</title>
    <published>2026-04-29T00:00:00+00:00</published>
    <updated>2026-04-29T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-29/</id>
    <link href="https://euromail.dev/changelog/2026-04-29/" rel="alternate" type="text/html"/>
    <summary type="text">1 fix</summary>
    <content type="html"><![CDATA[<h3>Fixed</h3><ul><li><strong>security:</strong> address audit findings</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 28, 2026</title>
    <published>2026-04-28T00:00:00+00:00</published>
    <updated>2026-04-28T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-28/</id>
    <link href="https://euromail.dev/changelog/2026-04-28/" rel="alternate" type="text/html"/>
    <summary type="text">2 new features, 20 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>security:</strong> add gitleaks CI guard and SECURITY.md policy <a href="https://github.com/kalle-works/euromail.dev/issues/421" rel="noopener">#421</a></li><li><strong>monitoring:</strong> expose prometheus scrape annotations on euromail-worker pod</li></ul><h3>Fixed</h3><ul><li><strong>api:</strong> add WWW-Authenticate header to metrics 401 and harden tests</li><li><strong>api:</strong> require METRICS_BEARER_TOKEN in production and constant-time compare</li><li><strong>ci:</strong> allowlist k8s/secrets/ SealedSecret manifests in gitleaks</li><li><strong>ci:</strong> preserve original tarball filename for gitleaks sha256sum verification</li><li><strong>config:</strong> move METRICS_BEARER_TOKEN production validation from AppConfig to ApiConfig</li><li><strong>security:</strong> harden worker/monitor metrics auth and fix Prometheus scraping</li><li><strong>security:</strong> narrow gitleaks allowlist and remove misleading IngressRoute annotation</li><li><strong>security:</strong> raise IngressRoute priority to 100 so IPAllowList beats catch-all Ingress</li><li><strong>tests:</strong> add missing AppState/AppConfig fields to metrics_auth test</li><li><strong>tests:</strong> correct misleading subtle::ct_eq comment in metrics_rejects_token_prefix</li><li><strong>llms:</strong> remove hardcoded kalle@kalle.works from skill description</li><li><strong>openapi:</strong> correct batch response schema and domain update docs</li><li><strong>ci:</strong> pin shared docker-build-targets to multi-arch commit</li><li><strong>landing:</strong> add llms.txt discovery to robots.txt and nginx aliases</li><li><strong>smtp:</strong> add accepted_domains to RouterReceiveConfig test helpers</li><li><strong>smtp:</strong> rename local_part to strip_angle_brackets and update stale liveness doc</li><li><strong>smtp:</strong> replace manual splitn with split_once for clippy</li><li><strong>smtp:</strong> validate RCPT TO domain at connect time, reject unknown domains</li><li><strong>ci:</strong> update shared workflow to multi-arch build commit <a href="https://github.com/kalle-works/euromail.dev/issues/490" rel="noopener">#490</a></li><li><strong>security:</strong> disable k8s API token automount in all pods + seal secrets</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 27, 2026</title>
    <published>2026-04-27T00:00:00+00:00</published>
    <updated>2026-04-27T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-27/</id>
    <link href="https://euromail.dev/changelog/2026-04-27/" rel="alternate" type="text/html"/>
    <summary type="text">3 new features, 2 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>ollama:</strong> migrate storage from Longhorn to local-path on bare-metal-llm</li><li><strong>security:</strong> encrypt secrets at rest with AES-256-GCM <a href="https://github.com/kalle-works/euromail.dev/issues/485" rel="noopener">#485</a></li><li><strong>dashboard:</strong> Phase 5 settings/admin + Phase 6 responsive tables + Phase 7 WCAG 2.1 AA <a href="https://github.com/kalle-works/euromail.dev/issues/483" rel="noopener">#483</a></li></ul><h3>Fixed</h3><ul><li><strong>lint:</strong> remove redundant encrypt closures flagged by clippy <a href="https://github.com/kalle-works/euromail.dev/issues/487" rel="noopener">#487</a></li><li><strong>security:</strong> add encryption_key to AppConfig struct literals in tests and test helpers <a href="https://github.com/kalle-works/euromail.dev/issues/486" rel="noopener">#486</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 26, 2026</title>
    <published>2026-04-26T00:00:00+00:00</published>
    <updated>2026-04-26T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-26/</id>
    <link href="https://euromail.dev/changelog/2026-04-26/" rel="alternate" type="text/html"/>
    <summary type="text">7 new features, 5 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> migrate settings/admin templates to warm palette <a href="https://github.com/kalle-works/euromail.dev/issues/482" rel="noopener">#482</a></li><li><strong>dashboard:</strong> migrate deliverability/activity templates to warm palette</li><li><strong>dashboard:</strong> migrate inbound and mailboxes pages to DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/480" rel="noopener">#480</a></li><li><strong>monitor:</strong> deploy euromail-monitor crate (Dockerfile + k8s + CI) <a href="https://github.com/kalle-works/euromail.dev/issues/474" rel="noopener">#474</a></li><li><strong>monitor:</strong> scaffold euromail-monitor crate with 4 SMTP probes (Phase 1) <a href="https://github.com/kalle-works/euromail.dev/issues/473" rel="noopener">#473</a></li><li><strong>smtp:</strong> synthetic-probe short-circuit in router data_end <a href="https://github.com/kalle-works/euromail.dev/issues/472" rel="noopener">#472</a></li><li><strong>smtp:</strong> flip tcp/25 to tokio-native listener <a href="https://github.com/kalle-works/euromail.dev/issues/459" rel="noopener">#459</a></li></ul><h3>Fixed</h3><ul><li><strong>monitor:</strong> update TODOS with Phase 2 completion notes <a href="https://github.com/kalle-works/euromail.dev/issues/479" rel="noopener">#479</a></li><li><strong>monitor:</strong> use smtp-1 private IP for SMTP probe target <a href="https://github.com/kalle-works/euromail.dev/issues/477" rel="noopener">#477</a></li><li><strong>smtp:</strong> put domain first in EHLO response per RFC 5321 + fix TLS server name <a href="https://github.com/kalle-works/euromail.dev/issues/478" rel="noopener">#478</a></li><li><strong>monitor:</strong> point SMTP probes at LB IP instead of worker Service name <a href="https://github.com/kalle-works/euromail.dev/issues/476" rel="noopener">#476</a></li><li><strong>monitor:</strong> align deployment image tag with kustomization baseline <a href="https://github.com/kalle-works/euromail.dev/issues/475" rel="noopener">#475</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 25, 2026</title>
    <published>2026-04-25T00:00:00+00:00</published>
    <updated>2026-04-25T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-25/</id>
    <link href="https://euromail.dev/changelog/2026-04-25/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature, 5 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>worker:</strong> wire STARTTLS into the parallel SMTP listener <a href="https://github.com/kalle-works/euromail.dev/issues/465" rel="noopener">#465</a></li></ul><h3>Fixed</h3><ul><li><strong>scripts:</strong> make smtp_soak_diff.sh DMARC fixture trip the parser <a href="https://github.com/kalle-works/euromail.dev/issues/471" rel="noopener">#471</a></li><li><strong>smtp:</strong> restore body's trailing CRLF stripped by smtp-proto receiver <a href="https://github.com/kalle-works/euromail.dev/issues/470" rel="noopener">#470</a></li><li><strong>scripts:</strong> make smtp_soak_diff.sh actually exercise both paths <a href="https://github.com/kalle-works/euromail.dev/issues/469" rel="noopener">#469</a></li><li><strong>smtp:</strong> advertise STARTTLS in router EHLO when TLS is configured <a href="https://github.com/kalle-works/euromail.dev/issues/466" rel="noopener">#466</a></li><li><strong>platform:</strong> mark platform account active so team-switch works <a href="https://github.com/kalle-works/euromail.dev/issues/463" rel="noopener">#463</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 24, 2026</title>
    <published>2026-04-24T00:00:00+00:00</published>
    <updated>2026-04-24T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-24/</id>
    <link href="https://euromail.dev/changelog/2026-04-24/" rel="alternate" type="text/html"/>
    <summary type="text">9 new features, 1 fix</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>platform:</strong> grant kalle owner membership of platform account <a href="https://github.com/kalle-works/euromail.dev/issues/462" rel="noopener">#462</a></li><li><strong>smtp:</strong> add tokio listener + connection driver for receive module <a href="https://github.com/kalle-works/euromail.dev/issues/448" rel="noopener">#448</a></li><li><strong>smtp:</strong> AUTH PLAIN + LOGIN with handler-owned rate limit <a href="https://github.com/kalle-works/euromail.dev/issues/450" rel="noopener">#450</a></li><li><strong>smtp:</strong> STARTTLS upgrade via tokio-rustls for receive module <a href="https://github.com/kalle-works/euromail.dev/issues/449" rel="noopener">#449</a></li><li><strong>worker:</strong> start parallel tokio-native SMTP listener for soak <a href="https://github.com/kalle-works/euromail.dev/issues/455" rel="noopener">#455</a></li><li><strong>smtp:</strong> add tokio-native receive module (Handler trait + session FSM) <a href="https://github.com/kalle-works/euromail.dev/issues/446" rel="noopener">#446</a></li><li><strong>smtp:</strong> emit per-kind ingress counters and listener liveness probe <a href="https://github.com/kalle-works/euromail.dev/issues/444" rel="noopener">#444</a></li><li><strong>worker:</strong> daily digest of platform mailbox inbound to MAILBOX_DIGEST_TO <a href="https://github.com/kalle-works/euromail.dev/issues/452" rel="noopener">#452</a></li><li><strong>platform:</strong> forbid non-platform accounts from claiming euromail.dev <a href="https://github.com/kalle-works/euromail.dev/issues/447" rel="noopener">#447</a></li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> guard checks access in dns_records.html DMARC set <a href="https://github.com/kalle-works/euromail.dev/issues/457" rel="noopener">#457</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 23, 2026</title>
    <published>2026-04-23T00:00:00+00:00</published>
    <updated>2026-04-23T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-23/</id>
    <link href="https://euromail.dev/changelog/2026-04-23/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>platform:</strong> seed agent mailboxes for general euromail.dev addresses <a href="https://github.com/kalle-works/euromail.dev/issues/445" rel="noopener">#445</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 21, 2026</title>
    <published>2026-04-21T00:00:00+00:00</published>
    <updated>2026-04-21T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-21/</id>
    <link href="https://euromail.dev/changelog/2026-04-21/" rel="alternate" type="text/html"/>
    <summary type="text">2 new features, 2 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>api:</strong> wire scam classifier into /v1/emails pre-send path <a href="https://github.com/kalle-works/euromail.dev/issues/439" rel="noopener">#439</a></li><li><strong>common:</strong> add scam_classifier module for pre-send phishing checks <a href="https://github.com/kalle-works/euromail.dev/issues/438" rel="noopener">#438</a></li></ul><h3>Fixed</h3><ul><li><strong>api:</strong> deny-all CORS default and validate allow-list on startup <a href="https://github.com/kalle-works/euromail.dev/issues/409" rel="noopener">#409</a> <a href="https://github.com/kalle-works/euromail.dev/issues/436" rel="noopener">#436</a></li><li><strong>worker:</strong> distinguish daily status enqueued vs delivered <a href="https://github.com/kalle-works/euromail.dev/issues/405" rel="noopener">#405</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 20, 2026</title>
    <published>2026-04-20T00:00:00+00:00</published>
    <updated>2026-04-20T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-20/</id>
    <link href="https://euromail.dev/changelog/2026-04-20/" rel="alternate" type="text/html"/>
    <summary type="text">3 new features, 4 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>worker:</strong> system email metrics + PII log scrubbing <a href="https://github.com/kalle-works/euromail.dev/issues/404" rel="noopener">#404</a></li><li><strong>domains:</strong> include DMARC record in domain setup DNS table <a href="https://github.com/kalle-works/euromail.dev/issues/398" rel="noopener">#398</a></li><li><strong>smtp:</strong> route system emails through worker via email:system stream <a href="https://github.com/kalle-works/euromail.dev/issues/397" rel="noopener">#397</a></li></ul><h3>Fixed</h3><ul><li><strong>queue:</strong> loop XAUTOCLAIM cursor until pending list is drained <a href="https://github.com/kalle-works/euromail.dev/issues/401" rel="noopener">#401</a></li><li><strong>auth:</strong> rate-limit forgot_password_submit (per-IP + per-email) <a href="https://github.com/kalle-works/euromail.dev/issues/400" rel="noopener">#400</a></li><li><strong>smtp:</strong> bind system email egress to SENDING_IPS[0] <a href="https://github.com/kalle-works/euromail.dev/issues/395" rel="noopener">#395</a></li><li><strong>dashboard:</strong> register mailboxes/message_detail.html in template env <a href="https://github.com/kalle-works/euromail.dev/issues/394" rel="noopener">#394</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 19, 2026</title>
    <published>2026-04-19T00:00:00+00:00</published>
    <updated>2026-04-19T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-19/</id>
    <link href="https://euromail.dev/changelog/2026-04-19/" rel="alternate" type="text/html"/>
    <summary type="text">2 new features, 4 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> add mailbox message detail view + declutter list page <a href="https://github.com/kalle-works/euromail.dev/issues/392" rel="noopener">#392</a></li><li><strong>dashboard:</strong> add LLM provider preference radio group to integrations page <a href="https://github.com/kalle-works/euromail.dev/issues/387" rel="noopener">#387</a></li></ul><h3>Fixed</h3><ul><li><strong>worker:</strong> send Ollama keep_alive as integer, not duration string <a href="https://github.com/kalle-works/euromail.dev/issues/393" rel="noopener">#393</a></li><li><strong>worker:</strong> route LLM calls through a separate HTTP client (no SSRF resolver) <a href="https://github.com/kalle-works/euromail.dev/issues/391" rel="noopener">#391</a></li><li><strong>team:</strong> send invitation emails via platform domain, not customer pipeline <a href="https://github.com/kalle-works/euromail.dev/issues/390" rel="noopener">#390</a></li><li><strong>worker:</strong> disable Gemma 4 thinking mode in Ollama requests <a href="https://github.com/kalle-works/euromail.dev/issues/389" rel="noopener">#389</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 18, 2026</title>
    <published>2026-04-18T00:00:00+00:00</published>
    <updated>2026-04-18T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-18/</id>
    <link href="https://euromail.dev/changelog/2026-04-18/" rel="alternate" type="text/html"/>
    <summary type="text">20 new features, 1 fix</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>worker:</strong> add Ollama+Gemma 4 backend with resolver and per-account fallback <a href="https://github.com/kalle-works/euromail.dev/issues/385" rel="noopener">#385</a></li><li><strong>accounts:</strong> add llm_provider_preference column and typed enum <a href="https://github.com/kalle-works/euromail.dev/issues/384" rel="noopener">#384</a></li><li><strong>dashboard:</strong> migrate contact_lists pages to DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/378" rel="noopener">#378</a></li><li><strong>dashboard:</strong> migrate email templates pages to DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/380" rel="noopener">#380</a></li><li><strong>dashboard:</strong> migrate newsletters pages to DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/382" rel="noopener">#382</a></li><li><strong>dashboard:</strong> migrate signup_forms + onboarding to DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/379" rel="noopener">#379</a></li><li><strong>dashboard:</strong> migrate webhooks pages to DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/381" rel="noopener">#381</a></li><li><strong>dashboard:</strong> migrate api_keys and api_playground pages to DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/375" rel="noopener">#375</a></li><li><strong>dashboard:</strong> migrate domains pages to DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/374" rel="noopener">#374</a></li><li><strong>dashboard:</strong> migrate emails pages to DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/376" rel="noopener">#376</a></li><li><strong>dashboard:</strong> migrate overview page to DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/373" rel="noopener">#373</a></li><li><strong>dashboard:</strong> align dark-mode tokens to DESIGN.md dark palette <a href="https://github.com/kalle-works/euromail.dev/issues/371" rel="noopener">#371</a></li><li><strong>dashboard:</strong> migrate MFA pages onto DESIGN.md system <a href="https://github.com/kalle-works/euromail.dev/issues/370" rel="noopener">#370</a></li><li><strong>dashboard:</strong> bring 404 and 500 pages onto DESIGN.md system <a href="https://github.com/kalle-works/euromail.dev/issues/369" rel="noopener">#369</a></li><li><strong>dashboard:</strong> migrate chrome to warm DESIGN.md palette <a href="https://github.com/kalle-works/euromail.dev/issues/368" rel="noopener">#368</a></li><li><strong>dashboard:</strong> apply European Editorial design to auth pages <a href="https://github.com/kalle-works/euromail.dev/issues/363" rel="noopener">#363</a></li><li><strong>landing:</strong> apply brand stripe + unify fonts across docs/blog/legal <a href="https://github.com/kalle-works/euromail.dev/issues/366" rel="noopener">#366</a></li><li><strong>email:</strong> apply European Editorial design to daily status report <a href="https://github.com/kalle-works/euromail.dev/issues/361" rel="noopener">#361</a></li><li><strong>email:</strong> apply European Editorial design to system emails <a href="https://github.com/kalle-works/euromail.dev/issues/359" rel="noopener">#359</a></li><li><strong>email:</strong> redesign team invitation email to match DESIGN.md + fix XSS <a href="https://github.com/kalle-works/euromail.dev/issues/360" rel="noopener">#360</a></li></ul><h3>Fixed</h3><ul><li><strong>tests:</strong> assert 202 ACCEPTED in quota overage tests <a href="https://github.com/kalle-works/euromail.dev/issues/364" rel="noopener">#364</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 16, 2026</title>
    <published>2026-04-16T00:00:00+00:00</published>
    <updated>2026-04-16T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-16/</id>
    <link href="https://euromail.dev/changelog/2026-04-16/" rel="alternate" type="text/html"/>
    <summary type="text">1 fix</summary>
    <content type="html"><![CDATA[<h3>Fixed</h3><ul><li><strong>security:</strong> SSRF + stored XSS + k8s hardening + rustls-webpki bump <a href="https://github.com/kalle-works/euromail.dev/issues/356" rel="noopener">#356</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 15, 2026</title>
    <published>2026-04-15T00:00:00+00:00</published>
    <updated>2026-04-15T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-15/</id>
    <link href="https://euromail.dev/changelog/2026-04-15/" rel="alternate" type="text/html"/>
    <summary type="text">2 new features, 2 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> per-account Anthropic API key settings <a href="https://github.com/kalle-works/euromail.dev/issues/353" rel="noopener">#353</a></li><li><strong>mailbox:</strong> threading headers, quote stripping, Haiku classification <a href="https://github.com/kalle-works/euromail.dev/issues/352" rel="noopener">#352</a></li></ul><h3>Fixed</h3><ul><li><strong>landing:</strong> allow Bunny Fonts and Fontshare in CSP <a href="https://github.com/kalle-works/euromail.dev/issues/355" rel="noopener">#355</a></li><li><strong>dashboard:</strong> register integrations.html in template loader <a href="https://github.com/kalle-works/euromail.dev/issues/354" rel="noopener">#354</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 14, 2026</title>
    <published>2026-04-14T00:00:00+00:00</published>
    <updated>2026-04-14T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-14/</id>
    <link href="https://euromail.dev/changelog/2026-04-14/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature, 1 fix</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>mailbox:</strong> at-least-once delivery with lease/ack/nack</li></ul><h3>Fixed</h3><ul><li><strong>api:</strong> allow unsafe-eval in Swagger UI CSP so docs page renders</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 13, 2026</title>
    <published>2026-04-13T00:00:00+00:00</published>
    <updated>2026-04-13T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-13/</id>
    <link href="https://euromail.dev/changelog/2026-04-13/" rel="alternate" type="text/html"/>
    <summary type="text">15 new features, 9 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>api:</strong> add per-email tracking override and suppress_list_management_header</li><li><strong>dashboard:</strong> add tab navigation to analytics page</li><li><strong>dashboard:</strong> simplify navigation with grouped sidebar and page consolidation</li><li><strong>security:</strong> close remaining agent security gaps</li><li><strong>security:</strong> add agent-specific security hardening for mailbox API</li><li><strong>security:</strong> advanced prompt injection defenses for agent mailboxes</li><li>add dashboard delight, MCP tools, and GDPR coverage for agent mailboxes</li><li><strong>api:</strong> add contact book and analytics for agent mailboxes</li><li><strong>api:</strong> add full-text search and labels for agent mailbox messages</li><li><strong>api:</strong> add reply API and conversation threading for agent mailboxes</li><li><strong>worker:</strong> add attachment storage via Hetzner Object Storage</li><li><strong>worker:</strong> add auto-responder with loop prevention for agent mailboxes</li><li><strong>worker:</strong> add webhook support for agent mailbox messages</li><li><strong>dashboard:</strong> register missing templates and redirect logged-in users from login <a href="https://github.com/kalle-works/euromail.dev/issues/332" rel="noopener">#332</a></li><li><strong>smtp:</strong> add STARTTLS support for inbound SMTP server <a href="https://github.com/kalle-works/euromail.dev/issues/331" rel="noopener">#331</a></li></ul><h3>Fixed</h3><ul><li><strong>landing:</strong> add Python SDK to code examples and deploy 404 page</li><li><strong>dns:</strong> enforce DMARC reject and SPF hard fail policies</li><li><strong>tracking:</strong> change tracking default to opt-in for better deliverability</li><li><strong>security:</strong> restrict mailbox local_part to safe characters</li><li><strong>migration:</strong> remove CONCURRENTLY from GIN index creation</li><li>resolve clippy warnings and update test fixtures for agent mailbox fields</li><li><strong>dashboard:</strong> remove unsupported truncate filter from mailbox detail</li><li><strong>smtp:</strong> use Trusted SSL config to serve full certificate chain</li><li><strong>dashboard:</strong> use format_date/format_datetime filters in mailbox templates <a href="https://github.com/kalle-works/euromail.dev/issues/330" rel="noopener">#330</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 12, 2026</title>
    <published>2026-04-12T00:00:00+00:00</published>
    <updated>2026-04-12T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-12/</id>
    <link href="https://euromail.dev/changelog/2026-04-12/" rel="alternate" type="text/html"/>
    <summary type="text">9 new features, 18 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> add dark mode support to auth pages</li><li><strong>docs:</strong> add client-side search to API documentation</li><li><strong>docs:</strong> add SDK code examples with language tabs for all 4 SDKs</li><li><strong>status:</strong> configure Vartio status page with 5 monitors</li><li><strong>api:</strong> add docs_url field to error responses</li><li><strong>dx:</strong> add Makefile for common dev commands</li><li><strong>dashboard:</strong> add mailboxes page for agent mailbox management</li><li><strong>api:</strong> add agent mailboxes for AI agent email reception</li><li><strong>api:</strong> support custom domains for agent mailboxes</li></ul><h3>Fixed</h3><ul><li><strong>landing:</strong> correct doc links and left-align hero <a href="https://github.com/kalle-works/euromail.dev/issues/329" rel="noopener">#329</a></li><li>align design system (fonts, colors, CSP, GDPR) <a href="https://github.com/kalle-works/euromail.dev/issues/328" rel="noopener">#328</a></li><li><strong>status:</strong> update links to use status.euromail.dev custom domain</li><li><strong>dashboard:</strong> update chart fonts to Satoshi and add dark mode support</li><li><strong>landing:</strong> add ARIA semantics to mobile menu and code tabs</li><li><strong>status:</strong> correct SMTP monitors to mail1/mail2.euromail.dev</li><li><strong>landing:</strong> add prefers-reduced-motion support for accessibility</li><li><strong>dashboard:</strong> increase DNS copy button touch targets to meet 44px minimum</li><li><strong>dashboard:</strong> replace Albert Sans remnants with Satoshi</li><li><strong>dashboard:</strong> serialize activity events as JSON to prevent HTML entity encoding in URLs</li><li><strong>dashboard:</strong> load custom fonts on standalone auth pages</li><li><strong>common:</strong> accept mail1/mail2.euromail.dev in MX verification</li><li><strong>dashboard:</strong> remove broken status page link</li><li><strong>landing:</strong> add branded 404 page replacing bare nginx default</li><li><strong>landing:</strong> serve quickstart and feature guides</li><li><strong>dashboard:</strong> correct MX record instructions on inbound emails page</li><li><strong>dashboard:</strong> show CNAME verification failure reason on tracking domain</li><li><strong>dashboard:</strong> correct route syntax in insights router</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 11, 2026</title>
    <published>2026-04-11T00:00:00+00:00</published>
    <updated>2026-04-11T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-11/</id>
    <link href="https://euromail.dev/changelog/2026-04-11/" rel="alternate" type="text/html"/>
    <summary type="text">14 new features, 6 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>billing:</strong> add annual billing with 2 months free</li><li><strong>billing:</strong> annual billing with 2 months free + Stripe webhook fix</li><li><strong>billing:</strong> overage billing for paid plans</li><li><strong>billing:</strong> overage billing for paid plans + Stripe usage reporting fix</li><li><strong>dashboard:</strong> add step-by-step onboarding wizard</li><li><strong>status:</strong> add Vartio.dev status page integration</li><li><strong>fbl:</strong> add ISP feedback loop ingest, archive, and dashboard</li><li><strong>insights:</strong> add Claude-powered weekly operational insights</li><li>ISP feedback loops, per-domain self-tuning, and Claude-powered insights</li><li><strong>worker:</strong> add per-domain health throttling and account auto-pause webhooks</li><li><strong>analytics:</strong> add per-link click breakdown for tagged emails</li><li><strong>analytics:</strong> add per-link click tracking with GET /v1/emails/{id}/links</li><li><strong>newsletters:</strong> add tags and per-link click analytics</li><li><strong>newsletters:</strong> add tags to newsletters and GET /v1/analytics/tags</li></ul><h3>Fixed</h3><ul><li><strong>api:</strong> correct route syntax for analytics tags endpoint</li><li><strong>billing:</strong> report Stripe overage usage before monthly quota reset</li><li><strong>billing:</strong> resolve annual price ID in Stripe webhook plan lookup</li><li><strong>insights:</strong> remove cross-account throttle data leak and harden acknowledge ownership</li><li><strong>analytics:</strong> count sent events as delivered in stats aggregator</li><li><strong>tracking:</strong> filter bot user-agents from open tracking pixel</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 10, 2026</title>
    <published>2026-04-10T00:00:00+00:00</published>
    <updated>2026-04-10T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-10/</id>
    <link href="https://euromail.dev/changelog/2026-04-10/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature, 2 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>contact-lists:</strong> add welcome email automation for new subscribers</li></ul><h3>Fixed</h3><ul><li><strong>worker:</strong> add Precedence: bulk and List-Id headers for list emails</li><li><strong>contact-lists:</strong> harden welcome email based on engineering review</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 8, 2026</title>
    <published>2026-04-08T00:00:00+00:00</published>
    <updated>2026-04-08T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-08/</id>
    <link href="https://euromail.dev/changelog/2026-04-08/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>landing:</strong> add favicon.ico for browsers requesting /favicon.ico</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 7, 2026</title>
    <published>2026-04-07T00:00:00+00:00</published>
    <updated>2026-04-07T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-07/</id>
    <link href="https://euromail.dev/changelog/2026-04-07/" rel="alternate" type="text/html"/>
    <summary type="text">4 new features, 5 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> add admin DNSBL blacklist checker <a href="https://github.com/kalle-works/euromail.dev/issues/324" rel="noopener">#324</a></li><li><strong>subscribe:</strong> use customer tracking domain for confirm links</li><li><strong>signup-forms:</strong> add configurable from_address per signup form</li><li><strong>subscribe:</strong> route confirmation emails through pipeline with branding</li></ul><h3>Fixed</h3><ul><li><strong>infra:</strong> set SMTP EHLO hostname to mail3.euromail.dev for FCrDNS match <a href="https://github.com/kalle-works/euromail.dev/issues/326" rel="noopener">#326</a></li><li><strong>infra:</strong> route outbound SMTP through 204.168.195.152 to bypass Microsoft S3140 <a href="https://github.com/kalle-works/euromail.dev/issues/325" rel="noopener">#325</a></li><li><strong>api:</strong> remove duplicate /confirm route registration</li><li><strong>migration:</strong> use IF NOT EXISTS for from_address column</li><li><strong>api:</strong> properly isolate subscribe routes from restrictive global CORS</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 6, 2026</title>
    <published>2026-04-06T00:00:00+00:00</published>
    <updated>2026-04-06T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-06/</id>
    <link href="https://euromail.dev/changelog/2026-04-06/" rel="alternate" type="text/html"/>
    <summary type="text">7 new features, 6 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> add double opt-in toggle to contact list detail page</li><li><strong>embed:</strong> add default styles to signup form embed.js</li><li><strong>signup-forms:</strong> add customizable messages for form localization</li><li><strong>dashboard:</strong> add inbound email toggle to domain detail page</li><li><strong>design:</strong> European Editorial redesign with anti-slop rules</li><li><strong>smtp:</strong> switch bounce server to port 25 natively</li><li><strong>smtp:</strong> unified SMTP router for all inbound mail on port 25</li></ul><h3>Fixed</h3><ul><li><strong>api:</strong> allow any origin for subscribe embed endpoints</li><li><strong>admin:</strong> allow admin to change own plan and fix domain deletion FK</li><li><strong>db:</strong> repair domain deletion FK on partitioned emails table</li><li><strong>dashboard:</strong> cascade plan change to sub-accounts in admin panel</li><li><strong>ci:</strong> correct runner label for update-k8s-tags job</li><li><strong>dashboard:</strong> replace oversized checkmark animation with text-only copy feedback</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 5, 2026</title>
    <published>2026-04-05T00:00:00+00:00</published>
    <updated>2026-04-05T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-05/</id>
    <link href="https://euromail.dev/changelog/2026-04-05/" rel="alternate" type="text/html"/>
    <summary type="text">4 new features, 8 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> simplify domain detail page to Resend-style minimal layout</li><li><strong>docker:</strong> enable port 25 binding for non-root worker process</li><li><strong>seo:</strong> add sitemap index combining blog, docs, and legal sitemaps</li><li><strong>smtp:</strong> set bounce SMTP to standard port 25 for inbound delivery</li></ul><h3>Fixed</h3><ul><li><strong>api:</strong> install rustls CryptoProvider to prevent subscribe panic</li><li><strong>blog:</strong> fix newsletter CORS error and merge duplicate CTAs</li><li><strong>blog:</strong> use correct signup form slug for newsletter subscribe</li><li><strong>domain-connect:</strong> mark MX record as essential OnApply</li><li><strong>domain-connect:</strong> revert MX to essential Always (required for bounce handling)</li><li><strong>smtp:</strong> add NET_BIND_SERVICE capability to bind port 25</li><li><strong>smtp:</strong> capture tokio Handle for bounce/DMARC/complaint handlers</li><li><strong>smtp:</strong> revert bounce port to 2525 with iptables PREROUTING redirect</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 4, 2026</title>
    <published>2026-04-04T00:00:00+00:00</published>
    <updated>2026-04-04T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-04/</id>
    <link href="https://euromail.dev/changelog/2026-04-04/" rel="alternate" type="text/html"/>
    <summary type="text">12 new features, 13 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>blog:</strong> add "Send Your First Email in 5 Minutes" getting started tutorial</li><li><strong>blog:</strong> add "Why We Chose Rust for Transactional Email" post</li><li><strong>ci:</strong> add Python SDK publish workflow with PyPI trusted publisher</li><li><strong>dashboard:</strong> add animated SVG icon system for UI state feedback</li><li><strong>dashboard:</strong> animated SVG icon system for UI state feedback ([#icons](https://github.com/kalle-works/euromail.dev/issues/icons))</li><li><strong>dashboard:</strong> one-click Cloudflare DNS setup via Domain Connect</li><li><strong>dashboard:</strong> personalized code examples in onboarding with API key pre-filled</li><li><strong>docs:</strong> add sidebar navigation with TOC and sibling page links <a href="https://github.com/kalle-works/euromail.dev/issues/321" rel="noopener">#321</a></li><li><strong>domains:</strong> configurable sending subdomain for domain reputation isolation</li><li><strong>video:</strong> add procedurally generated ambient audio track</li><li><strong>video:</strong> add Remotion marketing video project</li><li><strong>video:</strong> design polish — iconic SVGs, centered grid, ambient audio ([#polish](https://github.com/kalle-works/euromail.dev/issues/polish))</li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> correct loading spinner rotation origin</li><li><strong>dashboard:</strong> redesign loading icon from spinner to envelope with pulsing dots</li><li><strong>docs:</strong> use consistent X-EuroMail-Api-Key header and update DNS docs</li><li><strong>domain-connect:</strong> add txtConflictMatchingMode to DKIM record</li><li><strong>domain-connect:</strong> use Prefix txtConflictMatchingMode with v=DKIM1 prefix</li><li><strong>landing:</strong> correct Go SDK import path to kalle-works/euromail-go</li><li><strong>landing:</strong> hide nginx version from response headers</li><li><strong>landing:</strong> update SDK links to standalone repos, add Python SDK</li><li><strong>security:</strong> remediate CSO audit findings</li><li><strong>tests:</strong> add missing provider_warmup_limits field and suppress clippy type_complexity</li><li><strong>tests:</strong> correct remaining CREATED -> ACCEPTED assertion in quota overage test</li><li><strong>tests:</strong> correct status codes and suppression reason in integration tests</li><li><strong>worker:</strong> seed warmup state for configured sending IPs on startup</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>April 3, 2026</title>
    <published>2026-04-03T00:00:00+00:00</published>
    <updated>2026-04-03T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-04-03/</id>
    <link href="https://euromail.dev/changelog/2026-04-03/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li>daily status report email with delivery metrics and warmup status <a href="https://github.com/kalle-works/euromail.dev/issues/320" rel="noopener">#320</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 31, 2026</title>
    <published>2026-03-31T00:00:00+00:00</published>
    <updated>2026-03-31T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-31/</id>
    <link href="https://euromail.dev/changelog/2026-03-31/" rel="alternate" type="text/html"/>
    <summary type="text">8 new features</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>billing:</strong> add annual billing with 2 months free <a href="https://github.com/kalle-works/euromail.dev/issues/316" rel="noopener">#316</a></li><li><strong>dashboard:</strong> add dark mode with toggle and localStorage <a href="https://github.com/kalle-works/euromail.dev/issues/317" rel="noopener">#317</a></li><li><strong>dashboard:</strong> warm empty states with CTAs across 10 pages <a href="https://github.com/kalle-works/euromail.dev/issues/311" rel="noopener">#311</a></li><li>onboarding wizard and overage billing for paid plans <a href="https://github.com/kalle-works/euromail.dev/issues/313" rel="noopener">#313</a></li><li>security.txt and suppression CSV import/export <a href="https://github.com/kalle-works/euromail.dev/issues/310" rel="noopener">#310</a></li><li><strong>status:</strong> add Vartio.dev status page integration <a href="https://github.com/kalle-works/euromail.dev/issues/312" rel="noopener">#312</a></li><li><strong>team:</strong> add team management with roles and invitations <a href="https://github.com/kalle-works/euromail.dev/issues/314" rel="noopener">#314</a></li><li><strong>team:</strong> auto-accept, account switcher, RBAC, invitation emails <a href="https://github.com/kalle-works/euromail.dev/issues/315" rel="noopener">#315</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 30, 2026</title>
    <published>2026-03-30T00:00:00+00:00</published>
    <updated>2026-03-30T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-30/</id>
    <link href="https://euromail.dev/changelog/2026-03-30/" rel="alternate" type="text/html"/>
    <summary type="text">13 new features, 3 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>api,sdk:</strong> accept string or array for email `to` field</li><li><strong>api:</strong> add /.well-known/security.txt (RFC 9116)</li><li><strong>api:</strong> add signup forms CRUD API and embeddable JS widget</li><li><strong>api:</strong> add suppression bulk import and CSV export</li><li><strong>dashboard:</strong> add dedicated sending IP admin UI</li><li><strong>dashboard:</strong> add send test email button to overview page</li><li><strong>docs:</strong> add quickstart guide with all 4 SDK examples</li><li>implement remaining issues (,,,) <a href="https://github.com/kalle-works/euromail.dev/issues/300" rel="noopener">#300</a></li><li><strong>landing:</strong> add Go SDK example and documentation links</li><li><strong>sdk:</strong> add missing API methods, fix response deserialization, add examples</li><li><strong>sdk:</strong> add signup form methods to all 4 SDKs</li><li><strong>smtp,dashboard:</strong> add SMTP headers and quota exceeded warnings <a href="https://github.com/kalle-works/euromail.dev/issues/299" rel="noopener">#299</a></li><li><strong>worker:</strong> add IP warmup auto-progression with bounce monitoring</li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> apply format_datetime filter to raw timestamps in template list and version history</li><li><strong>sdk:</strong> add HTTP timeout, HTTPS enforcement, and Python lockfile</li><li><strong>sdk:</strong> update Rust SDK tests for Recipient type and API envelope</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 29, 2026</title>
    <published>2026-03-29T00:00:00+00:00</published>
    <updated>2026-03-29T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-29/</id>
    <link href="https://euromail.dev/changelog/2026-03-29/" rel="alternate" type="text/html"/>
    <summary type="text">1 fix</summary>
    <content type="html"><![CDATA[<h3>Fixed</h3><ul><li><strong>ci:</strong> use self-hosted runner for k8s tag updates <a href="https://github.com/kalle-works/euromail.dev/issues/298" rel="noopener">#298</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 28, 2026</title>
    <published>2026-03-28T00:00:00+00:00</published>
    <updated>2026-03-28T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-28/</id>
    <link href="https://euromail.dev/changelog/2026-03-28/" rel="alternate" type="text/html"/>
    <summary type="text">2 new features, 7 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>tracking:</strong> add vanity tracking domain support (em.customer-domain)</li><li>newsletter microapp with signup forms, double opt-in, and blog integration <a href="https://github.com/kalle-works/euromail.dev/issues/288" rel="noopener">#288</a></li></ul><h3>Fixed</h3><ul><li><strong>worker:</strong> use Recreate strategy for hostNetwork deployment <a href="https://github.com/kalle-works/euromail.dev/issues/296" rel="noopener">#296</a></li><li><strong>landing:</strong> improve hero copy, feature links, text contrast, and registration UX <a href="https://github.com/kalle-works/euromail.dev/issues/295" rel="noopener">#295</a></li><li><strong>dns:</strong> update SPF record with correct SMTP node IPs and IPv6</li><li><strong>landing:</strong> use url-encoded form body for newsletter signup</li><li><strong>tests:</strong> register sidebar nav template in GDPR dashboard tests</li><li>suppress clippy too_many_arguments for query and task functions</li><li>apply cargo fmt formatting to newsletter microapp code</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 27, 2026</title>
    <published>2026-03-27T00:00:00+00:00</published>
    <updated>2026-03-27T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-27/</id>
    <link href="https://euromail.dev/changelog/2026-03-27/" rel="alternate" type="text/html"/>
    <summary type="text">3 new features, 1 fix</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>api:</strong> add broadcast endpoint for sending to contact lists</li><li><strong>dashboard:</strong> add DNS provider auto-detection and Resend-style records table</li><li><strong>dashboard:</strong> remodel domain setup and add premium animations <a href="https://github.com/kalle-works/euromail.dev/issues/283" rel="noopener">#283</a></li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> repair broken label contrast, standardize typography, and apply micro-interactions <a href="https://github.com/kalle-works/euromail.dev/issues/286" rel="noopener">#286</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 26, 2026</title>
    <published>2026-03-26T00:00:00+00:00</published>
    <updated>2026-03-26T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-26/</id>
    <link href="https://euromail.dev/changelog/2026-03-26/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature, 4 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> add dynamic sidebar with per-account feature visibility</li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> always show setup features in sidebar to prevent chicken-and-egg</li><li><strong>audit:</strong> propagate client IP to all audit log calls and configure TRUSTED_PROXIES</li><li><strong>audit:</strong> propagate client IP to all audit log calls and configure TRUSTED_PROXIES <a href="https://github.com/kalle-works/euromail.dev/issues/282" rel="noopener">#282</a></li><li><strong>smtp:</strong> bind outbound SMTP connections to configured sending IP <a href="https://github.com/kalle-works/euromail.dev/issues/281" rel="noopener">#281</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 25, 2026</title>
    <published>2026-03-25T00:00:00+00:00</published>
    <updated>2026-03-25T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-25/</id>
    <link href="https://euromail.dev/changelog/2026-03-25/" rel="alternate" type="text/html"/>
    <summary type="text">4 new features, 5 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>domains:</strong> remove root domain SPF from verification requirements <a href="https://github.com/kalle-works/euromail.dev/issues/273" rel="noopener">#273</a></li><li><strong>cli:</strong> add euromail-cli and fix dashboard scopes form <a href="https://github.com/kalle-works/euromail.dev/issues/269" rel="noopener">#269</a></li><li><strong>cli:</strong> add interactive auth command for API key setup <a href="https://github.com/kalle-works/euromail.dev/issues/270" rel="noopener">#270</a></li><li><strong>dashboard:</strong> declutter registration form <a href="https://github.com/kalle-works/euromail.dev/issues/268" rel="noopener">#268</a></li></ul><h3>Fixed</h3><ul><li><strong>smtp:</strong> filter DNSBL meta-responses from public resolver rejection <a href="https://github.com/kalle-works/euromail.dev/issues/280" rel="noopener">#280</a></li><li><strong>security:</strong> DNS pinning for webhook SSRF and audit logging gaps <a href="https://github.com/kalle-works/euromail.dev/issues/279" rel="noopener">#279</a></li><li><strong>security:</strong> remediate CSO audit findings — TLS deps, CI pinning, K8s hardening <a href="https://github.com/kalle-works/euromail.dev/issues/275" rel="noopener">#275</a></li><li><strong>blog,docs:</strong> remove generated illustrations from blog posts and guides <a href="https://github.com/kalle-works/euromail.dev/issues/267" rel="noopener">#267</a></li><li><strong>sdk:</strong> align Domain and Email types with actual API response <a href="https://github.com/kalle-works/euromail.dev/issues/272" rel="noopener">#272</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 23, 2026</title>
    <published>2026-03-23T00:00:00+00:00</published>
    <updated>2026-03-23T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-23/</id>
    <link href="https://euromail.dev/changelog/2026-03-23/" rel="alternate" type="text/html"/>
    <summary type="text">4 new features, 3 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>blog,docs:</strong> add illustrations to GDPR blog post and documentation guides</li><li><strong>blog:</strong> add illustrations to Gmail Postmaster Tools guide</li><li><strong>dashboard:</strong> enhance deliverability insights with volume chart and engagement metrics</li><li><strong>blog:</strong> add Google Postmaster Tools monitoring guide</li></ul><h3>Fixed</h3><ul><li><strong>blog:</strong> add missing image files for Gmail Postmaster Tools guide</li><li><strong>ci:</strong> prevent release builds from being cancelled mid-flight</li><li><strong>dashboard:</strong> CSP blocks fonts and Alpine.js in production <a href="https://github.com/kalle-works/euromail.dev/issues/265" rel="noopener">#265</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 22, 2026</title>
    <published>2026-03-22T00:00:00+00:00</published>
    <updated>2026-03-22T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-22/</id>
    <link href="https://euromail.dev/changelog/2026-03-22/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>docs:</strong> add guides for sub-accounts, email validation, DMARC, deliverability, and scheduled sending <a href="https://github.com/kalle-works/euromail.dev/issues/264" rel="noopener">#264</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 20, 2026</title>
    <published>2026-03-20T00:00:00+00:00</published>
    <updated>2026-03-20T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-20/</id>
    <link href="https://euromail.dev/changelog/2026-03-20/" rel="alternate" type="text/html"/>
    <summary type="text">3 new features, 8 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>design-system:</strong> implement DESIGN.md tokens across dashboard, landing and docs <a href="https://github.com/kalle-works/euromail.dev/issues/261" rel="noopener">#261</a></li><li><strong>sub-accounts:</strong> add multi-tenant sub-accounts with pooled quotas</li><li><strong>sub-accounts:</strong> merge multi-tenant sub-accounts feature</li></ul><h3>Fixed</h3><ul><li><strong>design-system:</strong> align dashboard logo color with warm gray-900 <a href="https://github.com/kalle-works/euromail.dev/issues/263" rel="noopener">#263</a></li><li><strong>design-system:</strong> complete warm palette and add tabular-nums <a href="https://github.com/kalle-works/euromail.dev/issues/262" rel="noopener">#262</a></li><li><strong>sdk:</strong> remove unused ApiKey import in Rust SDK sub_accounts module</li><li><strong>sub-accounts:</strong> add toast notifications and polish dashboard UX</li><li><strong>sub-accounts:</strong> correct HTTP status codes and test assertions for sub-account endpoints</li><li><strong>sub-accounts:</strong> correct quota SUM type mismatch and register dashboard templates</li><li><strong>sub-accounts:</strong> prevent quota race conditions and aggregate analytics auth gap</li><li><strong>sub-accounts:</strong> resolve CI lint and compilation issues</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 17, 2026</title>
    <published>2026-03-17T00:00:00+00:00</published>
    <updated>2026-03-17T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-17/</id>
    <link href="https://euromail.dev/changelog/2026-03-17/" rel="alternate" type="text/html"/>
    <summary type="text">5 new features</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>isp-reputation:</strong> add Google Postmaster Tools and Microsoft SNDS integration <a href="https://github.com/kalle-works/euromail.dev/issues/257" rel="noopener">#257</a> <a href="https://github.com/kalle-works/euromail.dev/issues/258" rel="noopener">#258</a></li><li><strong>tools:</strong> add templates-as-code CLI for managing email templates <a href="https://github.com/kalle-works/euromail.dev/issues/257" rel="noopener">#257</a></li><li><strong>dashboard:</strong> add interactive API playground <a href="https://github.com/kalle-works/euromail.dev/issues/256" rel="noopener">#256</a></li><li><strong>mcp:</strong> add MCP server for AI assistants <a href="https://github.com/kalle-works/euromail.dev/issues/255" rel="noopener">#255</a></li><li><strong>dashboard:</strong> add DNS copy-paste helper per provider <a href="https://github.com/kalle-works/euromail.dev/issues/254" rel="noopener">#254</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 16, 2026</title>
    <published>2026-03-16T00:00:00+00:00</published>
    <updated>2026-03-16T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-16/</id>
    <link href="https://euromail.dev/changelog/2026-03-16/" rel="alternate" type="text/html"/>
    <summary type="text">12 new features, 11 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> add webhook delivery debugger and email HTML preview <a href="https://github.com/kalle-works/euromail.dev/issues/253" rel="noopener">#253</a></li><li><strong>api:</strong> add email validation service endpoint <a href="https://github.com/kalle-works/euromail.dev/issues/252" rel="noopener">#252</a></li><li><strong>dashboard:</strong> DMARC monitoring dashboard with per-domain stats and trend charts <a href="https://github.com/kalle-works/euromail.dev/issues/251" rel="noopener">#251</a></li><li><strong>dashboard:</strong> add GDPR compliance report PDF generation <a href="https://github.com/kalle-works/euromail.dev/issues/250" rel="noopener">#250</a></li><li><strong>deploy:</strong> automate migration init container and CI image tag updates <a href="https://github.com/kalle-works/euromail.dev/issues/248" rel="noopener">#248</a></li><li><strong>metrics:</strong> add async operations observability metrics <a href="https://github.com/kalle-works/euromail.dev/issues/249" rel="noopener">#249</a></li><li><strong>sdk:</strong> automate Rust SDK versioning and publishing with release-plz <a href="https://github.com/kalle-works/euromail.dev/issues/239" rel="noopener">#239</a></li><li><strong>api:</strong> add async operations tracking for batch send and GDPR erase <a href="https://github.com/kalle-works/euromail.dev/issues/238" rel="noopener">#238</a></li><li><strong>dashboard:</strong> add deliverability insights page with ISP breakdown and reputation scoring <a href="https://github.com/kalle-works/euromail.dev/issues/237" rel="noopener">#237</a></li><li><strong>sdk:</strong> add API keys, GDPR modules and fix signature inconsistencies <a href="https://github.com/kalle-works/euromail.dev/issues/236" rel="noopener">#236</a></li><li><strong>auth:</strong> add scoped API keys with fine-grained permissions <a href="https://github.com/kalle-works/euromail.dev/issues/235" rel="noopener">#235</a></li><li><strong>auth:</strong> unify API and Dashboard auth into shared middleware <a href="https://github.com/kalle-works/euromail.dev/issues/234" rel="noopener">#234</a></li></ul><h3>Fixed</h3><ul><li><strong>api:</strong> post-sprint hardening — enum types, self-hosted Chart.js, query limits, tests <a href="https://github.com/kalle-works/euromail.dev/issues/247" rel="noopener">#247</a></li><li><strong>tests:</strong> check error type instead of status code for scope gate test</li><li><strong>api:</strong> correct operations SQL enum casting and scoped key test payloads</li><li><strong>ci:</strong> correct trigger function name in operations migration and apply cargo fmt</li><li><strong>dashboard:</strong> register admin domains template in Minijinja environment <a href="https://github.com/kalle-works/euromail.dev/issues/246" rel="noopener">#246</a></li><li><strong>sdk:</strong> allow dirty working directory in release-plz config <a href="https://github.com/kalle-works/euromail.dev/issues/244" rel="noopener">#244</a></li><li><strong>sdk:</strong> add missing permissions and config path for release-plz <a href="https://github.com/kalle-works/euromail.dev/issues/243" rel="noopener">#243</a></li><li><strong>sdk:</strong> install gh CLI on self-hosted runner for release-plz <a href="https://github.com/kalle-works/euromail.dev/issues/242" rel="noopener">#242</a></li><li><strong>sdk:</strong> install clippy component in CI toolchain <a href="https://github.com/kalle-works/euromail.dev/issues/241" rel="noopener">#241</a></li><li><strong>worker:</strong> use sorted set delay queue for webhook retry backoff <a href="https://github.com/kalle-works/euromail.dev/issues/232" rel="noopener">#232</a></li><li><strong>auth:</strong> return 503 Service Unavailable on database errors during authentication <a href="https://github.com/kalle-works/euromail.dev/issues/233" rel="noopener">#233</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 15, 2026</title>
    <published>2026-03-15T00:00:00+00:00</published>
    <updated>2026-03-15T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-15/</id>
    <link href="https://euromail.dev/changelog/2026-03-15/" rel="alternate" type="text/html"/>
    <summary type="text">9 new features, 1 fix</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> add live email event activity stream with SSE <a href="https://github.com/kalle-works/euromail.dev/issues/231" rel="noopener">#231</a></li><li><strong>dashboard:</strong> auto-generate API key on signup for instant onboarding <a href="https://github.com/kalle-works/euromail.dev/issues/230" rel="noopener">#230</a></li><li><strong>security:</strong> add comprehensive abuse prevention hardening <a href="https://github.com/kalle-works/euromail.dev/issues/229" rel="noopener">#229</a></li><li><strong>api:</strong> add scheduled email sending with delayed delivery <a href="https://github.com/kalle-works/euromail.dev/issues/228" rel="noopener">#228</a></li><li><strong>smtp:</strong> add configurable inbound SMTP rate limiting <a href="https://github.com/kalle-works/euromail.dev/issues/227" rel="noopener">#227</a></li><li><strong>dashboard:</strong> add DNS provider-specific setup wizard <a href="https://github.com/kalle-works/euromail.dev/issues/226" rel="noopener">#226</a></li><li><strong>landing:</strong> add og:image for light theme brand <a href="https://github.com/kalle-works/euromail.dev/issues/223" rel="noopener">#223</a></li><li><strong>landing:</strong> unify Zola templates with light theme <a href="https://github.com/kalle-works/euromail.dev/issues/222" rel="noopener">#222</a></li><li><strong>landing:</strong> redesign with Nordic light theme <a href="https://github.com/kalle-works/euromail.dev/issues/221" rel="noopener">#221</a></li></ul><h3>Fixed</h3><ul><li><strong>common:</strong> replace positional params with named structs <a href="https://github.com/kalle-works/euromail.dev/issues/225" rel="noopener">#225</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 14, 2026</title>
    <published>2026-03-14T00:00:00+00:00</published>
    <updated>2026-03-14T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-14/</id>
    <link href="https://euromail.dev/changelog/2026-03-14/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> hand-crafted light theme redesign <a href="https://github.com/kalle-works/euromail.dev/issues/220" rel="noopener">#220</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 13, 2026</title>
    <published>2026-03-13T00:00:00+00:00</published>
    <updated>2026-03-13T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-13/</id>
    <link href="https://euromail.dev/changelog/2026-03-13/" rel="alternate" type="text/html"/>
    <summary type="text">1 fix</summary>
    <content type="html"><![CDATA[<h3>Fixed</h3><ul><li><strong>k8s:</strong> bump image tags to v1.54.2 <a href="https://github.com/kalle-works/euromail.dev/issues/219" rel="noopener">#219</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 12, 2026</title>
    <published>2026-03-12T00:00:00+00:00</published>
    <updated>2026-03-12T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-12/</id>
    <link href="https://euromail.dev/changelog/2026-03-12/" rel="alternate" type="text/html"/>
    <summary type="text">1 fix</summary>
    <content type="html"><![CDATA[<h3>Fixed</h3><ul><li><strong>db:</strong> add ON DELETE SET NULL to emails.domain_id foreign key <a href="https://github.com/kalle-works/euromail.dev/issues/218" rel="noopener">#218</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 11, 2026</title>
    <published>2026-03-11T00:00:00+00:00</published>
    <updated>2026-03-11T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-11/</id>
    <link href="https://euromail.dev/changelog/2026-03-11/" rel="alternate" type="text/html"/>
    <summary type="text">13 new features, 13 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>domains:</strong> simplify DNS setup from 5 records to 3 records</li><li><strong>dashboard:</strong> comprehensive admin panel improvements <a href="https://github.com/kalle-works/euromail.dev/issues/215" rel="noopener">#215</a></li><li><strong>sdk:</strong> support EUROMAIL_API_URL environment variable for base URL <a href="https://github.com/kalle-works/euromail.dev/issues/212" rel="noopener">#212</a></li><li><strong>dashboard:</strong> add subdomain sending recommendation for root domains <a href="https://github.com/kalle-works/euromail.dev/issues/205" rel="noopener">#205</a> <a href="https://github.com/kalle-works/euromail.dev/issues/206" rel="noopener">#206</a></li><li><strong>dns:</strong> add SPF DNS lookup count validation per RFC 7208 <a href="https://github.com/kalle-works/euromail.dev/issues/204" rel="noopener">#204</a> <a href="https://github.com/kalle-works/euromail.dev/issues/208" rel="noopener">#208</a></li><li><strong>smtp:</strong> add ARC (Authenticated Received Chain) support per RFC 8617 <a href="https://github.com/kalle-works/euromail.dev/issues/200" rel="noopener">#200</a> <a href="https://github.com/kalle-works/euromail.dev/issues/210" rel="noopener">#210</a></li><li><strong>smtp:</strong> add DANE TLSA certificate verification for outbound delivery <a href="https://github.com/kalle-works/euromail.dev/issues/211" rel="noopener">#211</a></li><li><strong>smtp:</strong> add dedicated IP assignment per account <a href="https://github.com/kalle-works/euromail.dev/issues/203" rel="noopener">#203</a> <a href="https://github.com/kalle-works/euromail.dev/issues/209" rel="noopener">#209</a></li><li><strong>smtp:</strong> add PTR/rDNS validation for sending IPs at startup <a href="https://github.com/kalle-works/euromail.dev/issues/202" rel="noopener">#202</a> <a href="https://github.com/kalle-works/euromail.dev/issues/207" rel="noopener">#207</a></li><li><strong>ci:</strong> auto-cancel outdated CI and Release workflow runs <a href="https://github.com/kalle-works/euromail.dev/issues/184" rel="noopener">#184</a></li><li><strong>ci:</strong> auto-cancel outdated SDK workflow runs <a href="https://github.com/kalle-works/euromail.dev/issues/183" rel="noopener">#183</a></li><li><strong>sdk:</strong> add crates.io publish workflow and metadata for Rust SDK <a href="https://github.com/kalle-works/euromail.dev/issues/180" rel="noopener">#180</a></li><li><strong>sdk:</strong> upgrade Rust SDK to edition 2024 <a href="https://github.com/kalle-works/euromail.dev/issues/181" rel="noopener">#181</a></li></ul><h3>Fixed</h3><ul><li><strong>ci:</strong> use GHCR-mirrored service images to avoid Docker Hub rate limits</li><li><strong>dashboard:</strong> add list filter to split iterator in setup_content template</li><li><strong>dashboard:</strong> resolve domain detail 500, overview SQL errors, and enable tracking <a href="https://github.com/kalle-works/euromail.dev/issues/214" rel="noopener">#214</a></li><li><strong>landing:</strong> replace Python code example with Rust in hero tabs</li><li><strong>landing:</strong> replace Python SDK with Rust SDK in landing page</li><li><strong>landing:</strong> add main landmark and fix code tab contrast</li><li><strong>landing:</strong> add cache-busting query strings to static assets</li><li><strong>landing:</strong> improve Lighthouse accessibility and performance scores <a href="https://github.com/kalle-works/euromail.dev/issues/213" rel="noopener">#213</a></li><li><strong>sdk:</strong> add workflow file to TypeScript SDK CI trigger paths and re-trigger npm publish <a href="https://github.com/kalle-works/euromail.dev/issues/199" rel="noopener">#199</a></li><li><strong>sdk:</strong> add build dependencies and fix CI for Rust SDK crates.io publish <a href="https://github.com/kalle-works/euromail.dev/issues/198" rel="noopener">#198</a></li><li><strong>workspace:</strong> apply rustfmt formatting across source files <a href="https://github.com/kalle-works/euromail.dev/issues/197" rel="noopener">#197</a></li><li><strong>dashboard:</strong> guard analytics charts against empty daily_stats data <a href="https://github.com/kalle-works/euromail.dev/issues/196" rel="noopener">#196</a></li><li><strong>sdk:</strong> install Rust toolchain via dtolnay/rust-toolchain in CI <a href="https://github.com/kalle-works/euromail.dev/issues/182" rel="noopener">#182</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 10, 2026</title>
    <published>2026-03-10T00:00:00+00:00</published>
    <updated>2026-03-10T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-10/</id>
    <link href="https://euromail.dev/changelog/2026-03-10/" rel="alternate" type="text/html"/>
    <summary type="text">6 new features, 3 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> add TOTP two-factor authentication for accounts <a href="https://github.com/kalle-works/euromail.dev/issues/179" rel="noopener">#179</a></li><li><strong>docs:</strong> add inbound email processing guide <a href="https://github.com/kalle-works/euromail.dev/issues/178" rel="noopener">#178</a></li><li><strong>api:</strong> add per-email GDPR export and erasure endpoints <a href="https://github.com/kalle-works/euromail.dev/issues/175" rel="noopener">#175</a></li><li><strong>dashboard:</strong> add template version history, diff, and rollback <a href="https://github.com/kalle-works/euromail.dev/issues/176" rel="noopener">#176</a></li><li><strong>smtp:</strong> add MTA-STS policy checking for outbound delivery <a href="https://github.com/kalle-works/euromail.dev/issues/177" rel="noopener">#177</a></li><li><strong>ci:</strong> add automated npm publish workflow for TypeScript SDK <a href="https://github.com/kalle-works/euromail.dev/issues/174" rel="noopener">#174</a></li></ul><h3>Fixed</h3><ul><li><strong>ci:</strong> use self-hosted runner for SDK TypeScript workflow</li><li><strong>sdk:</strong> bump @euromail/sdk to 0.1.1 to trigger first npm publish</li><li><strong>docs:</strong> remove unimplemented feature claims from site and documentation <a href="https://github.com/kalle-works/euromail.dev/issues/173" rel="noopener">#173</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 9, 2026</title>
    <published>2026-03-09T00:00:00+00:00</published>
    <updated>2026-03-09T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-09/</id>
    <link href="https://euromail.dev/changelog/2026-03-09/" rel="alternate" type="text/html"/>
    <summary type="text">4 new features, 7 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>sdks:</strong> add Go SDK and update TypeScript, Python, Rust SDKs with full API coverage <a href="https://github.com/kalle-works/euromail.dev/issues/163" rel="noopener">#163</a></li><li><strong>dashboard:</strong> add step-by-step domain DNS setup wizard with manual mode toggle <a href="https://github.com/kalle-works/euromail.dev/issues/162" rel="noopener">#162</a></li><li><strong>ci:</strong> rename runner label to kalle-works-arm64 for org-level access</li><li><strong>inbound:</strong> inbound email for AI agents <a href="https://github.com/kalle-works/euromail.dev/issues/142" rel="noopener">#142</a></li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> rewrite domain setup wizard for Alpine.js CSP-safe build <a href="https://github.com/kalle-works/euromail.dev/issues/169" rel="noopener">#169</a></li><li><strong>dashboard:</strong> register setup_content.html template in load_templates <a href="https://github.com/kalle-works/euromail.dev/issues/167" rel="noopener">#167</a></li><li><strong>docker:</strong> make sccache conditional on AWS credentials <a href="https://github.com/kalle-works/euromail.dev/issues/165" rel="noopener">#165</a></li><li><strong>ci:</strong> apply rustfmt to resolve CI formatting failures <a href="https://github.com/kalle-works/euromail.dev/issues/164" rel="noopener">#164</a></li><li><strong>dashboard:</strong> improve inbound UI with CSP-safe Alpine, responsive tables, and date filters <a href="https://github.com/kalle-works/euromail.dev/issues/159" rel="noopener">#159</a></li><li><strong>dashboard:</strong> register inbound route templates and fix nav syntax error <a href="https://github.com/kalle-works/euromail.dev/issues/151" rel="noopener">#151</a></li><li><strong>dashboard:</strong> improve onboarding UX for unverified accounts <a href="https://github.com/kalle-works/euromail.dev/issues/130" rel="noopener">#130</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 8, 2026</title>
    <published>2026-03-08T00:00:00+00:00</published>
    <updated>2026-03-08T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-08/</id>
    <link href="https://euromail.dev/changelog/2026-03-08/" rel="alternate" type="text/html"/>
    <summary type="text">8 new features, 10 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>docs:</strong> add feature guide documentation pages with landing page integration <a href="https://github.com/kalle-works/euromail.dev/issues/101" rel="noopener">#101</a></li><li><strong>api:</strong> add A2A agent-card, agents.json, and expand AI discoverability</li><li><strong>dashboard:</strong> add Alpine.js toast notification system with animations</li><li><strong>dashboard:</strong> comprehensive UI/UX, accessibility, and security improvements <a href="https://github.com/kalle-works/euromail.dev/issues/87" rel="noopener">#87</a></li><li><strong>mcp:</strong> add llms.txt to landing page and MCP server for EuroMail API</li><li><strong>sdks:</strong> complete TypeScript SDK and create Rust SDK with full API coverage</li><li><strong>api,worker,smtp,common,dashboard:</strong> add production readiness infrastructure</li><li><strong>billing:</strong> operationalize Stripe integration with webhook idempotency, trial support, and consolidated helpers</li></ul><h3>Fixed</h3><ul><li><strong>ci:</strong> add Docker Hub login to avoid pull rate limits</li><li><strong>landing,dashboard:</strong> improve anchor navigation, hero clarity, and signup form</li><li><strong>dashboard:</strong> add focus indicators, aria-hidden, and autocomplete to templates</li><li><strong>dashboard:</strong> exclude whitespace from special characters in password validation</li><li><strong>dashboard:</strong> strengthen password policy, brute-force limits, and registration rate limiting</li><li><strong>api,smtp:</strong> replace production unwraps with proper error handling <a href="https://github.com/kalle-works/euromail.dev/issues/76" rel="noopener">#76</a></li><li><strong>api,tests:</strong> resolve 9 failing integration tests across analytics, contact lists, and unsubscribe</li><li><strong>common:</strong> suppress clippy too_many_arguments on DB upsert functions</li><li>remove accidentally committed sdks/rust/target and fix gitignore</li><li><strong>tests:</strong> add missing AppConfig timeout fields to test initializers</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 6, 2026</title>
    <published>2026-03-06T00:00:00+00:00</published>
    <updated>2026-03-06T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-06/</id>
    <link href="https://euromail.dev/changelog/2026-03-06/" rel="alternate" type="text/html"/>
    <summary type="text">1 new feature</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>api,dashboard,worker:</strong> add unsubscribe/contact lists and analytics dashboard</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 5, 2026</title>
    <published>2026-03-05T00:00:00+00:00</published>
    <updated>2026-03-05T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-05/</id>
    <link href="https://euromail.dev/changelog/2026-03-05/" rel="alternate" type="text/html"/>
    <summary type="text">2 new features, 2 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> add UI reviewer custom subagent for design consistency <a href="https://github.com/kalle-works/euromail.dev/issues/65" rel="noopener">#65</a></li><li><strong>dashboard:</strong> add Alpine.js collapse plugin for smooth DNS record animations <a href="https://github.com/kalle-works/euromail.dev/issues/64" rel="noopener">#64</a></li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> standardize design tokens across all templates <a href="https://github.com/kalle-works/euromail.dev/issues/66" rel="noopener">#66</a></li><li><strong>dashboard:</strong> replace tojson filter with conditional template logic</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 4, 2026</title>
    <published>2026-03-04T00:00:00+00:00</published>
    <updated>2026-03-04T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-04/</id>
    <link href="https://euromail.dev/changelog/2026-03-04/" rel="alternate" type="text/html"/>
    <summary type="text">10 new features, 9 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dashboard:</strong> simplify domain detail page with collapsible DNS records <a href="https://github.com/kalle-works/euromail.dev/issues/63" rel="noopener">#63</a></li><li><strong>api:</strong> add machine-readable error codes, rate limit headers, and documentation links <a href="https://github.com/kalle-works/euromail.dev/issues/59" rel="noopener">#59</a></li><li><strong>dx:</strong> add DNS auto-retry timer and sandbox mode for unverified domains <a href="https://github.com/kalle-works/euromail.dev/issues/60" rel="noopener">#60</a></li><li><strong>dashboard:</strong> add getting started onboarding checklist to overview <a href="https://github.com/kalle-works/euromail.dev/issues/58" rel="noopener">#58</a></li><li><strong>dashboard:</strong> improve accessibility and WCAG compliance <a href="https://github.com/kalle-works/euromail.dev/issues/57" rel="noopener">#57</a></li><li><strong>dashboard:</strong> add send test email button on domain detail page <a href="https://github.com/kalle-works/euromail.dev/issues/56" rel="noopener">#56</a></li><li><strong>dashboard:</strong> add domain detail page with list-to-detail navigation <a href="https://github.com/kalle-works/euromail.dev/issues/55" rel="noopener">#55</a></li><li><strong>dashboard:</strong> improve DNS verification UX with cleaner messages and auto-check on domain add</li><li><strong>dashboard:</strong> show smart DNS merge suggestions for existing records</li><li><strong>dashboard:</strong> animated domain add UX and real DNS verification</li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> use idiomatic range contains in format_date filter</li><li><strong>ci:</strong> migrate all jobs to self-hosted runner <a href="https://github.com/kalle-works/euromail.dev/issues/61" rel="noopener">#61</a></li><li><strong>dashboard:</strong> apply rustfmt to send test email handler</li><li><strong>dashboard:</strong> apply rustfmt to domain delete handler</li><li><strong>common:</strong> use tokens.contains() instead of iter().any() per clippy</li><li><strong>dashboard:</strong> register admin templates in include_str loader</li><li><strong>common:</strong> apply cargo fmt to dns merge suggestion functions</li><li><strong>dashboard:</strong> register new domain templates in include_str loader</li><li><strong>landing:</strong> add HSTS header, canonical URL, og:image, RSS autodiscovery, and deduplicate footer CSS</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 3, 2026</title>
    <published>2026-03-03T00:00:00+00:00</published>
    <updated>2026-03-03T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-03/</id>
    <link href="https://euromail.dev/changelog/2026-03-03/" rel="alternate" type="text/html"/>
    <summary type="text">5 new features, 3 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>landing:</strong> add Zola-powered legal pages for Privacy Policy, Terms of Service, and DPA <a href="https://github.com/kalle-works/euromail.dev/issues/51" rel="noopener">#51</a></li><li><strong>landing:</strong> add auto-generated API documentation from OpenAPI spec <a href="https://github.com/kalle-works/euromail.dev/issues/50" rel="noopener">#50</a></li><li><strong>landing:</strong> add Zola-powered blog with GDPR article <a href="https://github.com/kalle-works/euromail.dev/issues/48" rel="noopener">#48</a></li><li><strong>dashboard:</strong> add admin panel for account and reputation management</li><li><strong>reputation:</strong> add automated bad actor detection and account suspension</li></ul><h3>Fixed</h3><ul><li><strong>api:</strong> resolve clippy warnings in gen_api_docs</li><li>apply cargo fmt to all workspace crates</li><li><strong>landing:</strong> extend logo SVG viewBox to prevent shield clipping <a href="https://github.com/kalle-works/euromail.dev/issues/49" rel="noopener">#49</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 2, 2026</title>
    <published>2026-03-02T00:00:00+00:00</published>
    <updated>2026-03-02T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-02/</id>
    <link href="https://euromail.dev/changelog/2026-03-02/" rel="alternate" type="text/html"/>
    <summary type="text">6 new features, 8 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>dmarc:</strong> bind DMARC reports to customer accounts for multi-tenant filtering <a href="https://github.com/kalle-works/euromail.dev/issues/43" rel="noopener">#43</a></li><li><strong>worker:</strong> receive and display DMARC aggregate reports</li><li><strong>dashboard:</strong> DKIM-sign system emails for improved deliverability</li><li><strong>tests:</strong> add E2E tests for system email delivery</li><li><strong>dashboard:</strong> deliver system emails via direct MX resolution</li><li><strong>docker:</strong> unify Dockerfiles with cargo-chef, sccache and registry cache</li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> use correct DKIM selector "euromail" for system emails</li><li><strong>api:</strong> log version on startup for deployment verification</li><li><strong>dashboard:</strong> apply rustfmt to system_email module</li><li><strong>docker:</strong> bump Rust base image to 1.88-bookworm</li><li><strong>docker:</strong> pin Rust base image to 1.85-bookworm for reproducible builds</li><li><strong>deploy:</strong> update image tag to v1.12.1 for Flux deployment</li><li><strong>ci:</strong> add workflow_dispatch trigger to Release workflow</li><li><strong>docker:</strong> add OCI source label to link GHCR packages to repository</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>March 1, 2026</title>
    <published>2026-03-01T00:00:00+00:00</published>
    <updated>2026-03-01T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-03-01/</id>
    <link href="https://euromail.dev/changelog/2026-03-01/" rel="alternate" type="text/html"/>
    <summary type="text">8 new features, 5 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>ci:</strong> add self-hosted ARM64 runner via ARC for native Docker builds</li><li><strong>api:</strong> add migrate-only subcommand and improve K8s deployment reliability <a href="https://github.com/kalle-works/euromail.dev/issues/21" rel="noopener">#21</a></li><li><strong>dashboard:</strong> compile Tailwind CSS locally, add error feedback, cache invalidation, and E2E tests <a href="https://github.com/kalle-works/euromail.dev/issues/17" rel="noopener">#17</a></li><li><strong>dashboard:</strong> replace PNG logo with SVG and add favicon</li><li><strong>infra:</strong> migrate DNS to Cloudflare and configure euromail.dev domain</li><li><strong>landing:</strong> add euromail.dev root domain landing page</li><li><strong>smtp:</strong> configurable EHLO hostname and DNSBL blocklist monitoring <a href="https://github.com/kalle-works/euromail.dev/issues/20" rel="noopener">#20</a></li><li><strong>smtp:</strong> DKIM SPKI format, per-domain bounce, and 5xx error handling <a href="https://github.com/kalle-works/euromail.dev/issues/19" rel="noopener">#19</a></li></ul><h3>Fixed</h3><ul><li><strong>smtp:</strong> extract DeliveryOptions struct to resolve clippy too_many_arguments</li><li><strong>tests:</strong> add missing smtp_ehlo_hostname field and apply cargo fmt</li><li><strong>dashboard:</strong> replace Alpine.js with CSP-safe build <a href="https://github.com/kalle-works/euromail.dev/issues/18" rel="noopener">#18</a></li><li><strong>dashboard:</strong> use POST for template update route and add CSP unsafe-inline <a href="https://github.com/kalle-works/euromail.dev/issues/16" rel="noopener">#16</a></li><li><strong>worker:</strong> strip angle brackets from Message-ID for RFC 5322 compliance <a href="https://github.com/kalle-works/euromail.dev/issues/15" rel="noopener">#15</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>February 19, 2026</title>
    <published>2026-02-19T00:00:00+00:00</published>
    <updated>2026-02-19T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-02-19/</id>
    <link href="https://euromail.dev/changelog/2026-02-19/" rel="alternate" type="text/html"/>
    <summary type="text">3 fixes</summary>
    <content type="html"><![CDATA[<h3>Fixed</h3><ul><li><strong>dashboard:</strong> serve static assets in Docker and fix CSP for Tailwind CDN <a href="https://github.com/kalle-works/euromail.dev/issues/14" rel="noopener">#14</a></li><li><strong>dashboard:</strong> CSRF token on first visit and rustls CryptoProvider <a href="https://github.com/kalle-works/euromail.dev/issues/13" rel="noopener">#13</a></li><li><strong>dashboard:</strong> register all templates and add .dockerignore <a href="https://github.com/kalle-works/euromail.dev/issues/12" rel="noopener">#12</a></li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>February 18, 2026</title>
    <published>2026-02-18T00:00:00+00:00</published>
    <updated>2026-02-18T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-02-18/</id>
    <link href="https://euromail.dev/changelog/2026-02-18/" rel="alternate" type="text/html"/>
    <summary type="text">9 new features, 6 fixes</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>deploy:</strong> migrate from UpCloud to Hetzner K3s with FluxCD GitOps</li><li><strong>branding:</strong> add EuroMail logo to API and dashboard</li><li><strong>docs,legal:</strong> add project documentation, privacy policy, ToS, and DPA</li><li><strong>api:</strong> add LLM discoverability endpoints for AI coding assistants</li><li><strong>billing,fbl:</strong> ARF complaint handling and Stripe billing integration</li><li><strong>platform:</strong> system email delivery, OpenAPI completeness, error pages, env documentation</li><li><strong>platform:</strong> production readiness — signup, password reset, CSRF, BCC delivery, attachments, tracking, audit log, GDPR, retention</li><li><strong>security:</strong> batch suppression queries, billing-cycle quota keys, metrics auth, BCC privacy, template validation</li><li><strong>worker:</strong> partition-pruned queries, bounce rate guard, retry backoff, TLS enforcement, quota reconciliation</li></ul><h3>Fixed</h3><ul><li><strong>dashboard:</strong> add /health endpoint for K8s liveness and readiness probes</li><li><strong>api:</strong> check domain duplicates before plan limits and fix test data</li><li><strong>ci:</strong> detect semantic-release version via git tag comparison</li><li><strong>ci:</strong> add missing workflow permissions and resolve parallel test panics</li><li><strong>ci:</strong> eliminate duplicate workflow runs on PR branches</li><li><strong>ci:</strong> resolve formatting, clippy, and security audit failures</li></ul>
    ]]></content>
  </entry>
  <entry>
    <title>February 17, 2026</title>
    <published>2026-02-17T00:00:00+00:00</published>
    <updated>2026-02-17T00:00:00+00:00</updated>
    <id>https://euromail.dev/changelog/2026-02-17/</id>
    <link href="https://euromail.dev/changelog/2026-02-17/" rel="alternate" type="text/html"/>
    <summary type="text">24 new features, 1 fix</summary>
    <content type="html"><![CDATA[<h3>New</h3><ul><li><strong>security:</strong> CC/BCC suppression guards, deterministic IP hash, domain cache invalidation, custom headers</li><li><strong>smtp:</strong> VERP return-path for reliable bounce-to-email matching</li><li><strong>api:</strong> add domain cache and configurable DB pool for higher throughput</li><li><strong>api:</strong> add hard bounce suppression, pagination with total counts, and test webhook delivery</li><li><strong>api:</strong> add idempotency keys, account endpoint, bounce buffer limit, webhook auto-recovery</li><li><strong>api:</strong> add OpenAPI documentation with Swagger UI</li><li><strong>api:</strong> add SHA-256 API key cache and optimize auth + Docker setup</li><li><strong>domains:</strong> generate DKIM keypairs at registration and implement DNS verification</li><li><strong>euromail:</strong> implement complete transactional email service</li><li><strong>helm:</strong> add production hardening with security contexts, probes, PDBs, and alerting</li><li><strong>observability:</strong> add Prometheus metrics and OpenTelemetry OTLP tracing</li><li><strong>ops:</strong> add composite DB indexes, worker readiness probe, and template render timeout</li><li><strong>ops:</strong> add cross-process API key cache invalidation, worker port dedup, and dashboard error logging</li><li><strong>quota:</strong> replace DB quota with Redis atomic counting and partition emails table</li><li><strong>resilience:</strong> add graceful shutdown, DB pool hardening, and worker task draining</li><li><strong>resilience:</strong> domain validation, quota batch sync, JWT pinning, and orphan prevention</li><li><strong>security:</strong> add CSPRNG, SSRF protection, security headers, per-account rate limits, login brute-force guard</li><li><strong>security:</strong> add email validation, body size limits, template fuel cap, and streaming webhook reads</li><li><strong>security:</strong> bounce guard, partition pruning, config validation, template tenant isolation</li><li><strong>security:</strong> bounce tenant isolation, webhook HMAC timestamps, SDK contract fixes</li><li><strong>security:</strong> dashboard tenant isolation, input validation, SDK response alignment</li><li><strong>smtp:</strong> add stream MAXLEN, multi-IP pool, warm-up schedule, circuit breakers</li><li><strong>smtp:</strong> enforce STARTTLS, recover stuck emails, harden webhooks and session cookies</li><li><strong>worker:</strong> add webhook retry with exponential backoff and HTML-to-plaintext fallback</li></ul><h3>Fixed</h3><ul><li><strong>data-integrity:</strong> orphan cleanup, bounce scoping, DKIM generation, quota reset, SDK fixes</li></ul>
    ]]></content>
  </entry>
</feed>
