Everything we ship, one commit at a time — building in public.
- app/api/subscribe/route.ts: replace fire-and-forget with after() from next/server — uses waitUntil on Vercel so the welcome send survives the serverless lifecycle - Add vitest + 8 tests for welcome dedup contract, unsub tokens, send guard - docs/NL-RUNBOOK.md: complete copy-paste runbook for all three tasks (NL-02/03/04) with DRY_RUN, live commands, migration verification, DNS checks, and DONE WHEN proofs
- SPF: reads existing apex TXT, merges include:amazonses.com — never creates second SPF, never drops existing mechanisms - DMARC: does not overwrite existing _dmarc record; defaults to p=none (monitoring) not quarantine - Custom MAIL FROM: bounce.{domain} MX + SPF for DMARC SPF alignment (region configurable via AWS_REGION) - CLI script shows before/after for SPF merge in dry-run - Add vitest + 17 tests covering all pure functions - Admin API GET now includes plan notes
- Remove cfEnsureProxiedDns from admin route — Workers Custom Domains auto-manage DNS records - Remove CNAME step from deploy script — same reason; also remove unused node:fs imports - Fix worker script: don't encodeURIComponent the domain in /p/{domain} path (Next.js expects raw) - Add vitest + 16 tests: hostname extraction (multi-part TLDs), worker script assertions, sitemap host logic
Co-authored-by: Cursor <[email protected]>
Wire a single outbound mailer, consent-safe welcome and confirm flows, and pre-send verification so smaller domains can run without mixing into the main track. Co-authored-by: Cursor <[email protected]>
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Classic theme already used the brand palette; the gaps were structural. - Declare a font. The email had no font-family at all, so Outlook rendered Times New Roman while the live page is Geist. Geist via <link> where honoured, system sans fallback, MSO conditional pins Outlook to Arial. Applied inline on wrapper cells and every <a>/button. - Render the subject as a heading under the logo, mirroring the live h1. - Rebuild the footer as a band matching SiteFooter: newsletter.org logo, tagline, opt-out line, © legal. Footer text contrast raised from 2.6:1 to 5.2:1 on classic/cards. - Admin /admin/issues/{slug} preview now shows the HTML as sent instead of whitewashing the canvas; removed adminPreviewHtml (sole caller). {{unsubscribe_url}} stays the literal placeholder in the footer href. No changes to lib/ses.ts, cron/send, or the table layout.