Add markdown blog CMS#59
Merged
Merged
Conversation
9b65702 to
716f99a
Compare
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.
Original request
The request was to add a modern Markdown-based open-source CMS for a website blog, extend the PR Workflow skill so feature PRs can write Markdown blog posts for SEO, add a Blog link to the home page, update the skill itself, then backfill the blog by creating posts for shipped GitHub PRs with screenshots where possible.
Summary
Adds a Git-backed Markdown/MDX blog for xpenser using Keystatic, exposes public
/blogand/blog/[slug]routes, updates the PR workflow skill, and backfills the blog with release posts for every merged PR through #58. The blog now contains 54 posts total: the CMS workflow post for PR #59 plus 53 historical PR posts. Open PR #46 is intentionally excluded until it ships.What changed
apps/web/content/blog/*.mdxwith title, slug, description, publish/update dates, target keyword, secondary keywords, draft state, source PR metadata, optional hero screenshot metadata, and MDX content./keystaticand/api/keystatic; local editing is enabled outside production, while production editing requires Keystatic GitHub credentials.apps/web/public/blogfor dashboard, transactions, and preferences/MCP/email-report surfaces; non-visual posts fall back to/og-image.png..agents/skills/pr-workflow/SKILL.mdso public feature PRs add/update a blog post or document a skip reason, and so PR-backed posts include source metadata and real screenshot guidance.Reasoning
Keystatic fits this repo because it keeps content as reviewed files in Git, works with the existing Next.js App Router app, and gives maintainers a CMS UI without adding a database. The production admin path is guarded so missing CMS credentials do not expose local filesystem editing or break normal builds.
The backfill keeps the blog as a truthful release archive instead of publishing unmerged work. Posts use real merge/shipment dates and real product screenshots where they honestly match the feature area. Internal/config-only posts intentionally use the default OG image rather than invented screenshots.
Blog posts
/blog/markdown-blog-workflow/blog/dashboard-vendor-view-controls/blog/transaction-scan-progress-fix/blog/configurable-email-finance-reports/blog/disable-gtm-in-pr-environmentsValidation
npm run lintnpm run typechecknpm test- 83 files, 447 testsnpm run build -w @xpenser/web- generated 60 static pagesPLAYWRIGHT_BASE_URL=http://127.0.0.1:3012 npm run test:e2e -- --project=chromium --no-deps tests/e2e/public-auth.spec.ts -g "serves the public blog index and a published post"Lint and testDeploy PR environmentPlaywright e2ePLAYWRIGHT_BASE_URL=https://xpenser-pr-059.cleverbrush.com npm run test:e2e -- --project=chromium --no-deps tests/e2e/public-auth.spec.ts -g "serves the public blog index and a published post"xpenser-web-pr-59andxpenser-web-pr-059returned no service values or rows after preview QA;http.server.duration.countreturned no PR Add markdown blog CMS #59 metric data in the validation window.Screenshots / Preview
Preview URL:
https://xpenser-pr-059.cleverbrush.comCommitted blog screenshots:
/blog/dashboard-month.png/blog/transactions.png/blog/preferences-mcp-email.pngPreview QA validated
/blog,/blog/markdown-blog-workflow,/blog/dashboard-vendor-view-controls,/blog/disable-gtm-in-pr-environments, screenshot rendering, fallback OG image metadata, and source PR links.Checklist