Skip to content

SEO metadata, structured data, and a purged self-hosted asset pipeline#49

Open
HeyItsGilbert wants to merge 4 commits into
mainfrom
seo/metadata-and-asset-pipeline
Open

SEO metadata, structured data, and a purged self-hosted asset pipeline#49
HeyItsGilbert wants to merge 4 commits into
mainfrom
seo/metadata-and-asset-pipeline

Conversation

@HeyItsGilbert

Copy link
Copy Markdown
Member

Summary

A technical-SEO + performance pass on the page <head>, plus the structured-data
and asset-pipeline changes that support it. Audited against the homepage and the
latest article, then validated across the whole archive.

Head SEO (baseof.html, hugo.yaml)

  • rel=canonical on every page (was absent — material given the 2,221 build aliases)
  • og:locale; fixed home og:title (was the brandless page title)
  • de-duplicated article <title> via a new params.brand suffix
    (… - PowerShell.org - Welcome Automaters!… — PowerShell.org)
  • article:published_time/modified_time/author/section/tag on posts
  • Twitter tags moved to name= with twitter:site/creator
  • social cards prefer og_description; SERP keeps the full description

Structured data (new partials, gated by section)

  • homeOrganization + WebSite (schema-site.html)
  • articles/podcastArticle + BreadcrumbList (schema-article.html)

Crawl

  • robots.txt enabled, advertising the sitemap (layouts/robots.txt)

Performance

  • Tailwind: ~2.9 MB CDN → ~35 KB purged, self-hosted build, served
    minify | fingerprint via Hugo Pipes. Retained rules are byte-identical to the
    CDN file (purge of the exact v2.2.19 source), so no visual change for used classes.
  • Inter self-hosted from assets/fonts/ via @font-face + preload; render-blocking
    Google Fonts @import removed; preconnect added for the remaining CDNs.
  • Regen tooling: purgecss.config.cjs + scripts/build-tailwind.mjs (npm run build:css).

Content fixes

  • Restored title: on three migrated 2012–2014 posts that shipped with empty
    <title>/<h1>/og:title/schema headline.
  • Tightened the home meta description to keyword-rich copy under the SERP cutoff.

Verification

  • Fresh production build (baseURL https://powershell.org, --gc --minify): 0 errors.
  • Parsed JSON-LD on all 1,869 article/podcast pages: 0 parse failures, 0 missing
    BreadcrumbList/author/image/headline. The 189 pages without Article schema are
    pagination + section indexes (correct).
  • Browser-rendered home, article, and a podcast page (hero/cards, prose + admonition,
    audio player, group-hover YouTube facade) — no visual regression with the 35 KB CSS.

Notes for reviewers

  • CI is unchanged and needs no change: the deploy builds (netlify.toml,
    deploy.yml) run bare hugo and pick up the committed assets/css/tailwind.css.
    After editing markup that introduces new Tailwind classes, run npm run build:css
    and commit the result (a missing class is visible in npm run dev, which serves the
    same file). Rationale in docs/adr/0005.
  • Build-time data classes (activity-dot colors from community_stats.json) are pinned
    in the purge safelist.
  • ~1,800 archive pages have no authored description, so their meta/schema description
    falls back to the auto-summary (valid; a separate content effort could improve this).

CONTEXT.md was intentionally left out of this branch (unrelated in-progress edit).

…d assets

Head SEO (baseof.html):
- add rel=canonical and og:locale on every page
- fix home og:title (was the brandless page title); de-duplicate article
  <title> via a new params.brand suffix
- emit article:published_time/modified_time/author/section/tag for posts
- switch Twitter tags to name= and add twitter:site/creator
- prefer og_description for social cards, keep full description for SERP

Structured data (new partials, gated by section):
- schema-site.html: Organization + WebSite on the home page
- schema-article.html: Article + BreadcrumbList on articles and podcasts

Crawl:
- enable robots.txt advertising the sitemap (layouts/robots.txt)

Performance:
- replace the ~2.9 MB Tailwind CDN file with a ~35 KB purged, self-hosted
  build served minify|fingerprint via Hugo Pipes (assets/css/tailwind.css)
- self-host Inter from assets/fonts via @font-face + preload; drop the
  render-blocking Google Fonts @import; add CDN preconnect hints
- regen tooling: purgecss.config.cjs + scripts/build-tailwind.mjs (npm run build:css)
…cription

Three migrated 2012-2014 posts had an empty `title:`, so they shipped with no
<title>, <h1>, og:title, or Article schema headline. Restore titles from slug
and body. Also replace the home description with keyword-rich copy under the
~155-char SERP cutoff.
- ADR 0005: head-level SEO, JSON-LD by section, and the committed purged-CSS /
  self-hosted-font pipeline, with the constraints a future maintainer must keep
- README: document `npm run build:css` and the updated dependency list
@netlify

netlify Bot commented Jun 28, 2026

Copy link
Copy Markdown

Deploy Preview for powershellorg ready!

Name Link
🔨 Latest commit b9c7465
🔍 Latest deploy log https://app.netlify.com/projects/powershellorg/deploys/6a40beaae35a090008e70ce0
😎 Deploy Preview https://deploy-preview-49--powershellorg.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

Flag the custom defaultExtractor and the safelist as load-bearing guardrails,
not incidental config: the stock extractor shreds : / variants, and any
class not present as a literal token is dropped with no build error.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant