expo-design-system
Build and maintain a design system inside an Expo app - a reusable theme of design tokens (color, spacing, typography, radius, shadow, motion), reusable…
Skill by expo
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/expo-expo-design-system
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: design, frontend, ui-design, frontend-development
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/expo-design-system
What's inside
- Skill name
expo-design-system- Description
- Build and maintain a design system inside an Expo app - a reusable theme of design tokens (color, spacing, typography, radius, shadow, motion), reusable component structure with variant/size/state prop conventions, and rules for when to extract a repeated view into a shared component. Use when creating or organizing theme files and design tokens (theme.ts / theme/), extending an existing theme or styling library (NativeWind, Tamagui, Restyle, Unistyles) in its own idiom, standardizing styles so screens (including AI-generated ones) look consistent and polished, fixing an app that looks AI-generated or generic instead of native (the named native-slop tells), building an in-app component library, or auditing an app for design-system drift (hardcoded colors, spacing, fonts). For platform styling specifics (semantic colors, HIG rules, native controls) use expo-native-ui; for folder layout of a new app use expo-project-structure.
- License
- MIT
- Instructions
- 371 lines in SKILL.md · view on GitHub
Files (4)
- SKILL.md
- openai.yaml · agents/
- audit.md · references/
- native-slop.md · references/
SKILL.md (first lines)
# Expo Design Systems
Make every screen in an app draw from one visual source of truth: a token theme and a small set of reusable components. This skill defines where tokens live, what they cover, how reusable components are shaped, and when a repeated view earns promotion into the system.
Sibling skills own the layers around this one:
- `expo-native-ui` - platform styling rules (HIG, semantic colors, controls, shadows syntax). Follow it for **what values look native**; follow this skill for **where values live and how they're reused**.
- `expo-project-structure` - folder skeleton for new apps.
For Tailwind projects, keep tokens in `global.css` as CSS variables and follow the styling library's own setup guidance. The scales and naming in this skill still apply; only the storage format changes.
## References
Consult these resources as needed:
```
references/
audit.md Audit an existing app for design-system drift: grep checks,
scoring rubric, incremental adoption plan, and templates for
documenting or extending components
native-slop.md The 20 named anti-pattern tells of AI-generated apps (The Web
Modal, Everything's a Card, ...) with grep checks for the greppable ones
```
## Adopt Before You Build
In an app that already has screens, the first move is detection, not construction. Before writing any token file:
1. **Look for a declared system.** Check `package.json` for a styling library - NativeWind/Tailwind, Tamagui, Restyle, Unistyles, styled-components. Then look for a token file: `theme.ts`, `src/theme/`, `constants/theme.ts`, or `constants/Colors.ts` (the create-expo-app default).
2. **If one exists, it is the source of truth.** Extend it in its own idiom - its names, its scale, its storage format. Audit drift against that system, not against the examples below.
3. **If only de facto values exist** - the same greys and paddings repeated across screens, no theme file - there is no system yet. Those values are the input to the scales, not the authority: derive tokens from the most frequent ones, snapped to the 4-point grid (`references/audit.md` §5).
4. **Never introduce a second system beside an existing one.** A fresh `src/theme/` next to a Tamagui config is design-system drift, not adoption.
Only when nothing exists do the defaults below apply as written.
## The Theme
In an app without an existing system, all design tokens live under `src/theme/`. In a project without a `src/` folder (the default `create-expo-app` template has `app/`, `components/`, and `constants/` at the root), use the equivalent top-level location - typically `theme/` or the existing `constants/` - and keep the same file layout. Start small and split by token class as it grows:
```
src/theme/
colors.ts # see expo-native-ui "Colors" for the palette pattern
spacing.ts
typography.ts
radius.ts
shadows.ts
motion.ts
index.ts # re-exports everything: import { spacing, type } from "@/theme"
```
A brand-new app can begin with a single `src/theme.ts` holding all of the objects below, then promote it to the folder form once any one class needs its own file (same promotion rule as components). Either way there is exactly **one** theme entry point - never two competing token files.
Rules that make a theme worth having:
- **Every repeated visual value is a token.** A literal that appears twice belongs in the theme.
- **Components import tokens; screens import components.** A screen file that imports `spacing` for layout padding is fine; a screen file redefining a button color is drift.
- **Never hardcode** hex colors, font sizes, or spacing multiples outside `src/theme/`. One-off values that are genuinely local (an icon's 17px optical nudge) may stay inline - with a comment saying why.
### Colors
Build the palette from platform semantic colors: `Color` from `expo-router` wrapped in `Platform.select`, centralized in `theme/colors.ts`. Semantic colors resolve on-device and adapt to light/dark automatically - prefer them for backgrounds, labels, and separators. (`expo-native-ui` "Colors" covers the full palette and rationale; the minimal version is:)
```tsx
// theme/colors.ts
import { Platform } from "react-native";
import { Color } from "expo-router";
export const colors = {
label: Platform.select({
ios: Color.ios.label,
android: Color.android.dynamic.onSurface,
default: "#000000",
})!,
secondaryLabel: Platform.select({
ios: Color.ios.secondaryLabel,
android: Color.android.dynamic.onSurfaceVariant,
default: "#3c3c43",
})!,
separator: Platform.select({
ios: Color.ios.separator,
android: Color.android.dynamic.outlineVariant,
default: "#c6c6c8",
})!,
systemBackground: Platform.select({
ios: Color.ios.systemBackground,
android: Color.android.dynamic.surface,
default: "#ffffff",
})!,
systemBlue: Platform.select({
ios: Color.ios.systemBlue,
android: Color.android.dynamic.primary,
default: "#007aff",
})!,
// Deliberately fixed: text on a tinted (accent) surface stays white in both modes.
onTint: "#ffffff",
};
```
Add brand colors as explicit light/dark pairs only when the brand requires values the platform doesn't provide:
```tsx
// theme/colors.ts (brand additions)
import { useColorScheme } from "react-native";
const brandPalette = {
light: { accent: "#5B21B6", accentContrast: "#FFFFFF" },
dark: { accent: "#A78BFA", accentContrast: "#1E1B4B" },
} as const;
export function useBrandColors() {
const scheme = useColorScheme();
return brandPalette[scheme === "dark" ? "dark" : "light"];
}
```
Keep the brand set tiny (accent, accentContrast, maybe a tint per feature). Everything else stays semantic.
**Static-safe vs hook-only.** The two patterns above have different reach - keep the boundary explicit:From expo/skills, MIT.
More from expo/skills
- 0.842score
eas-simulator
expo
Run and control a user's app on a remote iOS/Android simulator hosted on EAS cloud.
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
eas-observe
expo
Use for anything related to EAS Observe - adding `expo-observe` to an Expo project (AppMetricsRoot/ObserveRoot HOC, markInteractive and…
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-app-clip
expo
Add an iOS App Clip target to an Expo app.
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
eas-update-insights
expo
Check the health of published EAS Update: crash rates, install/launch counts, unique users, payload size, and the split between embedded and OTA users per…
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-web-to-native
expo
Migrate an existing web React app to a native iOS/Android app with Expo.
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-ui
expo
Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android.
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-module
expo
Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript).
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-examples
expo
Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia…
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-data-fetching
expo
Use when implementing or debugging ANY network request, API call, or data fetching.
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-brownfield
expo
Integrate Expo and React Native into an existing native iOS or Android app.
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
eas-workflows
expo
Helps understand and write EAS workflow YAML files for Expo projects.
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
eas-app-stores
expo
Build and submit iOS and Android apps with EAS to TestFlight, the App Store, or Google Play.
SkillAFreshness: A★ 3KClaude Code +9
Compare and alternatives
Featured in
Signals
- Stars
- 3,006
- Forks
- 197
- Open issues
- 22
- Last commit (this folder)
- Oct 22, 2026 (5 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/expo/skills
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from expo
- 0.842score
expo-module
expo
Guide for creating and writing Expo native modules and views using the Expo Modules API (Swift, Kotlin, TypeScript).
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-examples
expo
Expo's official example projects - the expo/examples repo of ~70 `with-*` integrations (Stripe, Clerk, Supabase, OpenAI, maps, Reanimated, SQLite, Skia…
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-app-clip
expo
Add an iOS App Clip target to an Expo app.
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-ui
expo
Build native UI with the @expo/ui package: real SwiftUI on iOS and Jetpack Compose on Android.
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-web-to-native
expo
Migrate an existing web React app to a native iOS/Android app with Expo.
SkillAFreshness: A★ 3KClaude Code +9 - 0.842score
expo-data-fetching
expo
Use when implementing or debugging ANY network request, API call, or data fetching.
SkillAFreshness: A★ 3KClaude Code +9
Cite this page
expo-design-system skill. Agent Mart. https://agentmart.dev/skills/expo-expo-design-system (last updated 2026-10-24)