hoelee
f364084284
Deploy / build (push) Successful in 56s
perf(images): WebP banners, text-only related cards, resized list thumbnails
...
Measured before/after with headless Chrome + CDP (not by eye):
- article banner: <picture> WebP q78 with the PNG as fallback, because the PNG
must stay for og:image (social scrapers do not reliably render WebP cards).
70 banners: 6.02 MB -> 2.52 MB (42%). JPEG measured *larger* than PNG here
(q85 = 129%) — the art is flat terminal-style with sharp text edges.
- post page related cards: dropped four 1200x630 PNGs (183 KB) to display
526x276 where the embedded code is illegible; now text-only cards with a
category badge, date and reading time.
- list thumbnails (home + archive): new /og/thumb/<name>-{400,800}.webp served
via srcset/sizes. Rows display at ~398px but were pulling full 1200x630 PNGs.
Homepage thumbnails ~450 KB -> 62 KB; archive (71 rows) ~3.2 MB -> 436 KB.
- desktop banner capped at 720px centred: 67% -> 45% of a 900px viewport,
keeping the art intact instead of cropping it.
Post page totals: images 277 KB -> 38 KB; page height 5758 -> 5065 (desktop)
and 9423 -> 8807 (mobile). Build: 163 pages.
Script: scripts/optimize-images.py; policy: docs/design-guide.md §3; runbook
step added to docs/ops-runbook.md.
2026-10-16 17:11:27 +08:00
..
2026-10-16 13:47:10 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:02:42 +08:00
2026-10-16 17:11:27 +08:00
2026-09-11 12:19:16 +08:00
2026-10-16 17:11:27 +08:00
2026-10-16 12:46:09 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:14:17 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 06:33:13 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 07:53:07 +08:00
2026-10-16 17:11:27 +08:00
2026-09-11 18:27:38 +08:00
2026-10-16 17:11:27 +08:00
2026-10-16 13:22:13 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 02:41:58 +08:00
2026-10-16 17:11:27 +08:00
2026-10-16 13:22:13 +08:00
2026-10-16 17:11:27 +08:00
2026-10-08 05:19:27 +08:00
2026-10-16 17:11:27 +08:00
2026-10-16 13:47:10 +08:00
2026-10-16 17:11:27 +08:00
2026-10-08 04:52:04 +08:00
2026-10-16 17:11:27 +08:00
2026-10-13 21:59:22 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 02:41:58 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 09:47:41 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 06:33:13 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 06:33:13 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 06:33:13 +08:00
2026-10-16 17:11:27 +08:00
2026-09-11 16:36:01 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 07:28:03 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 07:23:32 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:40:19 +08:00
2026-10-16 17:11:27 +08:00
2026-10-08 05:04:54 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 02:41:58 +08:00
2026-10-16 17:11:27 +08:00
2026-10-01 01:36:32 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:01:42 +08:00
2026-10-16 17:11:27 +08:00
2026-10-16 13:47:10 +08:00
2026-10-16 17:11:27 +08:00
2026-09-18 01:51:46 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:14:17 +08:00
2026-10-16 17:11:27 +08:00
2026-09-30 04:52:43 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:37:23 +08:00
2026-10-16 17:11:27 +08:00
2026-09-13 17:20:42 +08:00
2026-10-16 17:11:27 +08:00
2026-09-20 04:18:11 +08:00
2026-10-16 17:11:27 +08:00
2026-10-06 17:19:46 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 00:57:57 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:43:00 +08:00
2026-10-16 17:11:27 +08:00
2026-09-19 19:50:27 +08:00
2026-10-16 17:11:27 +08:00
2026-10-06 08:04:02 +08:00
2026-10-16 17:11:27 +08:00
2026-09-18 01:51:46 +08:00
2026-10-16 17:11:27 +08:00
2026-09-18 01:51:46 +08:00
2026-10-16 17:11:27 +08:00
2026-09-19 07:55:29 +08:00
2026-10-16 17:11:27 +08:00
2026-09-16 01:04:41 +08:00
2026-10-16 17:11:27 +08:00
2026-09-18 01:31:46 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:37:23 +08:00
2026-10-16 17:11:27 +08:00
2026-10-16 13:47:10 +08:00
2026-10-16 17:11:27 +08:00
2026-10-01 01:38:58 +08:00
2026-10-16 17:11:27 +08:00
2026-09-11 12:12:55 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:43:00 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:43:00 +08:00
2026-10-16 17:11:27 +08:00
2026-09-18 05:38:13 +08:00
2026-10-16 17:11:27 +08:00
2026-09-18 05:38:13 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 06:56:20 +08:00
2026-10-16 17:11:27 +08:00
2026-10-06 17:19:46 +08:00
2026-10-16 17:11:27 +08:00
2026-10-16 13:32:06 +08:00
2026-10-16 17:11:27 +08:00
2026-09-15 18:44:09 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:01:42 +08:00
2026-10-16 17:11:27 +08:00
2026-09-11 19:57:33 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 02:41:58 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:07:43 +08:00
2026-10-16 17:11:27 +08:00
2026-09-16 01:04:41 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:10:39 +08:00
2026-10-16 17:11:27 +08:00
2026-09-21 21:17:55 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 02:41:58 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 06:33:13 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:40:19 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:37:23 +08:00
2026-10-16 17:11:27 +08:00
2026-09-09 06:56:20 +08:00
2026-10-16 17:11:27 +08:00
2026-09-29 01:37:23 +08:00
2026-10-16 17:11:27 +08:00