docs: switch Social 4 to canonical URLs and sweep one duplicate H1#2437
Merged
docs: switch Social 4 to canonical URLs and sweep one duplicate H1#2437
Conversation
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.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.mdSame 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 whatPostLayout.astroauto-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):
why-we-rebuilt-our-ci-pipeline.md)wheels-cli-*, screencast posts)The 9 section-style H1 posts (
wheels-cli-asset-commands,wheels-cli-config-commands, etc.) use# Introductionas 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
docs:type, no scope, both subjects under 100 chars)web-deploy.ymlsucceeds — Astro builds blog (note: this PR'ssocial-announcements.mdchange does NOT affect the Astro build since that file is indocs/, only the why-we-rebuilt change does)curl -s https://blog.wheels.dev/posts/why-we-rebuilt-our-ci-pipeline/ | grep -c '<h1'returns1(was2)why-we-rebuiltpost — first paragraph is "For years, the Wheels CI pipeline ran every commit through a gauntlet..."blog.pngbaseline screenshots the index, NOT per-post pages — the index card forwhy-we-rebuiltstill 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)