Skip to content

Make the Codewhale public site documentation-led#4362

Merged
Hmbown merged 3 commits into
mainfrom
codex/public-site-underwater-redesign
Jul 14, 2026
Merged

Make the Codewhale public site documentation-led#4362
Hmbown merged 3 commits into
mainfrom
codex/public-site-underwater-redesign

Conversation

@Hmbown

@Hmbown Hmbown commented Jul 14, 2026

Copy link
Copy Markdown
Owner

Summary

  • replace the long marketing/stat/provider sequence with a compact documentation portal
  • make repository-derived install, runtime, provider, and version guidance the primary homepage content
  • introduce a restrained underwater visual system aligned with CWC typography, control density, dividers, and Signal Gold accents
  • highlight Codewhale as an international open-source community with direct issue, contribution guide, pull-request, and community links
  • keep the public site separate from the signed-in app contract; do not advertise a dead app domain

Verification

  • facts check passed
  • docs check passed for 15 topics
  • 23 web tests passed
  • lint passed
  • Next.js production build passed for 39 pages
  • responsive browser QA passed at desktop, tablet, and mobile sizes in English and Chinese, including the mobile menu
  • no console, page, request, or horizontal-overflow errors

Scope

This PR changes only the public site. It does not deploy the site, change DNS, or modify the CWC app/control-plane repositories.

Replace the oversized marketing sequence with a compact documentation portal, repository-derived quickstart facts, and direct topic navigation.

Keep the underwater identity restrained, align typography and controls with CWC, and give the international contributor community clear issue and pull-request paths.

Verified with facts/docs checks, 23 web tests, lint, a 39-page production build, and responsive browser QA.

Signed-off-by: Hunter B <hmbown@gmail.com>
Copilot AI review requested due to automatic review settings July 14, 2026 02:03

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@claude

claude Bot commented Jul 14, 2026

Copy link
Copy Markdown

Claude finished @Hmbown's task in 5m 59s —— View job


Claude's review progress

  • Gather context (PR diff, changed files)
  • Understand request (this is a code review of the public-site rewrite, triggered on PR open)
  • Review diff for correctness, safety, reuse, tests, security
  • Post inline comments and summary

Summary

