redesign 08 — syndication & perf (JSON feed, sitemap, OG) #13

Merged
michalvankodev merged 13 commits from redesign/08-syndication-perf into redesign/00-foundation 2026-09-09 14:56:20 +02:00

What

Slice 8/9 of the selected redesign (base: #12). Syndication, metadata, performance.

  • JSON Feed 1.1 at /feed.json — shares one build_feed_items() with RSS so they never drift: full content_html, absolute segment-aware URLs, RFC 3339 dates, images, tags.
  • RSS full-text audit — broadcasts were mislinked under /blog/… in the feed (they live at /broadcasts/…); URLs are now segment-aware and enclosure URLs absolute. Two #[tokio::test]s assert full-text presence + absolute URLs for both feeds (audits real _posts/).
  • sitemap.xml — generated from the post lists at render/export time (static pages + posts with lastmod); robots.txt references it.
  • OG/Twitter completion per post — article:published_time (ISO 8601), article:tag, twitter:card=summary_large_image, twitter:image.
  • Lazy-load — loading="lazy" decoding="async" on all content images (markdown pictures, thumbnails, cards, article covers); homepage hero eager + fetchpriority="high" (new param, test covers both paths).
  • Cache policy scoped honestly — Caddyfile-preview: assets max-age=604800 + etag revalidation, HTML no-cache; the year-long immutable removed (filenames are size-suffixed, not hashed — returning visitors could hold stale assets). ⚠️ Production Caddy on katelyn needs the matching header change at deploy time.

Preview: https://redesign-08-syndication-perf.dev.michalvanko.dev — see /feed.json, /sitemap.xml, /robots.txt, any article's <head>.

## What Slice 8/9 of the selected redesign (base: #12). Syndication, metadata, performance. - **JSON Feed 1.1** at `/feed.json` — shares one `build_feed_items()` with RSS so they never drift: full `content_html`, absolute segment-aware URLs, RFC 3339 dates, images, tags. - **RSS full-text audit** — broadcasts were mislinked under `/blog/…` in the feed (they live at `/broadcasts/…`); URLs are now segment-aware and enclosure URLs absolute. Two `#[tokio::test]`s assert full-text presence + absolute URLs for both feeds (audits real `_posts/`). - **sitemap.xml** — generated from the post lists at render/export time (static pages + posts with `lastmod`); `robots.txt` references it. - **OG/Twitter completion per post** — `article:published_time` (ISO 8601), `article:tag`, `twitter:card=summary_large_image`, `twitter:image`. - **Lazy-load** — `loading="lazy" decoding="async"` on all content images (markdown pictures, thumbnails, cards, article covers); homepage hero eager + `fetchpriority="high"` (new param, test covers both paths). - **Cache policy scoped honestly** — `Caddyfile-preview`: assets `max-age=604800` + etag revalidation, HTML `no-cache`; the year-long `immutable` removed (filenames are size-suffixed, not hashed — returning visitors could hold stale assets). ⚠️ Production Caddy on katelyn needs the matching header change at deploy time. **Preview:** https://redesign-08-syndication-perf.dev.michalvanko.dev — see `/feed.json`, `/sitemap.xml`, `/robots.txt`, any article's `<head>`.
redesign: syndication & perf — JSON feed, sitemap, OG/Twitter, lazy images
All checks were successful
test / cargo test (push) Successful in 58s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Successful in 1m15s
d6430cb891
- JSON Feed 1.1 at /feed.json (serde_json) sharing one build_feed_items
  with RSS — items stay in sync: full content_html, absolute segment-
  aware URLs, RFC3339 dates, images, tags
- RSS audit: feed URLs absolute (broadcast posts were linked under
  /blog/ — segment-aware now), enclosure URLs absolute; tokio tests
  assert full-text body + absolute URLs for both feeds
- sitemap.xml generated from post lists at render/export time (47
  URLs: 6 static + posts w/ lastmod); robots.txt references it
- OG/Twitter completion per post: article:published_time (ISO 8601),
  article:tag, twitter:card summary_large_image, twitter:image
- Lazy-load: loading=lazy + decoding=async on all content images
  (markdown pictures, thumbnails, cards, covers); homepage hero is
  eager with fetchpriority=high (new bool param; test covers both)
- Caddyfile-preview cache policy honest about size-suffixed filenames:
  assets max-age=604800 + etag revalidation, HTML no-cache — immutable
  removed (unsafe without content hashing). NOTE: production Caddy on
  katelyn needs the matching header change at deploy
michalvankodev force-pushed redesign/08-syndication-perf from d6430cb891
All checks were successful
test / cargo test (push) Successful in 58s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Successful in 1m15s
to 17bc0bf735
All checks were successful
test / cargo test (push) Successful in 54s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Successful in 1m21s
2026-08-21 16:17:20 +02:00
Compare
michalvankodev force-pushed redesign/08-syndication-perf from 17bc0bf735
All checks were successful
test / cargo test (push) Successful in 54s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Successful in 1m21s
to 7969d0c587
Some checks failed
test / cargo test (push) Successful in 56s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Has been cancelled
2026-08-23 12:37:16 +02:00
Compare
michalvankodev force-pushed redesign/08-syndication-perf from 7969d0c587
Some checks failed
test / cargo test (push) Successful in 56s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Has been cancelled
to e360228b1c
Some checks failed
test / cargo test (push) Successful in 59s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Has been cancelled
2026-08-23 12:49:45 +02:00
Compare
michalvankodev force-pushed redesign/08-syndication-perf from e360228b1c
Some checks failed
test / cargo test (push) Successful in 59s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Has been cancelled
to d886a653da
All checks were successful
test / cargo test (push) Successful in 53s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Successful in 1m10s
2026-08-23 12:58:06 +02:00
Compare
michalvankodev force-pushed redesign/08-syndication-perf from d886a653da
All checks were successful
test / cargo test (push) Successful in 53s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Successful in 1m10s
to 499da590ea
All checks were successful
test / cargo test (push) Successful in 54s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Successful in 1m14s
2026-08-24 10:19:53 +02:00
Compare
michalvankodev changed target branch from redesign/07-components to redesign/00-foundation 2026-09-08 15:16:47 +02:00
michalvankodev force-pushed redesign/08-syndication-perf from 499da590ea
All checks were successful
test / cargo test (push) Successful in 54s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (pull_request) Successful in 1m14s
to aad70e4681
All checks were successful
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / preview hostname (push) Successful in 0s
preview / teardown preview (push) Has been skipped
test / cargo test (push) Successful in 2m43s
preview / build + deploy preview (pull_request) Successful in 1m44s
preview / build + deploy preview (push) Successful in 1m26s
2026-09-08 15:16:48 +02:00
Compare
specs: decision record for absolute URLs in feed content
All checks were successful
preview / preview hostname (push) Successful in 0s
preview / teardown preview (push) Has been skipped
test / cargo test (push) Successful in 1m7s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (push) Successful in 2m29s
preview / build + deploy preview (pull_request) Successful in 1m17s
15a50f3378
cards: og/twitter images always raster — og-default.png for svg or missing thumbnails
All checks were successful
preview / preview hostname (push) Successful in 0s
preview / teardown preview (push) Has been skipped
test / cargo test (push) Successful in 1m27s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (push) Successful in 1m25s
preview / build + deploy preview (pull_request) Successful in 1m16s
ec2d7f29de
chore: track Cargo.lock — reproducible dep resolution for the server binary
All checks were successful
preview / preview hostname (push) Successful in 0s
preview / teardown preview (push) Has been skipped
test / cargo test (push) Successful in 1m33s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (push) Successful in 3m4s
preview / build + deploy preview (pull_request) Successful in 1m19s
5329a1cfe4
cards: per-post descriptions — front-matter override with auto-excerpt fallback (og/twitter/meta + feed summary)
All checks were successful
preview / preview hostname (push) Successful in 0s
preview / teardown preview (push) Has been skipped
test / cargo test (push) Successful in 54s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (push) Successful in 1m21s
preview / build + deploy preview (pull_request) Successful in 1m14s
989eda4f58
cache: no-cache for css (constant filename changes per deploy), 30d for versioned assets
All checks were successful
preview / preview hostname (push) Successful in 0s
preview / teardown preview (push) Has been skipped
test / cargo test (push) Successful in 57s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (push) Successful in 1m26s
preview / build + deploy preview (pull_request) Successful in 1m18s
40c4767f28
cache: content-hashed css in prod exports (TARGET=PROD), immutable caching; dev keeps fixed name
All checks were successful
preview / preview hostname (push) Successful in 0s
preview / teardown preview (push) Has been skipped
test / cargo test (push) Successful in 1m2s
preview / preview hostname (pull_request) Successful in 0s
preview / teardown preview (pull_request) Has been skipped
preview / build + deploy preview (push) Successful in 1m21s
preview / build + deploy preview (pull_request) Successful in 1m19s
e94c96bb2c
chore: gitignore hashed tailwind artifacts (styles/output.*.css)
All checks were successful
preview / preview hostname (push) Successful in 0s
preview / teardown preview (push) Has been skipped
test / cargo test (push) Successful in 1m0s
preview / build + deploy preview (push) Successful in 1m24s
preview / preview hostname (pull_request) Successful in 0s
preview / build + deploy preview (pull_request) Has been skipped
preview / teardown preview (pull_request) Successful in 0s
1ff187f7f2
michalvankodev changed title from WIP: redesign 08 — syndication & perf (JSON feed, sitemap, OG) to redesign 08 — syndication & perf (JSON feed, sitemap, OG) 2026-09-09 14:56:19 +02:00
michalvankodev merged commit fc63e2b27a into redesign/00-foundation 2026-09-09 14:56:20 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
michalvankodev/michalvankodev-site!13
No description provided.