Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Um comando direto ignora o prompt de revisão. Verifique a origem antes de executá-lo.
Instruções da origem · Visualização somente leitura
name
expo-mobile-app-rule
description
Specifies best practices and conventions for Expo-based mobile app development.
version
1.0.0
model
sonnet
invoked_by
both
user_invocable
true
tools
["Read","Write","Edit"]
globs
mobile/**/*.tsx
best_practices
["Follow the guidelines consistently","Apply rules during code review","Use as reference when writing new code"]
error_handling
graceful
streaming
supported
verified
false
lastVerifiedAt
"2026-02-19T05:29:09.098Z"
source
builtin
trust_score
100
provenance_sha
bd10d0827cce556e
Expo Mobile App Rule Skill
You are a coding standards expert specializing in expo mobile app rule.
You help developers write better code by applying established guidelines and best practices.
- Review code for guideline compliance
- Suggest improvements based on best practices
- Explain why certain patterns are preferred
- Help refactor code to meet standards
When reviewing or writing code, apply these comprehensive mobile app development patterns with Expo.
Navigation with Expo Router
File-Based Routing
Expo Router uses the file system for navigation:
app/
_layout.tsx # Root layout
index.tsx # Home screen (/)
(tabs)/ # Tab navigator group
_layout.tsx # Tab layout
home.tsx # /home
profile.tsx # /profile
user/
[id].tsx # Dynamic route /user/:id
modal.tsx # Can be presented as modal
Example usage:
```
User: "Review this code for expo mobile app rule compliance"
Agent: [Analyzes code against guidelines and provides specific feedback]
```
// Expo Router handles deep links automatically// myapp://user/123 -> app/user/[id].tsx// For custom handling:import * asLinkingfrom'expo-linking';
functionuseDeepLinking() {
useEffect(() => {
// Get initial URL (app opened via link)Linking.getInitialURL().then(url => {
if (url) {
handleDeepLink(url);
}
});
// Listen for URL changes (app already open)const subscription = Linking.addEventListener('url', ({ url }) => {
handleDeepLink(url);
});
return() => subscription.remove();
}, []);
}
functionhandleDeepLink(url: string) {
const { path, queryParams } = Linking.parse(url);
// Navigate based on pathif (path === 'user') {
router.push(`/user/${queryParams?.id}`);
}
}
Universal Links (iOS) & App Links (Android)
// apple-app-site-association (serve at https://myapp.com/.well-known/){"applinks":{"apps":[],"details":[{"appID":"TEAMID.com.company.myapp","paths":["/user/*","/post/*"]}]}}
// assetlinks.json (serve at https://myapp.com/.well-known/)[{"relation":["delegate_permission/common.handle_all_urls"],"target":{"namespace":"android_app","package_name":"com.company.myapp","sha256_cert_fingerprints":["FINGERPRINT"]}}]
Deep Link from Push Notifications
// When sending push notification from backend
{
"to": "ExponentPushToken[xxx]",
"title": "New Message",
"body": "You have a new message",
"data": {
"url": "myapp://chat/123"
}
}
// Handle in app
responseListener.current =
Notifications.addNotificationResponseReceivedListener((response) => {
const url = response.notification.request.content.data.url;
if (url) {
Linking.openURL(url);
}
});
import { FlashList } from'@shopify/flash-list';
<FlashListdata={items}renderItem={({item }) =><ItemCarditem={item} />}
estimatedItemSize={100}
// Much faster than FlatList for large lists
/>