Optimizes Next.js App Router data fetching by converting client-side useEffect/useState patterns to server-side React Server Components, eliminating loading spinners and improving initial load/SEO.
npx claudepluginhub joshuarweaver/cascade-code-general-misc-4 --plugin julianromli-ai-skillsThis skill uses the workspace's default tool permissions.
Optimize slow client-side data fetching to instant server-side rendering.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Optimize slow client-side data fetching to instant server-side rendering.
Search for these anti-patterns in the codebase:
# Find client-side fetching patterns
rg -n "useEffect.*fetch|useState.*loading|useStore\(\)" --type tsx
rg -n '"use client"' app/ --type tsx
Red flags:
"use client" + useEffect + fetch() = slow initial loaduseState(true) for isLoading = user sees spinneruseStore() or useContext for initial page data = waterfall fetchingDetermine what data the page needs on initial render:
Move sections with useInView, useState, onClick to separate Client Components:
// components/data-section.tsx
"use client";
interface DataSectionProps {
data: Item[]; // Receive data as props
}
export function DataSection({ data }: DataSectionProps) {
const [ref, inView] = useInView(); // Client-side animation OK
return <div ref={ref}>...</div>;
}
// app/page.tsx - NO "use client"
import { getData } from "@/lib/actions/data";
import { DataSection } from "@/components/data-section";
export default async function Page() {
const data = await getData(); // Fetch on server
return <DataSection data={data} />;
}
When DB types differ from frontend types:
import type { Item as DBItem } from "@/lib/database.types";
import type { Item } from "@/lib/types";
function adaptDBToFrontend(db: DBItem): Item {
return {
id: db.id,
name: db.name,
description: db.description ?? "",
createdAt: new Date(db.created_at),
};
}
export default async function Page() {
const dbItems = await getItems();
const items = dbItems.map(adaptDBToFrontend);
return <ItemList items={items} />;
}
Keep "use client" when:
See references/patterns.md for: