| Provides a workflow for building and reviewing high-quality React and React Native UI with the Coinbase Design System (CDS). Use this skill to create UI or make visual changes to existing UI with CDS components, tokens, style props, icons, and illustrations. Use it for explicit CDS-adherence audits and reviews, not non-visual logic, data, analytics, navigation, tests, generated code, or refactoring. "perform a CDS audit on our changes", "check our codebase for CDS adherence", "does this feature use CDS well?"
npx skills add https://github.com/coinbase/cds --skill cds-code
Before responding, determine what the user needs:
Coding — the user wants to create new UI or make visual changes to existing UI with CDS → follow the Coding Workflow.
Review — the user explicitly asks to audit, review, or check existing code for CDS adherence → read guidelines/code-review.md and follow it instead.
Out of scope — the user wants non-visual work such as business logic, data handling, analytics, navigation wiring, tests, generated code, or refactoring → do not follow this skill's coding or review workflows.
Default in-scope work to coding. Only treat the user's request as a review or audit if the intent is explicit. Building or updating UI is the primary use case for this skill.
Run this once per session, before doing anything else.
Run the discovery script: scripts/discover-cds-packages.sh
Its output tells you:
CDS Runtime (web or mobile) — use this value as the platform argument for the CDS MCP server if it is needed.If the script cannot be run, much of the information it provides can be determined via manual inspection:
exports field of the package.json of installed CDS packages in node_modulesFor in-scope coding tasks, follow these steps in order.
YOU MUST perform steps 1 and 2 before writing any code!
For any CDS documentation needs, use either of the following tools.
If neither are available, let the user know but continue — documentation is helpful but not required.
cds-docs skill OR...cds-docs skill is not configured, try calling the CDS MCP server list-cds-routes tool.Then read the platform-specific docs (using the runtime detected in Initialization):
getting-started/stylinggetting-started/themingUse guidelines/components.md to help identify the appropriate CDS components for the task.
The guidelines file will cover most use cases, but you may optionally browse the CDS docs for the full list of supported CDS components.
If you decide your task will require icons (Icon or IconButton) or illustrations (SpotSquare, Pictogram, HeroSquare, etc.) please read the corresponding guidelines files for more details.
| Icons | Illustrations |
| --------------------- | ----------------------------- |
| guidelines/icons.md | guidelines/illustrations.md |
If no CDS component fits your use case, you may fall back to the following options in this order of priority:
IMPORTANT: Always inform the user which CDS components you are planning to use before moving on to Step 3.
For any CDS component you plan to use, retrieve and read their documentation (see Step 1 in this workflow for more details on docs setup).
If documentation is not retrievable for any reason, the published type definitions for the component may be used to determine the full props API a component affords. This is no substitute for reading the documentation, but it can be a useful fallback when documentation is not available.
Now create or update the UI with proper CDS components and usage.
The package name may vary between projects. Different repos may install CDS under different scopes.
Always match the full CDS package name(s) as determined in the initialization step. If the project already has CDS imports in existing code, match whatever scope those files use.
In most cases, you should avoid using inline style objects or CSS classNames (web only).
Through these methods it is very easy to make common mistakes like using hardcoded property values instead of the CDS design tokens.
Doing so would break the component's connection to the CDS theme.
If you must use a style object or a CSS className, you can still access the CDS theme either through the useTheme hook or by CSS variables (web only).
Most CDS components implement an API that conveniently allows you to apply CDS design tokens, internally we call these 'style props'.
In cds-web, style props essentially act as an API for applying atomic CSS classes, much like Tailwind's utility classes which are so prevelant in the web ecosystem.
You should prefer setting these style props for styling components over setting custom style via inline styles or CSS.
Why this matters: When you set font, color, textAlign, or other typography properties through style instead of props, the component loses its connection to the CDS theme. For example, setting fontSize and fontWeight via style without a font prop means the CDS font family never applies -- the text falls back to inherit and may render in the wrong typeface.
You should check a component's documentation which includes a props table to verify the available API.
Examples of opportunities to use style props over inline styles:
| Instead of style | Use the prop |
| --------------------------------------------------------------- | -------------------------------------------------- |
| style={{ color: "var(--color-fgMuted)" }} | color="fgMuted" |
| style={{ fontSize: 12, fontWeight: 500, lineHeight: "16px" }} | font="caption" (or the matching CDS font token) |
| style={{ textAlign: "center" }} | textAlign="center" |
| style={{ textTransform: "uppercase" }} | textTransform="uppercase" |
| style={{ display: "flex", flexDirection: "column" }} | Use VStack, or flexDirection="column" on Box |
| style={{ gap: 8 }} | gap={1} |
| style={{ padding: 16 }} | padding={2} |
| style={{ backgroundColor: "..." }} | background="bgAlternate" (or semantic token) |
Your task will be complete if:
width or height set to specific designer-specified values are acceptable.font, color, background, textTransform, paddingX, gap) instead of customization via inline style objects or with CSS classNames.Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).
React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
Next.js best practices - file conventions, RSC boundaries, data patterns, async APIs, metadata, error handling, route handlers, image/font optimization, bundling
Use when starting feature work that needs isolation from current workspace or before executing implementation plans - creates isolated git worktrees with smart directory selection and safety verification
Take coinbase/cds-code from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.