This PR replaces the public site's marketing homepage with a documentation-led portal, and re-themes nav/footer/whale mark/palette/typography to an "underwater" visual system. It's scoped to web/ only (Next.js/React) — there's no Rust runtime code here, so the repo's provider/model-routing-safety invariant (EPIC #2608) doesn't apply to this diff; nothing here infers a provider switch from a prefix or freeform text.

The new topics()/topicHref()/TopicList helpers in page.tsx are a clean way to drive the homepage sections off the existing DOC_TOPICS registry (web/lib/docs-map.ts, untouched by this PR) instead of hand-rolled content blocks — good reuse of a single source of truth. Removing the live GitHub star fetch from nav.tsx (previously an API call on every render) is a nice simplification that removes a runtime failure mode from the header.

Four smaller findings, posted inline, none blocking:

  1. Brand-name inconsistency (web/lib/page-meta.ts:6) — SITE_NAME/the nav+footer wordmark move from "CodeWhale" to "Codewhale", but ~11 other page files this PR doesn't touch (install, docs, faq, models, roadmap, runtime, community, constitution, contribute, digest, feed) still hardcode "CodeWhale" in their <title>/meta description. Site will show both spellings depending on which page a visitor lands on.
  2. Duplicated special-case logic (web/app/[locale]/page.tsx:18 and :33) — topicHref() and TopicList's external check both independently hardcode topic.id === "install" | "providers". Low risk today, but the two lists can drift.
  3. Stale pre-rebrand color (web/components/mobile-menu.tsx:64, also web/app/globals.css:74-75) — still hardcodes the old ink rgba(14,14,16,...) instead of the new ink rgb(27,34,48) used everywhere else in the palette migration.
  4. Dead CSS (web/app/globals.css:316-330, :500) — .site-install-link appears unused after the nav no longer renders a desktop Install button.

Given the sandbox here has no network access, I did not independently re-run the build/tests/lint the PR description claims passed (facts check, docs check, 23 web tests, lint, prod build, browser QA) — those results are as reported in the PR body.

Comment thread web/lib/page-meta.ts
export const SITE_URL = "https://codewhale.net";

export const SITE_NAME = "CodeWhale";
export const SITE_NAME = "Codewhale";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Brand-name inconsistency introduced by this PR. SITE_NAME (and the nav/footer wordmark, and this file's IDENTITY_PHRASE) is now "Codewhale" (lowercase w), but the ~11 other page files this PR doesn't touch — install/page.tsx:14, plus docs/page.tsx, faq/page.tsx, models/page.tsx, roadmap/page.tsx, runtime/page.tsx, community/page.tsx, constitution/page.tsx, contribute/page.tsx, digest/page.tsx, feed/page.tsx — still hardcode <title>/description strings as "CodeWhale". Result: the browser tab title and OG siteName disagree across pages on how the product is spelled. Worth a follow-up pass to make the rename consistent (GitHub repo URLs github.com/Hmbown/CodeWhale should stay as-is since that's the actual repo name).

Fix this →

Comment thread web/app/[locale]/page.tsx
Comment on lines +18 to +33
function topicHref(topic: DocTopic, locale: string): string {
if (topic.id === "install") return `/${locale}/install`;
if (topic.id === "providers") return `/${locale}/models`;
if (topic.hasPage) return `/${locale}/docs/${topic.slug}`;

const FALLBACK_DISPATCH_EN: CuratedDispatch = {
generatedAt: new Date().toISOString(),
headline: "Quiet release week — install paths and contributor guides up to date.",
summary:
"This dispatch is regenerated by DeepSeek V4-Flash on a six-hour cron. Until the cron fills in fresh repo activity, the static links below are the best starting points.",
highlights: [
{ title: "Install", href: "/en/install", tag: "shipped", blurb: "npm, Cargo, Homebrew, or a direct download." },
{ title: "Open issues", href: "https://github.com/Hmbown/CodeWhale/issues", tag: "opened", blurb: "Start with anything labelled good first issue." },
{ title: "Roadmap", href: "/en/roadmap", tag: "discussion", blurb: "What is confirmed, what is being weighed, what is ruled out." },
],
movers: [],
};
const source = Array.isArray(topic.repoSource) ? topic.repoSource[0] : topic.repoSource;
return `${REPO_DOCS_BASE}/${source}`;
}

const FALLBACK_DISPATCH_ZH: CuratedDispatch = {
generatedAt: new Date().toISOString(),
headline: "本周发布平稳——安装路径和贡献指南已同步。",
summary:
"本「今日要闻」由 DeepSeek V4-Flash 每六小时重新生成。在 cron 写入真实仓库动态之前,下面的固定链接是最实用的入口。",
highlights: [
{ title: "安装", href: "/zh/install", tag: "shipped", blurb: "npm、Cargo、Homebrew,或直接下载。" },
{ title: "开放议题", href: "https://github.com/Hmbown/CodeWhale/issues", tag: "opened", blurb: "从 good first issue 标签开始。" },
{ title: "路线图", href: "/zh/roadmap", tag: "discussion", blurb: "已确认、审议中、以及已排除的功能。" },
],
movers: [],
};
function TopicList({ items, locale }: { items: DocTopic[]; locale: string }) {
const isZh = locale === "zh";

return (
<div className="portal-topic-list">
{items.map((topic) => {
const external = !topic.hasPage && topic.id !== "install" && topic.id !== "providers";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

topicHref() (line 18) and this external check both hardcode topic.id === "install" / topic.id === "providers" independently. If a third special-cased route is ever added to topicHref, it's easy to forget updating this external predicate too — the link would then get the wrong target/rel (e.g. an internal-page link opening in a new tab, or an external repo link failing to). Low risk today since the two lists are still in sync, but worth collapsing into one source of truth, e.g. have topicHref return { href, external }.

Fix this →

Comment thread web/app/globals.css
Comment on lines +316 to +330
.site-install-link {
display: inline-flex;
min-height: 2.25rem;
align-items: center;
padding: 0.35rem 0.75rem;
border: 1px solid var(--hairline);
border-radius: 6px;
font-family: var(--font-body), "IBM Plex Sans", system-ui, sans-serif;
font-size: 0.72rem;
font-weight: 600;
}

.site-github-link:hover { border-color: var(--ink); }
.site-install-link { border-color: rgba(20, 35, 70, 0.17); background: linear-gradient(180deg, var(--indigo), var(--indigo-deep)); color: #fff; }
.site-install-link:hover { border-color: var(--indigo-deep); background: var(--indigo-deep); }

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

.site-install-link (here, and the display: none override at line 500) appears to be dead CSS. The desktop nav no longer renders an "Install →" button after this refactor (nav.tsx now only renders site-github-link plus the MobileMenu, and MobileMenu's install link uses a Tailwind utility class, not this one). Grepped the whole web/ tree — no component references className="site-install-link". Safe to delete unless it's intentionally kept for a near-term follow-up.

Fix this →

<div
id="mobile-menu"
className="md:hidden fixed inset-x-0 top-[5.7rem] bottom-0 z-40 bg-paper hairline-t overflow-y-auto"
className="md:hidden fixed inset-x-0 top-[4.25rem] bottom-0 z-40 bg-paper hairline-t overflow-y-auto"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not this line specifically, but nearby in this same file: the mobile menu list divider at line 64 still hardcodes the pre-rebrand ink color rgba(14,14,16,0.18) (#0E0E10), left over from before this PR's palette migration to the new ocean palette (--ink is now #1B2230 / rgb(27,34,48)). The same stale value also appears in web/app/globals.css:74-75 (the desktop column-rule background). Small visual inconsistency in an otherwise thorough palette pass — worth updating both to the new ink value.

Fix this →

Signed-off-by: Hunter B <hmbown@gmail.com>
@claude

claude Bot commented Jul 14, 2026

Copy link
Copy Markdown

Claude finished @Hmbown's task in 1m 47s —— View job


Claude's review progress

  • Gather context (PR diff, new commits since last review)
  • Understand request (synchronize trigger — re-review updated diff)
  • Review diff for correctness, safety, reuse, tests, security
  • Post inline comments and summary

Summary

This sync only added a merge commit (16a1434, "Merge v0.8.68 release main into public site redesign") bringing in unrelated main history. git diff origin/main...HEAD for web/ is byte-identical to what was reviewed at the last pass (+828/-841 across the same 11 files) — no new content changes landed in this update, and the merge resolved cleanly with no conflict markers or drift in the reviewed files.

Re-checked the diff end-to-end against the review priorities (correctness, provider/route safety, reuse, tests, security):

  • No Rust runtime code in this diff, so the provider/model-routing-safety invariant (EPIC v0.8.65 EPIC: Separate provider facts, model facts, offerings, and route resolution #2608) doesn't apply — this is web/ only (Next.js/React).
  • No new correctness bugs found. The Nav component dropping async/the live GitHub star fetch is safe — Next.js server components support both sync and async function components, and the call site (web/app/[locale]/layout.tsx:82) doesn't rely on awaiting it.
  • Confirmed topicHref()'s mixed internal/external routing (some START_TOPIC_IDS like guide/configuration resolve to GitHub-hosted markdown since their DOC_TOPICS entries have hasPage: false, while install/modes resolve to internal pages) is pre-existing behavior from the untouched web/lib/docs-map.ts registry, not a bug introduced here.

The four findings from the previous pass are still open (unchanged by this sync) and remain non-blocking:

  1. Brand-name inconsistencySITE_NAME (web/lib/page-meta.ts:6) is now "Codewhale", but ~11 untouched page files still hardcode "CodeWhale" in title/meta strings.
  2. Duplicated special-case logictopicHref() and TopicList's external check (web/app/[locale]/page.tsx:18 and :33) both hardcode topic.id === "install" | "providers" independently.
  3. Stale pre-rebrand ink colorweb/components/mobile-menu.tsx:64 and web/app/globals.css:74-75 still use rgba(14,14,16,...) instead of the new rgb(27,34,48) ink.
  4. Dead CSS.site-install-link (web/app/globals.css:316-330, :500) appears unused now that the desktop nav no longer renders an Install button.

No new inline comments needed since the diff content is unchanged. Sandbox here has no network access, so I did not independently run npm install/build/lint/tests — those results are as reported in the PR body from the prior verification pass.

Regenerate the tracked repository facts after the release runtime expanded the built-in tool catalog from 80 to 85 tools.

Signed-off-by: Hunter B <hmbown@gmail.com>
@claude

claude Bot commented Jul 14, 2026

Copy link
Copy Markdown

Claude finished @Hmbown's task in 30s —— View job


Claude's review progress

  • Gather context (PR diff, new commit since last review)
  • Understand request (synchronize trigger — re-review updated diff)
  • Review diff for correctness, safety, reuse, tests, security
  • Post inline comments and summary

Summary

This sync added one commit since the last review pass: b042ea1 ("chore(web): refresh facts after v0.8.68 merge"), which only touches web/lib/facts.generated.ts — bumping generatedAt and toolCount from 80 to 85 (reflecting the release runtime's expanded built-in tool catalog after the v0.8.68 merge). This is a generated data file, not hand-written logic; the change is mechanical and low-risk.

The web/ diff against origin/main otherwise remains unchanged from the previous two passes (+830/-843 across the same 12 files) — no new component/logic changes landed.

Re-checked against the review priorities:

  • No Rust runtime code in this diff, so the provider/model-routing-safety invariant (EPIC v0.8.65 EPIC: Separate provider facts, model facts, offerings, and route resolution #2608) doesn't apply — web/ only (Next.js/React).
  • No new correctness bugs. The facts.generated.ts edit is a straightforward regenerated-value bump, consistent with the file's .generated.ts naming (checked-in build artifact, not something to hand-edit further).
  • No new security/reuse/test concerns introduced by this commit.

The four findings from the previous passes are still open and remain non-blocking:

  1. Brand-name inconsistencySITE_NAME (web/lib/page-meta.ts:6) is now "Codewhale", but ~11 untouched page files still hardcode "CodeWhale" in title/meta strings (install, docs, faq, models, roadmap, runtime, community, constitution, contribute, digest, feed).
  2. Duplicated special-case logictopicHref() and TopicList's external check (web/app/[locale]/page.tsx:18 and :33) both hardcode topic.id === "install" | "providers" independently.
  3. Stale pre-rebrand ink colorweb/components/mobile-menu.tsx:64 and web/app/globals.css:74-75 still use rgba(14,14,16,...) instead of the new rgb(27,34,48) ink.
  4. Dead CSS.site-install-link (web/app/globals.css:316-330, :500) appears unused now that the desktop nav no longer renders an Install button.

Sandbox here has no network access, so I did not independently run npm install/build/lint/tests — those results are as reported in the PR body from the prior verification pass.

@Hmbown Hmbown merged commit 1ec2808 into main Jul 14, 2026
21 checks passed
Hmbown pushed a commit that referenced this pull request Jul 14, 2026
feat(web): add keyword search to docs hub and FAQ pages

Resolved a generatedAt-timestamp conflict in web/lib/facts.generated.ts
against the post-#4362 main; both sides already agreed on toolCount 85.
pull Bot pushed a commit to Stars1233/DeepSeek-TUI that referenced this pull request Jul 14, 2026
Follow-ups to the Hmbown#4362 documentation-led redesign, addressing the four
non-blocking findings from its review:

- Align user-visible brand strings across all web pages to the
  "Codewhale" wordmark the redesign introduced (repo URLs and the
  Hmbown/CodeWhale slug are untouched).
- Deduplicate the homepage topic special-cases: topicHref() and
  TopicList now share one TOPIC_PAGE_OVERRIDES map instead of two
  hardcoded id lists that could drift.
- Replace the stale pre-rebrand ink rgba(14,14,16,...) with the
  palette ink rgb(27,34,48) in globals.css and the mobile menu divider.
- Remove the dead .site-install-link CSS now that the desktop nav no
  longer renders an Install button.

Verified with eslint, 42 web tests, check-docs, and a full Next.js
production build (39 pages).

Prepared with agent assistance.
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.

2 participants