Skip to content

Polish Agent Orchestrator landing page#2260

Open
codebanditssss wants to merge 9 commits into
mainfrom
landing-page-close-to-final
Open

Polish Agent Orchestrator landing page#2260
codebanditssss wants to merge 9 commits into
mainfrom
landing-page-close-to-final

Conversation

@codebanditssss

@codebanditssss codebanditssss commented Jun 28, 2026

Copy link
Copy Markdown
Collaborator

Preview

landing page demo

Validation

  • npm run build in frontend/src/landing

@github-actions

github-actions Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

React Doctor found 28 issues in 10 files · 28 warnings · score 58 / 100 (Critical) · vs main

28 warnings

app/layout.tsx

  • ⚠️ L21 Plain script can block Next.js rendering nextjs-no-native-script

components/LandingAgentsBar.tsx

  • ⚠️ L28 Static value rebuilt every render prefer-module-scope-static-value
  • ⚠️ L61 Plain img ships unoptimized images nextjs-no-img-element

components/LandingCTA.tsx

  • ⚠️ L70 Plain anchor reloads internal Next.js links nextjs-no-a-element

components/LandingFeatures.tsx

  • ⚠️ L318 Plain img ships unoptimized images nextjs-no-img-element
  • ⚠️ L492 Plain img ships unoptimized images nextjs-no-img-element
  • ⚠️ L567 Plain img ships unoptimized images nextjs-no-img-element
  • ⚠️ L1011 Plain img ships unoptimized images nextjs-no-img-element

components/LandingFooter.tsx

  • ⚠️ L47 Plain anchor reloads internal Next.js links nextjs-no-a-element
  • ⚠️ L48 Plain img ships unoptimized images nextjs-no-img-element

components/LandingHero.tsx

  • ⚠️ L282 Plain img ships unoptimized images nextjs-no-img-element
  • ⚠️ L309 Button missing explicit type button-has-type
  • ⚠️ L339 Array index used as a key no-array-index-as-key
  • ⚠️ L402 Button missing explicit type button-has-type
  • ⚠️ L578 Plain anchor reloads internal Next.js links nextjs-no-a-element

components/LandingLiveDemo.tsx

  • ⚠️ L78 Pure function rebuilt every render prefer-module-scope-pure-function
  • ⚠️ L181 Button missing explicit type button-has-type

components/LandingNav.tsx

  • ⚠️ L83 useEffect setState flashes on mount rendering-hydration-no-flicker
  • ⚠️ L84 State initialized from a mount effect no-initialize-state
  • ⚠️ L101 Plain img ships unoptimized images nextjs-no-img-element
  • ⚠️ L143 Plain anchor reloads internal Next.js links nextjs-no-a-element
  • ⚠️ L155 Plain anchor reloads internal Next.js links nextjs-no-a-element
  • ⚠️ L164 Button missing explicit type button-has-type
  • ⚠️ L193 Plain anchor reloads internal Next.js links nextjs-no-a-element

components/LandingSocialProof.tsx

  • ⚠️ L134 State initialized from a mount effect no-initialize-state
  • ⚠️ L138 State initialized from a mount effect no-initialize-state
  • ⚠️ L158 Repeated property access in a loop js-cache-property-access

components/LandingVideo.tsx

  • ⚠️ L21 iframe missing sandbox attribute iframe-missing-sandbox

Reviewed by React Doctor for commit 6311334. See inline comments for fixes.

@codebanditssss codebanditssss force-pushed the landing-page-close-to-final branch from 785500f to 7057753 Compare June 28, 2026 11:34
return (
<html lang="en" suppressHydrationWarning>
<head>
<script dangerouslySetInnerHTML={{ __html: themeScript }} />

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.

React Doctor · react-doctor/nextjs-no-native-script (warning)

Plain <script> has no Next.js loading strategy, so it can block rendering.

Fix → Use next/script with strategy="afterInteractive" or "lazyOnload" so third-party scripts do not block rendering.

Docs

];

