Skip to content

feat(website): blog section with SEO wiring and PR guardrails - #591

Draft
felipesalinasr wants to merge 1 commit into
mainfrom
feat/website-blog
Draft

feat(website): blog section with SEO wiring and PR guardrails#591
felipesalinasr wants to merge 1 commit into
mainfrom
feat/website-blog

Conversation

@felipesalinasr

Copy link
Copy Markdown
Collaborator

Before merging / deploying

  • Branch protection on main (repo admin, one-time): require the "Website PR / Build site & run tests" check and require PRs (no direct pushes). Suggested command:
    gh api repos/gethouston/houston/branches/main/protection -X PUT -f ... or via Settings → Branches.
  • Confirm CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID secrets allow preview deploys (same token as production deploy; previews use --branch=<pr-branch> on the existing houston-site Pages project).
  • Review the launch post copy (website/src/blog/posts/welcome-to-mission-control.md) — placeholder-quality is intentional, edit freely.
  • After first deploy: verify https://gethouston.ai/sitemap.xml still serves (it is now generated by Eleventy instead of passthrough-copied) and submit to Search Console.

What this adds

Blog without a CMS. Posts are Markdown files in website/src/blog/posts/; one file = one post at /blog/<slug>/. Index, feed, sitemap, and meta tags update automatically. Publishing flow documented in website/BLOG.md.

  • /blog/ index + post layout rendered through the existing site shell (nav-docs, footer-learn, learn design tokens) — same look and feel as /vision and /learn
  • SEO: per-post title/description/OG/Twitter meta, BlogPosting JSON-LD, Atom feed at /blog/feed.xml, canonical URLs (already from base), and a generated sitemap (src/sitemap.njk replaces the static file) so new posts can never be forgotten; also adds the previously missing /learn/ and /vision/ entries
  • base.njk: social-card image is now overridable per page via ogImage front matter; default unchanged for all existing pages
  • Blog linked from landing nav, docs nav, and learn footer
  • Launch post: "Welcome to mission control"

Guardrails (new .github/workflows/website-pr.yml):

  • Every website PR must build the Eleventy site and pass unit tests before merge
  • Same-repo PRs get a Cloudflare Pages preview URL (in the workflow job summary)
  • Branches named blog/* may only touch website/src/blog/posts/ — a content-publishing session (human or agent) cannot modify templates, the homepage, or product code

Production deploy path unchanged: website-deploy.yml still deploys on push to main.

Verification

  • npm test in website/: 7/7 passing (date + reading-time helpers)
  • Full Eleventy build passes; verified generated output: /blog/ index, post page (meta + JSON-LD + canonical), /blog/feed.xml, /sitemap.xml including both new blog URLs and all core pages
  • Screenshot-checked /blog/ and the post page at 1280px — matches the learn/vision visual system
  • Biome clean on all changed JS/JSON

🤖 Generated with Claude Code

Markdown-based blog for gethouston.ai, no external CMS:

- /blog index + Markdown posts in website/src/blog/posts/ (one file =
  one post at /blog/<slug>/), rendered through the existing site shell
  (nav-docs, footer-learn, learn design tokens)
- SEO: per-post meta/OG/Twitter tags, BlogPosting JSON-LD, Atom feed at
  /blog/feed.xml, and the sitemap is now generated (src/sitemap.njk) so
  posts are always included; core-page list preserved and extended with
  /learn/ and /vision/
- base.njk: og:image becomes overridable via ogImage front matter
  (default card unchanged for all existing pages)
- Blog links added to nav-docs, nav-landing, and the learn footer
- Launch post: "Welcome to mission control"
- New PR workflow (website-pr.yml): builds the site + runs unit tests on
  website PRs, deploys a Cloudflare Pages preview for same-repo PRs, and
  enforces that blog/* branches only touch website/src/blog/posts/ so
  content-publishing sessions cannot modify the rest of the site
- Pure date/reading-time helpers in website/lib/blog.js with node:test
  coverage (npm test)
- BLOG.md documents the publishing flow for writers

Production deploys remain unchanged (website-deploy.yml on main).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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