Read-path polish, no new audience-facing infra. The headline fix: real build-time image optimization that kills the feature-image LCP regression.
What shipped
- Build-time image pipeline (ADR-0014) — hybrid image service + a getImage() core behind <FeatureImage>/<Cover>/<MdImage>/<GalleryImage>
- Lane C (ADR-0017) — R2 originals + /cdn-cgi/image/ edge transforms, responsive ladders in code, proven by a draft fixture
- /stream (ADR-0015) — a short-form feed; a Note with a link becomes a Link; All/Notes/Links filter; its own RSS
- Trending rollup — plumbing only (post_daily_views); data accrues now, UI in Phase 4
- Error pages — a rich 404 (search + Popular + recent) and a static-safe 500 (no D1/islands)
- Advanced filter + popularity sort on /blog (Track B) — deferred to Phase 4
The image axis
The pipeline splits on when optimization happens — build-time (Astro built-ins → static files) vs edge-runtime (CF Images transforms on R2). Not “manual vs built-in.”
in git → src/.../images/ ──build(sharp)──► dist/_astro/* (Lane A)out of git→ R2 files.* ──edge──► /cdn-cgi/image/<opts>/<key> (Lane C) Reflections
To write: the LCP bug that started it, why Lane C is “manual” only because
<Picture>can’t target a runtime origin, and shipping plumbing (trending, Lane C) ahead of content.