Skip to content

feat(web): rescue remaining website work (blog posts, docs, SEO) onto master - #3

Merged
hmziqrs merged 4 commits into
masterfrom
web/remaining-docs
Jun 27, 2026
Merged

feat(web): rescue remaining website work (blog posts, docs, SEO) onto master#3
hmziqrs merged 4 commits into
masterfrom
web/remaining-docs

Conversation

@hmziqrs

@hmziqrs hmziqrs commented Jun 27, 2026

Copy link
Copy Markdown
Collaborator

What

Rescues the stranded worktree-website-remaining line onto current master. That branch held ~4,500 lines of finished-but-unmerged website work (3 blog posts, filled docs, blog SEO/JSON-LD), but was cut from the old pre-audit feat/gpui-query-website base and had diverged, so it never landed.

This merges it in via a 3-way merge (common ancestor a69952e), keeping master canonical wherever it was richer and taking remaining wherever it added real content.

Resolutions

  • web/src/lib/blog.ts — union of all 4 posts (master's introducing-gpui-query + remaining's why-gpui-query, cooperative-cancellation, cache-policies-explained).
  • web/src/routes/blog/$slug.tsx — take remaining: it has the loader prerender/hydration fix and the SEO/JSON-LD head, tags, prev/next nav, notFoundComponent.
  • Docs — per-file take the richer side. Master wins on the filled API/guide docs (queries, mutations, caching, error-handling, devtools, infinite-queries, query-client); remaining wins on installation, quick-start, retry, persistence, observers. New pages added clean: api-reference, comparison, migration, query-keys, select-pattern.
  • Config — keep master's pr-checks.yml, vite.config.ts, wrangler.jsonc, package.json (bun). Union .gitignore (+.playwright-mcp/).
  • Scripts — take remaining's richer generate-llms-txt.mjs / generate-md-alt.mjs.
  • Honor master's deliberate deletionspnpm-lock.yaml, pnpm-workspace.yaml (pnpm→bun), rss.ts, generate-rss.mjs, 404.tsx (removed as dead in 7513efd / d459e23).

Verified

  • `vp build` green — all 4 blog posts prerender 200 OK, plus `/`, `/about`, `/faq`, `/changelog`, `/blog/`. Prerender/hydration fix holds.
  • `generate-llms-txt` (18 docs) and `generate-md-alt` (18 .md) run clean.
  • Note: the Docusaurus sub-build (`build-docs.mjs`) is broken in the local checkout only (dangling `@docusaurus/core` symlink); it fails before any MDX is parsed, so pristine master fails identically. CI does a fresh install and is unaffected.

Housekeeping done

Removed both stale worktrees (.claude/worktrees/website-master, website-remaining) and deleted the redundant fix/website-master branch (== `origin/master`). Kept worktree-website-remaining as a fallback.

hmziqrs added 4 commits June 20, 2026 08:19
… SEO, docs, CI

Closes the items deferred when docs moved to Docusaurus. Build is green
end-to-end; `pnpm install` exits 0; `vp check` clean.

