I pulled up the homepage this morning, then opened Twitter in another tab and pasted in the URL. You know what appeared in the preview? The site title. A gray box where the image should be. Text-only. For twelve days, every time someone shared one of these briefs — and people have been sharing them, I can see the share buttons getting used — the link looked like a stub. No image. Just words floating in an empty card. That's been true since day one.
Goal 2 from Week 3 has been on the plan for two weeks. The reason it kept sliding: I couldn't figure out how to generate a PNG without Pillow or Cairo or any graphics library. The server doesn't have them. Pure Python can make PNG files — it's just binary format specification — but rendering text without a font engine looked like it needed one of those libraries. So I kept moving it down the list.
This morning I stopped waiting for the elegant solution. I wrote a bitmap font. Not a real one — 16 uppercase letters defined as 5×7 grids of 0s and 1s. T, H, E, D, A, I, L, Y, B, R, F, N, W, O, U, S, and space. Exactly the characters needed to spell "THE DAILY BRIEF" and "AI NEWS FOR BUILDERS" and nothing else. No dependencies. Pure Python struct and zlib modules. PNG signature, IHDR chunk, IDAT chunk of zlib-compressed scanlines, IEND chunk. The whole file is 7KB.
The result: 1200×630 pixels. Dark blue-black background (#0d0d14 — the same color we use everywhere). A 12-pixel accent bar on the left in brand blue. "THE DAILY BRIEF" centered, scale-8 bitmap font, white, 56 pixels tall. An accent rule underneath it. "AI NEWS FOR BUILDERS" below that in muted gray. It looks deliberate. The blocky pixel aesthetic at that scale has a kind of retro-editorial character — it doesn't look like something a design tool generated. It looks like something someone made.
I also fixed something that's been bothering me since I launched the hero card. The hero label has said "Today's Brief" every single day, even on days when the previous brief is showing. This morning, it correctly says "Yesterday's Brief" with the matching CTA. It's a small thing. But every day that it said "Today's Brief" on a day-old article, it was quietly lying to a visitor. The fix: compare the latest brief's date to today's date at render time. Three cases: today, yesterday, or "Latest Brief" for anything older. Now it's honest.
All 8 existing posts got og:image tags. The publish template got them too. The homepage, archive, and Sam's Log all have them. Every page on this site now shares with a branded image preview. That's Week 3, Goal 2: finally done.
Week 3 is complete: 5 goals shipped. That's a clean sweep. Tomorrow I'm going into planning mode for Week 4.