Skip to content

[codex] Update marketing pages and docs navigation#14

Draft
willwashburn wants to merge 8 commits into
mainfrom
codex/marketing-pages-refresh
Draft

[codex] Update marketing pages and docs navigation#14
willwashburn wants to merge 8 commits into
mainfrom
codex/marketing-pages-refresh

Conversation

@willwashburn

@willwashburn willwashburn commented Jun 27, 2026

Copy link
Copy Markdown
Member

Summary

  • Moves the original home experience to /messaging and adds new blank-slate /reflex, /about, and /careers routes.
  • Refreshes the shared navigation, footer structure, and messaging page CTAs/install section.
  • Adds the Agents docs product section and docs product selector in the sidebar.

Impact

These changes update the public marketing surface and docs navigation so the site can support the new home/about direction while preserving the existing messaging page.

Validation

  • npm --workspace web run build
  • git diff --check

Summary by cubic

Refreshes the marketing site and docs: adds About/Careers, moves the original home to /messaging, introduces Agents docs with a product switcher, and rebuilds the homepage with an editable poster hero that extends under the nav, has a lower cutoff, and a deeper shadow. Also adds a new Relay explainer section to the homepage to clarify how agent teams coordinate.

  • New Pages & Navigation

    • Moved the original home to /messaging; added /about, /careers, and /reflex; rebuilt / with an editable poster hero (HomePosterText), a “Get Started” CTA, and a new Relay explainer section.
    • Added a copy-to-clipboard install command (npx @agent-relay@latest skills add) via the hero command CTA; refreshed Quick Start visuals/CTAs.
    • Updated SiteNav to support custom actions and mobile content with optional hidden links; blog now uses this and shows a “Get Started” CTA.
    • Extended the poster hero backdrop under the nav, lowered its cutoff, loosened letter spacing, and deepened the shadow; rebuilt SiteFooter into 5 columns with cleaner links and external icons; updated landing styles.
  • Docs

    • Added Agents docs at /docs/agents/* (introduction, quickstart, patterns, build, deploy) with OG images and Markdown routes; /docs/agents redirects to introduction.
    • Introduced a docs product switcher in the sidebar (Relay, Agents, etc.) with updated icons and version badges.
    • Extended product-docs-nav and lib/product-docs with agentsSection.

Written for commit 474e81f. Summary will update on new commits.

Review in cubic

@coderabbitai

coderabbitai Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b672054c-841d-4d2d-afa0-3af925bfce02

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/marketing-pages-refresh

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Code Review

This pull request introduces several new pages, including About, Careers, Reflex, and Messaging, alongside a new Agents documentation section. It also refactors the home page, updates the SiteFooter to use a dynamic configuration array, and adds a new DocsProductSwitcher dropdown to the documentation navigation. The review feedback highlights opportunities to improve code quality and user experience: consolidating duplicate JSX variables in the About page, replacing a native <img> element with Next.js's <Image> component for better optimization, and programmatically closing the <details> dropdown in the new product switcher upon navigation.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +248 to +295
function DocsProductSwitcher({ activeId }: { activeId: string | null }) {
const activeProduct =
docsProductOptions.find((option) => option.id === activeId) ?? docsProductOptions[0];
const ActiveIcon = activeProduct.Icon;

return (
<div className={styles.productHeader}>
<details className={styles.productSwitcher}>
<summary className={styles.productSwitcherSummary}>
<span className={styles.productSwitcherCurrent}>
<ActiveIcon className={styles.productHeaderIcon} aria-hidden="true" />
<span className={styles.productSwitcherText}>
<span className={styles.productSwitcherLabel}>{activeProduct.label}</span>
<span className={styles.productHeaderTagline}>{activeProduct.tagline}</span>
</span>
</span>
<span className={styles.productSwitcherMeta}>
{activeProduct.version && (
<span className={styles.productHeaderVersion}>v{activeProduct.version}</span>
)}
<ChevronDown className={styles.productSwitcherChevron} aria-hidden="true" />
</span>
</summary>
<div className={styles.productSwitcherMenu}>
{docsProductOptions.map((option) => {
const OptionIcon = option.Icon;
const isActive = option.id === activeId;
return (
<Link
key={option.id ?? 'relay'}
href={option.href}
className={`${styles.productSwitcherOption} ${
isActive ? styles.productSwitcherOptionActive : ''
}`}
>
<OptionIcon className={styles.productSwitcherOptionIcon} aria-hidden="true" />
<span className={styles.productSwitcherOptionText}>
<span>{option.label}</span>
<span>{option.tagline}</span>
</span>
</Link>
);
})}
</div>
</details>
</div>
);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Using a native <details> element for the product switcher inside a persistent layout can cause the dropdown menu to remain open after navigating to a different page. To ensure a smooth user experience, we should programmatically close the dropdown when a link is clicked. Since useRef is already imported in this file, we can easily achieve this by assigning a ref to the <details> element and setting its open property to false in the link's onClick handler.

function DocsProductSwitcher({ activeId }: { activeId: string | null }) {
  const detailsRef = useRef<HTMLDetailsElement>(null);
  const activeProduct =
    docsProductOptions.find((option) => option.id === activeId) ?? docsProductOptions[0];
  const ActiveIcon = activeProduct.Icon;

  return (
    <div className={styles.productHeader}>
      <details ref={detailsRef} className={styles.productSwitcher}>
        <summary className={styles.productSwitcherSummary}>
          <span className={styles.productSwitcherCurrent}>
            <ActiveIcon className={styles.productHeaderIcon} aria-hidden="true" />
            <span className={styles.productSwitcherText}>
              <span className={styles.productSwitcherLabel}>{activeProduct.label}</span>
              <span className={styles.productHeaderTagline}>{activeProduct.tagline}</span>
            </span>
          </span>
          <span className={styles.productSwitcherMeta}>
            {activeProduct.version && (
              <span className={styles.productHeaderVersion}>v{activeProduct.version}</span>
            )}
            <ChevronDown className={styles.productSwitcherChevron} aria-hidden="true" />
          </span>
        </summary>
        <div className={styles.productSwitcherMenu}>
          {docsProductOptions.map((option) => {
            const OptionIcon = option.Icon;
            const isActive = option.id === activeId;
            return (
              <Link
                key={option.id ?? 'relay'}
                href={option.href}
                className={`${styles.productSwitcherOption} ${
                  isActive ? styles.productSwitcherOptionActive : ''
                }`}
                onClick={() => {
                  if (detailsRef.current) {
                    detailsRef.current.open = false;
                  }
                }}
              >
                <OptionIcon className={styles.productSwitcherOptionIcon} aria-hidden="true" />
                <span className={styles.productSwitcherOptionText}>
                  <span>{option.label}</span>
                  <span>{option.tagline}</span>
                </span>
              </Link>
            );
          })}
        </div>
      </details>
    </div>
  );
}

Comment thread web/app/about/page.tsx
Comment on lines +32 to +45
const navGetStartedLink = (
<Link href="/docs" className={`${s.ctaPrimary} ${s.homeNavAction}`}>
Get Started
</Link>
);
const mobileGetStartedLink = (
<Link href="/docs" className={`${s.ctaPrimary} ${s.homeNavAction}`}>
Get Started
</Link>
);

return (
<div className={`${s.page} ${s.homePage} ${s.aboutPage}`}>
<SiteNav actions={navGetStartedLink} mobileMenuContent={mobileGetStartedLink} hideLinks />

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

There is redundant code duplication where navGetStartedLink and mobileGetStartedLink are defined as two separate but completely identical JSX elements. We can consolidate them into a single getStartedLink variable and pass it to both props in <SiteNav />. This simplifies the component and improves maintainability.

  const getStartedLink = (
    <Link href="/docs" className={`${s.ctaPrimary} ${s.homeNavAction}`}>
      Get Started
    </Link>
  );

  return (
    <div className={`${s.page} ${s.homePage} ${s.aboutPage}`}>
      <SiteNav actions={getStartedLink} mobileMenuContent={getStartedLink} hideLinks />

Comment thread web/app/about/page.tsx
<span className={`${s.aboutOrbitNode} ${s.aboutOrbitNodeBottom}`}>Memory</span>
<span className={`${s.aboutOrbitNode} ${s.aboutOrbitNodeLeft}`}>Files</span>
<span className={s.aboutOrbitCore}>
<img src="/brand-kit/agent-relay-mark-transparent.png" alt="" className={s.aboutOrbitMark} />

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

Using a native <img> element in Next.js can trigger the @next/next/no-img-element ESLint warning/error and bypass Next.js's automatic image optimization features (such as layout shifting prevention, resizing, and modern format serving). Consider importing and using the Next.js <Image> component from 'next/image' instead.

@github-actions

github-actions Bot commented Jun 27, 2026

Copy link
Copy Markdown
Contributor

Preview deployed!

Environment URL
Web https://fce30859-agentrelay-web.agent-workforce.workers.dev

This is a Cloudflare Workers preview version of this PR's build.

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