Skip to content

Add structured data, sitemap, and SEO hygiene for search indexing#14

Merged
rdavid1099 merged 1 commit into
mainfrom
chore-seo-foundation
Jun 16, 2026
Merged

Add structured data, sitemap, and SEO hygiene for search indexing#14
rdavid1099 merged 1 commit into
mainfrom
chore-seo-foundation

Conversation

@rdavid1099

Copy link
Copy Markdown
Contributor

Problem

The site had no machine-readable signals for search engines or AI crawlers: no structured data, no sitemap, no robots.txt, and page titles that buried the post name behind the domain prefix.

Solution

Added Schema.org JSON-LD structured data across the site. The homepage defines a single Person and WebSite node (anchored at /#person and /#website); every post page emits a BlogPosting block that references those nodes by @id, so the whole site resolves to one author entity in Google's knowledge graph. The build.js template pipeline was extended to inject the per-post block automatically via a {{json_ld}} placeholder, keeping generated HTML in sync without manual edits.

Generated a sitemap.xml covering the homepage, all theme landing pages, and every post. Lastmod dates derive exclusively from frontmatter (never build time), so the file is byte-stable between builds and won't produce spurious diffs in CI. Sitemap generation is integrated into the build step and the clean step removes the file on reset. Added sitemap.xml and images/ to .prettierignore since Prettier has no XML parser.

Added robots.txt allowing all crawlers (including AI/LLM bots) with targeted Disallow entries for build scaffolding files that .nojekyll now exposes. Flipped all page titles from workman.tech — Post Title to Post Title · workman.tech so the meaningful content leads in browser tabs and SERP snippets.

Notes

The structured data on existing post HTML files was regenerated by running the build rather than hand-edited, so the JSON-LD in those files is canonical output from renderPostJsonLd. If a future post's frontmatter changes, re-running build.js will update the block automatically.

# Problem

The site had no machine-readable signals for search engines or AI crawlers: no structured data, no sitemap, no robots.txt, and page titles that buried the post name behind the domain prefix.

# Solution

Added Schema.org JSON-LD structured data across the site. The homepage defines a single `Person` and `WebSite` node (anchored at `/#person` and `/#website`); every post page emits a `BlogPosting` block that references those nodes by `@id`, so the whole site resolves to one author entity in Google's knowledge graph. The `build.js` template pipeline was extended to inject the per-post block automatically via a `{{json_ld}}` placeholder, keeping generated HTML in sync without manual edits.

Generated a `sitemap.xml` covering the homepage, all theme landing pages, and every post. Lastmod dates derive exclusively from frontmatter (never build time), so the file is byte-stable between builds and won't produce spurious diffs in CI. Sitemap generation is integrated into the `build` step and the `clean` step removes the file on reset. Added `sitemap.xml` and `images/` to `.prettierignore` since Prettier has no XML parser.

Added `robots.txt` allowing all crawlers (including AI/LLM bots) with targeted `Disallow` entries for build scaffolding files that `.nojekyll` now exposes. Flipped all page titles from `workman.tech — Post Title` to `Post Title · workman.tech` so the meaningful content leads in browser tabs and SERP snippets.

# Notes

The structured data on existing post HTML files was regenerated by running the build rather than hand-edited, so the JSON-LD in those files is canonical output from `renderPostJsonLd`. If a future post's frontmatter changes, re-running `build.js` will update the block automatically.
@rdavid1099 rdavid1099 merged commit cb52aaf into main Jun 16, 2026
1 check passed
@rdavid1099 rdavid1099 deleted the chore-seo-foundation branch June 16, 2026 19:01
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