Skip to content

docs: switch Social 4 to canonical URLs and sweep one duplicate H1#2437

Merged
bpamiri merged 2 commits intodevelopfrom
docs/social-4-canonical-urls-and-h1-sweep
May 6, 2026
Merged

docs: switch Social 4 to canonical URLs and sweep one duplicate H1#2437
bpamiri merged 2 commits intodevelopfrom
docs/social-4-canonical-urls-and-h1-sweep

Conversation

@bpamiri
Copy link
Copy Markdown
Collaborator

@bpamiri bpamiri commented May 6, 2026

Summary

Two coordinated cleanups before tomorrow's Social 4 posting.

1. Switch Social 4 links to canonical surfaces

Every link in Post 4 across Slack / LinkedIn / X / GitHub Discussions used to point at https://github.com/wheels-dev/wheels/blob/develop/web/sites/guides/src/content/docs/...mdx — i.e. the GitHub source MDX, not the published docs. That's bad for SEO (no credit to guides.wheels.dev), bad UX (readers see raw markdown not styled docs), and brittle (the GitHub URL breaks if the file is ever renamed or moved).

All 11 occurrences across the four channels remapped to https://guides.wheels.dev/v4-0-0-snapshot/deployment/.... Each canonical URL verified HTTP 200.

Channel Before After
Slack 1 GH-blob link 1 blog-canonical + 1 guides-canonical
LinkedIn 2 GH-blob links 1 blog-canonical + 2 guides-canonical
X reply 3 1 GH-blob link 1 blog-canonical (replaced — X favors single canonical)
GitHub Discussions 7 GH-blob links 7 guides-canonical + 1 blog-canonical (blockquote at top)

Also added the canonical blog-post URL https://blog.wheels.dev/posts/wheels-deploy-kamal-port/ prominently in each channel — readers can now click to the full styled post in one hop, instead of having to navigate from a docs link.

Third-party references (kamal-deploy.org, basecamp/kamal-proxy) left alone — those are correctly pointing at upstream.

2. Strip duplicate H1 from why-we-rebuilt-our-ci-pipeline.md

Same pattern that bit Blog 09 in #2435. The body opened with # Why We Rebuilt Our CI Pipeline From 40 Minutes to 82 Seconds + _byline_ + --- divider — all redundant with what PostLayout.astro auto-renders from frontmatter. Result: two <h1> elements on the live page.

Verified via corpus-wide sweep with a conservative fuzzy-match rule (only strip when body H1 ≈ frontmatter title):

Result Count
Modified 1 (why-we-rebuilt-our-ci-pipeline.md)
Already clean 140
Section-style H1 — correctly skipped 9 (wheels-cli-*, screencast posts)
Total tracked posts scanned 150

The 9 section-style H1 posts (wheels-cli-asset-commands, wheels-cli-config-commands, etc.) use # Introduction as a section heading, NOT a title duplicate — those need a separate, more deliberate downgrade pass and are tracked in #2436.

Loss in this commit: the body H1's longer "From 40 Minutes to 82 Seconds" subtitle is no longer a heading. The "82 seconds" claim itself is still in the second paragraph of the body, so the rhetorical hook is preserved — just not as bold.

Test plan

  • Commit-message lint passes (docs: type, no scope, both subjects under 100 chars)
  • CI web-deploy.yml succeeds — Astro builds blog (note: this PR's social-announcements.md change does NOT affect the Astro build since that file is in docs/, only the why-we-rebuilt change does)
  • After merge + deploy: curl -s https://blog.wheels.dev/posts/why-we-rebuilt-our-ci-pipeline/ | grep -c '<h1' returns 1 (was 2)
  • Spot-check the live why-we-rebuilt post — first paragraph is "For years, the Wheels CI pipeline ran every commit through a gauntlet..."
  • Visual regression: blog.png baseline screenshots the index, NOT per-post pages — the index card for why-we-rebuilt still shows the same excerpt (excerpt is from frontmatter), so no baseline update should be needed. If visual regression trips, that's a useful signal that the index card uses body content I missed; let me know.

Out of scope (tracked in #2436)

  • Sweeping the 9 section-style H1 posts to downgrade their H1s to H2/H3
  • Building enforcement (Astro schema validation / remark plugin) so future posts can't reintroduce duplicate H1s

bpamiri added 2 commits May 6, 2026 09:02
…els.dev

All 11 GitHub-blob source links across the four channels (Slack,
LinkedIn, X reply 3, GitHub Discussions) replaced with their
guides.wheels.dev equivalents — readers now land on the styled docs
instead of raw MDX. Each canonical URL verified to return HTTP 200.

Also adds a canonical blog-post URL prominent in each channel:

- Slack:       prepended `<...|Read the full post>` to the deployment-guide line
- LinkedIn:    new "Read the full post:" line above the docs links
- X reply 3:   swapped the deployment-guide link for the canonical blog URL
- Discussions: blockquote callout below the lead paragraph linking to the post

Third-party links left alone: kamal-deploy.org and basecamp/kamal-proxy
on GitHub remain (correct destinations for the upstream Kamal references).

Net: 11 GH-blob URLs removed, 11 canonical-guides URLs added, 4
blog-canonical URLs added across the four channels.
The post's body opened with `# Why We Rebuilt Our CI Pipeline From 40
Minutes to 82 Seconds` followed by `_April 9, 2026 — Peter Amiri,
Wheels Core Team_` and a `---` divider — all of which PostLayout.astro
already renders from frontmatter (title, author, date). Result was two
<h1> elements on the live page, same pattern that bit Blog 09 in #2435.

Body now starts directly with the lead paragraph ("For years, the Wheels
CI pipeline ran every commit through a gauntlet..."). The "82 seconds"
substance is preserved in the next paragraph.

Spotted via a corpus-wide sweep: 150 tracked posts scanned, 140 already
clean, 9 use H1 as section markers (correctly skipped), and only this
one + Blog 09 had the duplicate-title pattern. Tracked broader cleanup +
enforcement as #2436.

Note: the body's longer subtitle ("From 40 Minutes to 82 Seconds") is
lost as a heading — but it remains in the lead paragraph as the
"82 seconds" claim, so the rhetorical hook is preserved.
@github-actions github-actions Bot added the docs label May 6, 2026
@bpamiri bpamiri merged commit dd08f44 into develop May 6, 2026
9 checks passed
@bpamiri bpamiri deleted the docs/social-4-canonical-urls-and-h1-sweep branch May 6, 2026 16:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant