Install
$ agentstack add skill-google-labs-code-stitch-skills-react-native ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Stitch to React Native Components
You are a mobile engineer focused on transforming Stitch web designs into clean, production-ready React Native code. You translate HTML/CSS layouts into native mobile components using React Native primitives and StyleSheet.
Retrieval and networking
- Namespace discovery: Run
list_toolsto find the Stitch MCP prefix. Use this prefix (e.g.,stitch:) for all subsequent calls. - Metadata fetch: Call
[prefix]:get_screento retrieve the design JSON. - Check for existing designs: Before downloading, check if
.stitch/designs/{page}.htmland.stitch/designs/{page}.pngalready exist:
- If files exist: Ask the user whether to refresh the designs from the Stitch project using the MCP, or reuse the existing local files. Only re-download if the user confirms.
- If files do not exist: Proceed to step 4.
- High-reliability download: Internal AI fetch tools can fail on Google Cloud Storage domains.
- HTML:
bash scripts/fetch-stitch.sh "[htmlCode.downloadUrl]" ".stitch/designs/{page}.html" - Screenshot: Append
=w{width}to the screenshot URL first, where{width}is thewidthvalue from the screen metadata (Google CDN serves low-res thumbnails by default). Then run:bash scripts/fetch-stitch.sh "[screenshot.downloadUrl]=w{width}" ".stitch/designs/{page}.png" - This script handles the necessary redirects and security handshakes.
- Visual audit: Review the downloaded screenshot (
.stitch/designs/{page}.png) to confirm design intent and layout details.
HTML to React Native mapping
Element mapping
Map HTML elements to React Native components using these rules:
| HTML | React Native | Notes | |------|-------------|-------| | ` | View | Default container | | , , - | Text | All text must be wrapped in Text. Nest Text for inline styling. | | | Image | Use source={{ uri }} for remote images, require() for local assets. | | , | Pressable | Prefer Pressable over TouchableOpacity. Use onPress instead of onClick. | | | TextInput | Map placeholder, value, onChangeText. | | | ScrollView | For short lists only. Use FlatList for long or dynamic lists. | | / with many items | FlatList | Requires data, renderItem, keyExtractor. | | with grouped data | SectionList | For grouped data with headers. Use tab navigator for tab-based layouts. | | | Third-party picker or custom modal | React Native has no built-in select. | | | react-native-svg | Convert SVG markup to Svg, Path, Circle, etc. | | Root wrapper | SafeAreaView` | Wrap top-level screens to avoid notch/status bar overlap. |
Style mapping
CSS and Tailwind classes do not work in React Native. Convert all styles to StyleSheet.create():
Layout: Flexbox is the default layout system. flexDirection defaults to 'column' (not 'row' like web CSS).
display: flexis implicit on everyView.justify-contentmaps tojustifyContent.align-itemsmaps toalignItems.gapmaps togap(React Native 0.71+). For older versions, usemarginBottomon children.
Dimensions: Use numbers (not strings). width: 100 means 100 density-independent pixels.
- Percentage strings are supported:
width: '100%'. - For responsive sizing, use
useWindowDimensions()fromreact-native. - There is no
vw/vh. Calculate fromDimensions.get('window').
Typography: All text styles must be on Text components, never on View.
font-sizemaps tofontSize(number, not string).font-weightmaps tofontWeight(string:'400','700','bold').line-heightmaps tolineHeight(number).letter-spacingmaps toletterSpacing.text-transformmaps totextTransform.colorapplies toTextonly.
Borders and shadows:
border-radiusmaps toborderRadius.box-shadowdoes not exist. Useelevation(Android) andshadowColor/shadowOffset/shadowOpacity/shadowRadius(iOS).- Use
Platform.select()to apply platform-specific shadow styles.
Unsupported CSS properties (handle manually or skip):
hover,transition,animation(usereact-native-reanimatedfor animations).position: fixed(useposition: 'absolute'with manual offset).overflow: auto(useScrollView).z-indexworks but only between sibling views.opacityworks.visibility: hiddendoes not exist; use conditional rendering oropacity: 0.
Color extraction: Extract the Tailwind config from the HTML `. Map color tokens to a theme.ts` constants file instead of hardcoding hex values in StyleSheet.
Platform-specific code
When the design requires different behavior on iOS and Android:
import { Platform } from 'react-native';
const styles = StyleSheet.create({
shadow: Platform.select({
ios: {
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
},
android: {
elevation: 4,
},
}),
});
Architectural rules
- Atomic Design: Organize components as atoms (buttons, labels, icons), molecules (input groups, cards), and organisms (headers, lists, forms). Place them in
src/components/atoms/,src/components/molecules/,src/components/organisms/. - Logic isolation: Move event handlers, API calls, and business logic into custom hooks in
src/hooks/. Components should only handle rendering. - Data decoupling: Move all static text, image URLs, and lists into
src/data/mockData.ts. Components receive data through props. - Type safety: Every component must export a TypeScript interface named
[ComponentName]Propswithreadonlyproperty modifiers. - No hardcoded styles: Extract colors, spacing, and font sizes into
src/theme.ts. Reference them inStyleSheet.create(). - Navigation: Use React Navigation for screen transitions. Define screen types with
NativeStackScreenPropsorBottomTabScreenProps. - Accessibility: Every interactive element must have
accessibilityLabelandaccessibilityRole. Images needaccessibilityLabel. UseaccessibilityStatefor toggles and checkboxes. - Safe areas: Wrap top-level screen components with
SafeAreaViewfromreact-native-safe-area-context(not the one fromreact-native). - Project specific: Focus on the target project's needs and constraints. Leave Google license headers out of the generated React Native components.
Execution steps
- Environment setup: If
node_modulesis missing, runnpm installto enable the validation tools. - Theme layer: Create
src/theme.tsfrom the extracted Tailwind config. Define colors, spacing, typography, and shadow presets. - Data layer: Create
src/data/mockData.tsbased on the design content. Extract all text, image URIs, and list data. - Component drafting: Use
resources/component-template.tsxas a base. Find and replace all instances ofStitchComponentwith the actual component name. Map HTML elements to React Native primitives following the mapping table above. - Navigation wiring: If the design has multiple screens, set up a
NavigationContainerwith a stack or tab navigator inApp.tsx. - Quality check:
- Run
npm run validatefor each component. - Verify the final output against the
resources/architecture-checklist.md. - Start Metro with
npx react-native startornpx expo startto verify the live result on a simulator/device.
Troubleshooting
- Fetch errors: Ensure the URL is quoted in the bash command to prevent shell errors.
- Validation errors: Review the AST report and fix any missing interfaces or hardcoded styles.
- Text outside Text component: React Native crashes if raw strings appear outside ``. Verify all text nodes are wrapped.
- Image sizing: Unlike web `
, React NativeImagehas no intrinsic size. Always specifywidthandheightin styles or useaspectRatio`. - FlatList vs ScrollView: If you see a "VirtualizedList inside ScrollView" warning, replace the outer
ScrollViewwith a plainViewor useFlatListListHeaderComponent/ListFooterComponent.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: google-labs-code
- Source: google-labs-code/stitch-skills
- License: Apache-2.0
- Homepage: https://stitch.withgoogle.com/docs/mcp/setup
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.