export function LandingAgentsBar() {
const marqueeAgents = [...agents, ...agents];

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.

React Doctor · react-doctor/prefer-module-scope-static-value (warning)

marqueeAgents inside LandingAgentsBar uses no local state but is rebuilt every render, so it looks new each time & breaks memoized children. Move it to the top of the file, outside the component.

Fix → Move the value above the component, at the top of the file. It doesn't use local state, so rebuilding it each update is wasted and makes it look new every time.

Docs

className="group flex h-[78px] w-[118px] shrink-0 flex-col items-center justify-end gap-2 px-2 py-2"
>
<div className="flex h-10 items-end justify-center">
<img

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.

React Doctor · react-doctor/nextjs-no-img-element (warning)

Plain ships unoptimized, oversized images.

Fix → Use next/image so users get optimized formats, responsive srcsets, and lazy loading instead of oversized image downloads.

Docs

Star on GitHub · 7.7k
<ArrowRightIcon className="h-4 w-4 transition-transform group-hover:translate-x-0.5" />
</a>
<a

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.

React Doctor · react-doctor/nextjs-no-a-element (warning)

Plain reloads the whole page for internal links, so Next.js loses client-side navigation and prefetching.

Fiximport Link from 'next/link' for client-side navigation, prefetching, and preserved scroll position

Docs

<article className="surface relative overflow-hidden bg-[#010102] p-0">
<div className="flex items-center justify-between border-b border-[color:var(--border)] px-5 py-4">
<div className="flex items-center gap-3">
<img src="/ao-logo-transparent.png" alt="" className="h-7 w-7 object-contain" />

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.

React Doctor · react-doctor/nextjs-no-img-element (warning)

Plain ships unoptimized, oversized images.

Fix → Use next/image so users get optimized formats, responsive srcsets, and lazy loading instead of oversized image downloads.

Docs

</a>
);
})}
<a

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.

React Doctor · react-doctor/nextjs-no-a-element (warning)

Plain reloads the whole page for internal links, so Next.js loses client-side navigation and prefetching.

Fiximport Link from 'next/link' for client-side navigation, prefetching, and preserved scroll position

Docs

const [theme, setTheme] = useState("dark");

useEffect(() => {
setTheme(document.documentElement.dataset.theme || "dark");

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.

React Doctor · react-doctor/no-initialize-state (warning)

Your users see an extra render with empty "theme" because a useEffect sets its starting value.

Fix → Pass the initial value directly to useState() instead of setting it from a mount-only useEffect. For SSR hydration, prefer useSyncExternalStore().

Docs

const observer = new MutationObserver(() => {
setTheme(document.documentElement.dataset.theme || "dark");
});
observer.observe(document.documentElement, {

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.

React Doctor · react-doctor/no-initialize-state (warning)

Your users see an extra render with empty "theme" because a useEffect sets its starting value.

Fix → Pass the initial value directly to useState() instead of setting it from a mount-only useEffect. For SSR hydration, prefer useSyncExternalStore().

Docs

for (const post of posts) {
const id = postId(post);
const node = tweetRefs.current[id];
if (!node || node.dataset.tweetRendered === `${id}-${theme}`) continue;

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.

React Doctor · react-doctor/js-cache-property-access (warning)

This slows the loop because node.dataset.tweetRendered is read 3 times inside it, so read it once into a variable at the top

Fix → Read the value once into a variable at the top of the loop: const { x, y } = obj.deeply.nested

Docs

data-testid="video-frame"
className="glow-accent relative aspect-video overflow-hidden rounded-2xl border border-[color:var(--border-strong)] bg-black"
>
<iframe

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.

React Doctor · react-doctor/iframe-missing-sandbox (warning)

An <iframe> with no sandbox is a security hole: the embedded page gets full access to your site.

Fix → Add sandbox="" or a curated value so embedded pages cannot get full access to your site by default.

Docs

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