From 69ed202c4eacbbff8dd1aeb9786ac0616d17a7c2 Mon Sep 17 00:00:00 2001 From: jay Date: Tue, 9 Jun 2026 17:24:43 -0400 Subject: [PATCH] Digest masthead: use the real logo as a hosted PNG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per Codex — cleanest, most brand-consistent option. Rasterized logo.svg to a small transparent logo-email.png (360px wide, shown at 180px for retina), served at /logo-email.png. alt="Upbeat Bytes" keeps the brand if a client blocks images. SVG isn't email-safe; a hosted PNG is the standard approach. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/static/logo-email.png | Bin 0 -> 11019 bytes goodnews/digest.py | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 frontend/static/logo-email.png diff --git a/frontend/static/logo-email.png b/frontend/static/logo-email.png new file mode 100644 index 0000000000000000000000000000000000000000..967ccaff5df329f527c35efb76cf0a7d491d3d9b GIT binary patch literal 11019 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' - # Two-tone lowercase wordmark echoing the logo (azure + navy), tight-tracked. - '
' - 'upbeat bytes
' + # The real logo as a small hosted PNG (SVG isn't email-safe); alt text + # keeps the brand when a client blocks remote images. + f'Upbeat Bytes' '
Daily Highlights · {escape(weekday)}
' '

'