React UI State Patterns
ChrisWiles/claude-code-showcase
Sets patterns for React interfaces: when to show loading spinners or skeletons, how to surface errors, how to disable buttons during async work and how to handle empty lists.
Page and layout component patterns for Rasengan.js. An agent skill from rasengan-dev/rasenganjs.
$ npx skills add rasengan-dev/rasenganjs --skill rasengan-pages -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install rasengan-dev/rasenganjs rasengan-pages --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/rasengan-dev/rasenganjs.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/rasengan-pages .claude/skills/rasengan-pages && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "rasengan-pages" agent skill from https://github.com/rasengan-dev/rasenganjs/tree/main/.agents/skills/rasengan-pages into .claude/skills/rasengan-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rasengan-pages", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/rasengan-dev/rasenganjs/tree/main/.agents/skills/rasengan-pagesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add rasengan-dev/rasenganjs --skill rasengan-pages -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install rasengan-dev/rasenganjs rasengan-pages --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rasengan-dev/rasenganjs.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/rasengan-pages .agents/skills/rasengan-pages && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "rasengan-pages" agent skill from https://github.com/rasengan-dev/rasenganjs/tree/main/.agents/skills/rasengan-pages into .agents/skills/rasengan-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rasengan-pages", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rasengan-dev/rasenganjs --skill rasengan-pages -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install rasengan-dev/rasenganjs rasengan-pages --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rasengan-dev/rasenganjs.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/rasengan-pages .cursor/skills/rasengan-pages && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "rasengan-pages" agent skill from https://github.com/rasengan-dev/rasenganjs/tree/main/.agents/skills/rasengan-pages into .cursor/skills/rasengan-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rasengan-pages", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/rasengan-dev/rasenganjs.git --path .agents/skills/rasengan-pages--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add rasengan-dev/rasenganjs --skill rasengan-pages -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install rasengan-dev/rasenganjs rasengan-pages --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rasengan-dev/rasenganjs.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/rasengan-pages .gemini/skills/rasengan-pages && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "rasengan-pages" agent skill from https://github.com/rasengan-dev/rasenganjs/tree/main/.agents/skills/rasengan-pages into .gemini/skills/rasengan-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rasengan-pages", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install rasengan-dev/rasenganjs rasengan-pagesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add rasengan-dev/rasenganjs --skill rasengan-pages -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/rasengan-dev/rasenganjs.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/rasengan-pages .github/skills/rasengan-pages && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "rasengan-pages" agent skill from https://github.com/rasengan-dev/rasenganjs/tree/main/.agents/skills/rasengan-pages into .github/skills/rasengan-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rasengan-pages", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rasengan-dev/rasenganjs --skill rasengan-pages -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install rasengan-dev/rasenganjs rasengan-pages --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rasengan-dev/rasenganjs.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/rasengan-pages .opencode/skills/rasengan-pages && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "rasengan-pages" agent skill from https://github.com/rasengan-dev/rasenganjs/tree/main/.agents/skills/rasengan-pages into .opencode/skills/rasengan-pages/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "rasengan-pages", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
rasengan-pagesPage and layout component patterns for Rasengan.js. An agent skill from rasengan-dev/rasenganjs.
Rasengan Pages is an agent skill from rasengan-dev/rasenganjs. Page and layout component patterns for Rasengan.js. Covers page components, layouts, metadata, MDX pages, entry point setup, HTML template, navigation, error boundaries, and 404 handling. Use when creating or modifying .page.tsx, .page.mdx, layout.tsx, main.tsx, template.tsx, or index.ts files.
Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Frontend & Design, covering React components, Markdown and Error handling. The repository describes itself as: Rasengan.js is a full-stack meta-framework for React — SSR, SSG, and a built-in backend, running anywhere from Node.js to the edge, without compromising on performance. The licence is MIT.
Read from SKILL.md and the folder at commit 459b93b. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript, mdx and javascript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Rasengan Pages loads about 2.2k tokens when it runs. Until then it costs about 78 tokens; SKILL.md has 458 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from rasengan-dev/rasenganjs at commit 459b93b, republished under its MIT licence (© rasengan-dev). 458 words, ~2,167 tokens.
.claude/skills/rasengan-pages/SKILL.md (or your agent's skills folder)..page.tsx / .page.mdx filelayout.tsx filesrc/main.tsx (App component) or src/template.tsx (HTML shell)src/index.ts (entry point)@rasenganjs/mdximport { renderApp } from 'rasengan/client';
import App from './main';
import AppRouter from '@/app/app.router';
renderApp(App, AppRouter, { reactStrictMode: true });Parameters:
App — Root App component (default import from ./main)AppRouter? — Optional for config-based routing. Omit for file-based routing where router is defined inside main.tsxoptions? — { reactStrictMode?: boolean }src/main.{jsx,tsx}:
import { type AppProps } from 'rasengan';
export default function App({ Component, children }: AppProps) {
return (
<Provider>
<Component router={AppRouter}>{children}</Component>
</Provider>
);
}AppProps ({ Component, children })<Component> around children to enable routingsrc/template.{jsx,tsx}:
import { type TemplateProps } from 'rasengan';
export default function Template({ Head, Body, Script }: TemplateProps) {
return (
<html lang="en">
<Head>
<meta charSet="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</Head>
<Body>
<Script />
</Body>
</html>
);
}Props:
Head — Component for <head> contentBody — Component for <body> content (children appended after <div id="root">)Script — Component for additional scripts (place inside <Body>)File: src/app/home.page.tsx
import { type PageComponent } from 'rasengan';
const Home: PageComponent = () => {
return <main>Home Page</main>;
};
Home.path = '/';
Home.metadata = {
title: 'Home',
description: 'Home page description',
openGraph: {
title: 'Home',
description: 'Home page description',
url: 'https://example.com',
image: 'https://example.com/og.png',
},
twitter: {
card: 'summary_large_image',
image: 'https://example.com/twitter.png',
title: 'Home',
},
};
export default Home;File: src/app/_routes/index.page.tsx
const Home = () => <main>Home Page</main>;
export default Home;Rules:
src/app/_routes/ are auto-discovered*.page.{js,ts,jsx,tsx,mdx,md}path needed — derived from file locationmetadata can be set on the exported componentlayout.tsx files for layouts in the same directoryimport { Outlet, type LayoutComponent } from 'rasengan';
const AppLayout: LayoutComponent = () => {
return (
<div>
<header>Shared Header</header>
<main>
<Outlet />
</main>
<footer>Shared Footer</footer>
</div>
);
};
AppLayout.path = '/';
AppLayout.metadata = {
openGraph: { title: 'My App', image: '...' },
};
export default AppLayout;Layouts in subdirectories are automatically nested:
File: src/app/_routes/(docs)/layout.tsx
import { Outlet } from 'rasengan';
const DocsLayout = () => (
<div className="flex">
<nav>Docs Sidebar</nav>
<main>
<Outlet />
</main>
</div>
);
export default DocsLayout;Rules:
<Outlet /> where child routes should appearpath as a static property for config-based routingmetadata on layouts applies to all child pages (merged with page metadata, page wins)LayoutComponent type from rasengan for TypeScripttype Metadata = {
title?: string;
description?: string;
openGraph?: {
type?: string;
title?: string;
description?: string;
url: string;
image: string;
width?: string;
height?: string;
};
twitter?: {
card: 'summary_large_image' | 'summary';
image: string;
title: string;
description?: string;
creator?: string;
site?: string;
};
links?: Array<{ rel: string; type?: string; sizes?: string; href: string }>;
metaTags?: Array<{ name?: string; property?: string; content: string }>;
};Rules:
meta overrides static metadataopenGraph.url and openGraph.image are required when using Open Graphtwitter.card, twitter.image, twitter.title are required when using Twitter cardsMDX files in _routes/ automatically render as pages:
---
metadata:
title: My MDX Page
description: Page description
toc: true
---Custom MDX components configured at project root via mdx-components.{js,ts,jsx,tsx}:
import { defineMDXConfig } from '@rasenganjs/mdx';
export default defineMDXConfig({
components: {
h1: ({ children }) => <h1 className="text-3xl">{children}</h1>,
},
layout: ({ children, toc }) => (
<div className="flex">
<article>{children}</article>
<aside>{toc}</aside>
</div>
),
});The @rasenganjs/mdx Vite plugin must be configured in rasengan.config.js:
import mdx from '@rasenganjs/mdx/plugin';
export default defineConfig({
vite: { plugins: [mdx()] },
});ErrorBoundary automaticallyConfig-based 404:
import { RouterComponent, defineRouter } from 'rasengan';
const NotFound = () => (
<section>
<h1>404</h1>
<p>Page not found</p>
</section>
);
class AppRouter extends RouterComponent {}
export default defineRouter({
pages: [Home],
notFoundComponent: NotFound,
})(AppRouter);A catch-all * route is auto-added by generateRoutes().
import { Link, NavLink, useNavigate, ScrollRestoration } from 'rasengan';
<Link to="/about">About</Link>
<Link to="#section">Section</Link>
<NavLink to="/about" className={({ isActive }) => isActive ? 'active' : ''}>About</NavLink>
const navigate = useNavigate();
navigate('/about');
<ScrollRestoration alwaysToTop />
<ScrollRestoration target={containerRef} />| Don't ❌ | Do ✅ |
|---|---|
Forgetting to set .path on page/layout components | Always set .path as a static property for config-based routing |
Using React.FC type for pages/layouts | Use PageComponent / LayoutComponent from rasengan |
| Putting metadata only in the component body | Use static .metadata property so the framework reads it at build time |
Importing directly from react-router | Import routing APIs from rasengan |
Rendering <Outlet> outside layouts | Only <Outlet /> in layout components |
| Defining loaders as exported functions but not attaching them | Attach loader as static .loader property on component |
Nesting pages too deep in _routes/ | Keep route tree shallow — each directory adds a path segment |
Forgetting "type": "module" in package.json | Rasengan is ESM-only |
Using navigate() outside route components | Only use navigation hooks within router-rendered components |
© rasengan-dev, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/rasengan-pages of rasengan-dev/rasenganjs.
Open the folder on GitHubat commit 459b93b
Rasengan Pages next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Rasengan Pages this skillrasengan-dev/rasenganjs | 124 | — | ~2.2k | Automated safety check: Pass | MIT | |
| React UI State PatternsChrisWiles/claude-code-showcase | 6.1k | 8 repos | ~1.6k | Automated safety check: Pass | None | |
| Fumadocsbetter-notify/better-notify | 313 | — | ~2.3k | Automated safety check: Pass | MIT | |
| Cookbook Add Modelsgl-project/sglang | 37k | 2 repos | ~4k | Automated safety check: Pass | Apache-2.0 | |
| Blog ChartAgriciDaniel/claude-blog | 2.3k | — | ~2.4k | Automated safety check: Pass | MIT | |
| React Component Documentationgetsentry/sentry | 46k | — | ~3.6k | Automated safety check: Pass | Custom licence |
ChrisWiles/claude-code-showcase
Sets patterns for React interfaces: when to show loading spinners or skeletons, how to surface errors, how to disable buttons during async work and how to handle empty lists.
better-notify/better-notify
A skill your agent uses when writing MDX documentation pages for a Fumadocs project — frontmatter, meta.json, page ordering, and fumadocs-ui React components available inside MDX content.
sgl-project/sglang
Add a new model to the SGLang Cookbook (docs/, Mintlify), config-driven format — instantiate the model-agnostic template into a per-model config (+ benchmarks) JSX under src/snippets/configs/, an…
AgriciDaniel/claude-blog
Generate dark-mode-compatible inline SVG data visualization charts for blog posts.
getsentry/sentry
Create or update component documentation in Sentry's MDX stories format.
affaan-m/ECC
React 18/19 patterns including hooks discipline, server/client component boundaries, Suspense + error boundaries, form actions, data fetching, state management decision trees, and…
rasengan-dev/rasenganjs
Master effective code review practices to provide constructive feedback, catch bugs early, and foster knowledge sharing while maintaining team morale.
rasengan-dev/rasenganjs
Project configuration and rendering mode patterns for Rasengan.js.
rasengan-dev/rasenganjs
Data fetching and SSG static path patterns for Rasengan.js. An agent skill from rasengan-dev/rasenganjs.
rasengan-dev/rasenganjs
Deployment patterns for Rasengan.js. An agent skill from rasengan-dev/rasenganjs.
rasengan-dev/rasenganjs
Rasengan.js ecosystem package patterns. An agent skill from rasengan-dev/rasenganjs.
rasengan-dev/rasenganjs
Optimization patterns for Rasengan.js. An agent skill from rasengan-dev/rasenganjs.
Page and layout component patterns for Rasengan.js. An agent skill from rasengan-dev/rasenganjs. Rasengan Pages is an agent skill from rasengan-dev/rasenganjs.js.
Rasengan Pages fits situations like: modifying .page.tsx; tasks that involve React components; tasks that involve Markdown.
Run `npx skills add rasengan-dev/rasenganjs --skill rasengan-pages -a claude-code`. Or copy the skill folder (.agents/skills/rasengan-pages in rasengan-dev/rasenganjs) into .claude/skills/rasengan-pages in your project. Claude Code loads it when a task matches its description.
Run `npx skills add rasengan-dev/rasenganjs --skill rasengan-pages -a codex`. Or copy the skill folder (.agents/skills/rasengan-pages in rasengan-dev/rasenganjs) into .agents/skills/rasengan-pages in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add rasengan-dev/rasenganjs --skill rasengan-pages -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/rasengan-pages, .gemini/skills/rasengan-pages, .github/skills/rasengan-pages and .opencode/skills/rasengan-pages in your project.
SKILL.md names no scripts, command-line tools or credentials: Rasengan Pages is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Rasengan Pages is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.2k tokens (SKILL.md is roughly 8.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Rasengan Pages: React UI State Patterns (ChrisWiles/claude-code-showcase, 6.1k stars), Fumadocs (better-notify/better-notify, 313 stars), Cookbook Add Model (sgl-project/sglang, 37k stars) and Blog Chart (AgriciDaniel/claude-blog, 2.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
rasengan-dev (a GitHub organization) maintains it in rasengan-dev/rasenganjs, which has 124 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on October 9, 2026.
Source: rasengan-dev/rasenganjs on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.