From b5dce562cdc58eeefb823b2068a7ee97df820bd9 Mon Sep 17 00:00:00 2001 From: Will Washburn Date: Fri, 10 Apr 2026 00:00:43 -0400 Subject: [PATCH 1/3] Server-render GitHub stars; move theme toggle to footer Server-render the GitHub stars badge (async component with Next revalidation) to avoid client flash and cache counts for 1 hour. Move the theme toggle out of the top SiteNav into the SiteFooter and add a footer Discord social link. Introduce an actions slot on SiteNav and pass the GitHubStarsBadge into multiple pages (home, blog, docs, brand, primitives, openclaw, telemetry). Simplify the /blog index to a compact title-and-author list with metadata and move the RSS link into the header. Add/update related CSS modules for blog, github badge, and footer. Update trajectories metadata with decision entries and lastUpdated timestamp. --- .trajectories/active/traj_4r047wx9ml89.json | 84 +++++++++++++++ .trajectories/index.json | 2 +- web/app/blog/[slug]/page.tsx | 3 +- web/app/blog/page.tsx | 110 +++++++------------- web/app/brand/page.tsx | 3 +- web/app/docs/layout.tsx | 3 +- web/app/openclaw/page.tsx | 3 +- web/app/page.tsx | 3 +- web/app/primitives/page.tsx | 3 +- web/app/telemetry/page.tsx | 3 +- web/components/GitHubStars.tsx | 60 +++++++---- web/components/SiteFooter.tsx | 21 +++- web/components/SiteNav.tsx | 10 +- web/components/blog/blog.module.css | 82 +++++++++++++-- web/components/github-stars.module.css | 6 ++ web/components/site-footer.module.css | 27 +++++ 16 files changed, 303 insertions(+), 120 deletions(-) diff --git a/.trajectories/active/traj_4r047wx9ml89.json b/.trajectories/active/traj_4r047wx9ml89.json index 96a2ca319..ccc78cedf 100644 --- a/.trajectories/active/traj_4r047wx9ml89.json +++ b/.trajectories/active/traj_4r047wx9ml89.json @@ -102,6 +102,90 @@ "reasoning": "The repository only had a single dedicated workflow file for this action at .github/workflows/sst-command.yml, with no other code or docs references requiring follow-up edits." }, "significance": "high" + }, + { + "ts": 1775770800280, + "type": "decision", + "content": "Moved theme switching from SiteNav to SiteFooter: Moved theme switching from SiteNav to SiteFooter", + "raw": { + "question": "Moved theme switching from SiteNav to SiteFooter", + "chosen": "Moved theme switching from SiteNav to SiteFooter", + "alternatives": [], + "reasoning": "Keeps primary navigation focused on site navigation/actions while preserving a single global theme control in a lower-priority UI area." + }, + "significance": "high" + }, + { + "ts": 1775771013652, + "type": "decision", + "content": "Added Discord footer social link: Added Discord footer social link", + "raw": { + "question": "Added Discord footer social link", + "chosen": "Added Discord footer social link", + "alternatives": [], + "reasoning": "The footer already groups external community links there, so Discord belongs with the existing social icons rather than in primary navigation." + }, + "significance": "high" + }, + { + "ts": 1775791143404, + "type": "decision", + "content": "Server-rendered the GitHub stars badge with Next revalidation: Server-rendered the GitHub stars badge with Next revalidation", + "raw": { + "question": "Server-rendered the GitHub stars badge with Next revalidation", + "chosen": "Server-rendered the GitHub stars badge with Next revalidation", + "alternatives": [], + "reasoning": "Eliminates the empty-then-flash client fetch by shipping a cached count in the initial HTML while keeping it fresh on a 1 hour cadence." + }, + "significance": "high" + }, + { + "ts": 1775791901772, + "type": "decision", + "content": "Simplified /blog index to a title-and-author list: Simplified /blog index to a title-and-author list", + "raw": { + "question": "Simplified /blog index to a title-and-author list", + "chosen": "Simplified /blog index to a title-and-author list", + "alternatives": [], + "reasoning": "The index should scan quickly; a plain list removes card noise and makes the page function more like an archive than a marketing surface." + }, + "significance": "high" + }, + { + "ts": 1775792144853, + "type": "decision", + "content": "Expanded blog archive rows with author, date, and estimated read time while removing the Blog title block: Expanded blog archive rows with author, date, and estimated read time while removing the Blog title block", + "raw": { + "question": "Expanded blog archive rows with author, date, and estimated read time while removing the Blog title block", + "chosen": "Expanded blog archive rows with author, date, and estimated read time while removing the Blog title block", + "alternatives": [], + "reasoning": "Keeps /blog as a compact archive view while still surfacing the metadata people need to scan posts quickly." + }, + "significance": "high" + }, + { + "ts": 1775792307369, + "type": "decision", + "content": "Moved blog archive metadata below each title with dot separators: Moved blog archive metadata below each title with dot separators", + "raw": { + "question": "Moved blog archive metadata below each title with dot separators", + "chosen": "Moved blog archive metadata below each title with dot separators", + "alternatives": [], + "reasoning": "Reads more naturally as an archive list than as a pseudo-table and matches the simpler scan pattern you asked for." + }, + "significance": "high" + }, + { + "ts": 1775792415891, + "type": "decision", + "content": "Moved the blog RSS link into the header beside the Blog title and removed the stacked divider: Moved the blog RSS link into the header beside the Blog title and removed the stacked divider", + "raw": { + "question": "Moved the blog RSS link into the header beside the Blog title and removed the stacked divider", + "chosen": "Moved the blog RSS link into the header beside the Blog title and removed the stacked divider", + "alternatives": [], + "reasoning": "The RSS action belongs in the page header, and using only the hero divider avoids the duplicate rule lines above the archive list." + }, + "significance": "high" } ] } diff --git a/.trajectories/index.json b/.trajectories/index.json index 17f8de4d1..e44316979 100644 --- a/.trajectories/index.json +++ b/.trajectories/index.json @@ -1,6 +1,6 @@ { "version": 1, - "lastUpdated": "2026-04-08T15:55:56.757Z", + "lastUpdated": "2026-04-10T03:40:15.892Z", "trajectories": { "traj_1b1dj40sl6jl": { "title": "Revert aggressive retry logic in relay-pty-orchestrator", diff --git a/web/app/blog/[slug]/page.tsx b/web/app/blog/[slug]/page.tsx index a1fb1f283..ed6440a9f 100644 --- a/web/app/blog/[slug]/page.tsx +++ b/web/app/blog/[slug]/page.tsx @@ -8,6 +8,7 @@ import remarkGfm from 'remark-gfm'; import { BlogTableOfContents } from '../../../components/blog/BlogTableOfContents'; import styles from '../../../components/blog/blog.module.css'; +import { GitHubStarsBadge } from '../../../components/GitHubStars'; import { SiteFooter } from '../../../components/SiteFooter'; import { SiteNav } from '../../../components/SiteNav'; import { getAllPosts, getPost, getRelatedPosts, slugifyHeading } from '../../../lib/blog'; @@ -166,7 +167,7 @@ export default async function BlogPostPage({ params }: PageProps) { return (
- + } />