feat(website): blog section with SEO wiring and PR guardrails - #591
Draft
felipesalinasr wants to merge 1 commit into
Draft
feat(website): blog section with SEO wiring and PR guardrails#591felipesalinasr wants to merge 1 commit into
felipesalinasr wants to merge 1 commit into
Conversation
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>
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.
Before merging / deploying
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.CLOUDFLARE_API_TOKEN/CLOUDFLARE_ACCOUNT_IDsecrets allow preview deploys (same token as production deploy; previews use--branch=<pr-branch>on the existinghouston-sitePages project).website/src/blog/posts/welcome-to-mission-control.md) — placeholder-quality is intentional, edit freely.https://gethouston.ai/sitemap.xmlstill 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 inwebsite/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 /learnBlogPostingJSON-LD, Atom feed at/blog/feed.xml, canonical URLs (already from base), and a generated sitemap (src/sitemap.njkreplaces the static file) so new posts can never be forgotten; also adds the previously missing/learn/and/vision/entriesbase.njk: social-card image is now overridable per page viaogImagefront matter; default unchanged for all existing pagesGuardrails (new
.github/workflows/website-pr.yml):blog/*may only touchwebsite/src/blog/posts/— a content-publishing session (human or agent) cannot modify templates, the homepage, or product codeProduction deploy path unchanged:
website-deploy.ymlstill deploys on push tomain.Verification
npm testinwebsite/: 7/7 passing (date + reading-time helpers)/blog/index, post page (meta + JSON-LD + canonical),/blog/feed.xml,/sitemap.xmlincluding both new blog URLs and all core pages/blog/and the post page at 1280px — matches the learn/vision visual system🤖 Generated with Claude Code