You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Blog cards: thumbnail beside the summary, and bust the CSS cache
The reported symptom — enormous images and arrows, no card framing — was
the blog CSS not applying at all. styles.css is served with max-age=14400
and was linked without a version, so browsers held the pre-blog stylesheet
against the new markup and fell back to intrinsic sizes. Link it as
styles.css?v=3 on all three pages so the rules actually arrive.
Rework the card as a horizontal media object: a 236px thumbnail on the
left, summary on the right, in a single 900px column so lines stay a
readable length. The thumbnail fills its column via absolute inset, so it
tracks the card height the text sets. Below 940px it narrows to 190px;
below 560px it stacks with the image on top. The post hero is capped at
340px so a wide screenshot no longer pushes the headline off-screen.
Also make that failure mode survivable rather than catastrophic: inline
icons and images now carry width/height, so missing CSS yields a plain
page instead of full-bleed screenshots and 300px arrows. Image dimensions
double as aspect-ratio hints, removing load-time layout shift.
build.py now matches the stylesheet link by pattern — the exact-string
replace would have silently skipped inlining and emitted an unstyled
bundle the moment a version query appeared.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
<imgsrc="assets/img/aetherial-strip.jpg" alt="The Aetherial signal-chain strip in AetherSDR, showing the processing stages end to end" loading="lazy" />
126
+
<imgwidth="1400" height="926" src="assets/img/aetherial-strip.jpg" alt="The Aetherial signal-chain strip in AetherSDR, showing the processing stages end to end" loading="lazy" />
127
127
</div>
128
128
<divclass="blog-card-body">
129
129
<spanclass="blog-meta">
@@ -137,14 +137,14 @@ <h3>Inside the Aetherial signal chain</h3>
137
137
what each stage does to the audio, why the order matters, and how to
138
138
set it up for a crowded band without over-processing yourself into mush.</p>
<imgsrc="assets/img/hero-3dss.jpg" alt="AetherSDR's 3D stacked-trace panadapter over the 40m band with the full control surface" loading="lazy" />
147
+
<imgwidth="1640" height="830" src="assets/img/hero-3dss.jpg" alt="AetherSDR's 3D stacked-trace panadapter over the 40m band with the full control surface" loading="lazy" />
148
148
</div>
149
149
<divclass="blog-card-body">
150
150
<spanclass="blog-meta">
@@ -158,7 +158,7 @@ <h3>Native on three platforms, no compromises</h3>
158
158
Qt6 and C++20 codebase. Here's how the build is structured, and where
159
159
platform-specific code actually earns its keep.</p>
<imgsrc="assets/img/aetherial-strip.jpg" alt="The Aetherial signal-chain strip in AetherSDR, showing the processing stages end to end" />
247
+
<imgwidth="1400" height="926" src="assets/img/aetherial-strip.jpg" alt="The Aetherial signal-chain strip in AetherSDR, showing the processing stages end to end" />
<imgsrc="assets/img/hero-3dss.jpg" alt="AetherSDR's 3D stacked-trace panadapter over the 40m band with the full control surface" />
312
+
<imgwidth="1640" height="830" src="assets/img/hero-3dss.jpg" alt="AetherSDR's 3D stacked-trace panadapter over the 40m band with the full control surface" />
313
313
</figure>
314
314
315
315
<spanclass="blog-meta">
@@ -357,7 +357,7 @@ <h2>Get the build for your machine</h2>
0 commit comments