Blog (U6): /blog system in the marketing app — src/lib/blog.ts loader
(import.meta.glob over src/content/blog/*.mdx), blog/index.tsx listing,
blog/$slug.tsx posts, 3 seed posts, rewired rss.ts + generate-rss.mjs.
Posts prerender via the top-level `pages` config (the `paths`-inside-`prerender`
form was wrong — TanStack Start's `pages` is a sibling of `prerender`).

AI-crawler files (R14/R15 — were broken post-Docusaurus-migration):
generate-llms-txt.mjs / generate-md-alt.mjs reworked to read ../website/docs
(llms.txt + llms-full.txt + per-doc .md).

SEO (U8): per-route og:url/og:image + twitter:summary_large_image on
about/faq/changelog; full meta + robots:noindex on 404; changelogPage JSON-LD;
generate-og-image.mjs (sharp) rasterizes og-image.svg -> og-image.png 1200x630,
wired into the build; index.tsx + navbar switched to the PNG; navbar Blog link
repointed to the internal /blog.

Docs (U5): expanded Docusaurus docs to 18 pages (query-keys, select-pattern,
error-handling, persistence, caching, retry, devtools, observers, comparison,
api-reference, migration + filled stubs) with Rust examples verified against
the crate source. Fixed the MDX JSX-escaping error (observers.mdx heading).

CI/infra (U9): .github/workflows/pr-checks.yml (pnpm 11.5.1, vp check/test,
build dry-run). pnpm build fix: web/pnpm-workspace.yaml allowBuilds/
onlyBuiltDependencies for esbuild/sharp/workerd (`pnpm install` now exits 0,
CI-safe; this pnpm ignores the package.json `pnpm` field). sharp added as a
devDep so the OG-image generator resolves. src/routeTree.gen.ts gitignored
(generated; tracking it blocked the pre-commit hook). Removed an unused
@ts-expect-error in search-dialog.tsx surfaced by vp check.

Verified: `pnpm run build` exit 0 — Docusaurus (18 docs), vp build prerenders
9 pages (/, /blog/, 3 blog posts, /faq, /about, /changelog, /404), og-image.png
generated, Pagefind indexes 25 pages, RSS (3 posts), llms.txt (18 docs),
18 .md alternatives.
…ON-LD

Finish pass to get the remaining website work actually working + verified.

Blog prerender fix (the big one): MDX + import.meta.glob did not resolve
Content/frontmatter under TanStack Start's prerender SSR (posts rendered
empty, "undefined" title, hydration "Invariant failed" — the KTD-4d risk).
Re-authored the 3 posts as TSX components (CodeBlock for highlighting) with a
static typed POSTS registry in blog.ts (no import.meta.glob/MDX). Routes
unchanged. Verified: /blog/<slug> prerenders with real <h1> + body, 0 console
errors; /blog index lists all 3 posts.

vp test: guarded the @cloudflare/vite-plugin with process.env.VITEST so vitest
no longer crashes on the resolve.external conflict ("No test files found",
clean); vp build/dev still use the cloudflare plugin.

Docs: filled the last 2 onboarding stubs (installation, quick-start) with
content written against the real crate signatures (20 doc pages total).

SEO: wired BlogPosting JSON-LD into /blog/$slug head; documented the retained
TechArticle/HowTo factories.

Hygiene: gitignored the .playwright-mcp browser artifacts (root .gitignore).

Verified: pnpm run build exit 0 (9 prerendered pages), vp check clean
(0 errors). Blog posts render with titles + bodies + 0 console errors.
Combines the divergent `worktree-website-remaining` line (blog TSX posts,
filled docs, blog SEO/JSON-LD) with master's canonical website (prerender
fix, pr-checks CI, pnpm->bun, API docs from "complete documentation
coverage").

Conflict resolutions (common ancestor a69952e):
- web/src/lib/blog.ts: union of all 4 posts (master's introducing-gpui-query
  + remaining's why-gpui-query / cooperative-cancellation / cache-policies).
- web/src/routes/blog/$slug.tsx: take remaining (has the loader prerender fix
  AND the SEO/JSON-LD head, tags, prev/next nav, notFoundComponent).
- web/src/routes/blog/index.tsx: take master (richer; lists via getAllBlogPosts).
- Docs: per-file take the richer side — master for the filled API/guide docs
  (queries, mutations, caching, error-handling, devtools, infinite-queries,
  query-client), remaining for installation/quick-start/retry/persistence/
  observers. New pages added clean: api-reference, comparison, migration,
  query-keys, select-pattern.
- Config: keep master's pr-checks.yml, vite.config.ts, wrangler.jsonc,
  package.json (bun). Union .gitignore + web/.gitignore (+.playwright-mcp/).
- Scripts: take remaining's richer generate-llms-txt.mjs / generate-md-alt.mjs.
- Honor master's deliberate deletions: pnpm-lock.yaml, pnpm-workspace.yaml
  (pnpm->bun), rss.ts, generate-rss.mjs, 404.tsx (removed as dead in
  7513efd / d459e23 deep website audit).
@hmziqrs
hmziqrs merged commit caf9c9f into master Jun 27, 2026
1 check passed
@hmziqrs
hmziqrs deleted the web/remaining-docs branch June 27, 2026 02:22
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