Expo iOS HIG Verifier A read-only static checker that scans an Expo (React Native) project for violations of the rules and reports them grouped by severity, with locations and links to the rule that explains the fix. It is the automated counterpart to the reference skill: that skill teaches the rules; this one checks them. When to Apply Run this skill when: - The user asks to check, lint, audit, or review an Expo app for HIG compliance or native feel - Before merging or shipping Expo iOS UI changes, as a quality gate - After scaffolding new screens, to confirm they stay native - Investigating…

\\t'\"$2\"

Expo iOS HIG Verifier A read-only static checker that scans an Expo (React Native) project for violations of the rules and reports them grouped by severity, with locations and links to the rule that explains the fix. It is the automated counterpart to the reference skill: that skill teaches the rules; this one checks them. When to Apply Run this skill when: - The user asks to check, lint, audit, or review an Expo app for HIG compliance or native feel - Before merging or shipping Expo iOS UI changes, as a quality gate - After scaffolding new screens, to confirm they stay native - Investigating…

\\t'\"$3\"

Expo iOS HIG Verifier A read-only static checker that scans an Expo (React Native) project for violations of the rules and reports them grouped by severity, with locations and links to the rule that explains the fix. It is the automated counterpart to the reference skill: that skill teaches the rules; this one checks them. When to Apply Run this skill when: - The user asks to check, lint, audit, or review an Expo app for HIG compliance or native feel - Before merging or shipping Expo iOS UI changes, as a quality gate - After scaffolding new screens, to confirm they stay native - Investigating…

\\t'\"$4\")\n if [[ \"$1\" == \"ERROR\" ]]; then ERRORS=$((ERRORS + 1)); else ADVISORIES=$((ADVISORIES + 1)); fi\n}\n\ncheck() {\n # $1 severity $2 rule $3 message $4 pattern\n local severity=\"$1\" rule=\"$2\" message=\"$3\" pattern=\"$4\" matches line\n matches=\"$(do_search \"$pattern\")\"\n [[ -z \"$matches\" ]] && return 0\n while IFS= read -r line; do\n [[ -z \"$line\" ]] && continue\n record \"$severity\" \"$rule\" \"$message\" \"$line\"\n done \u003c\u003c\u003c \"$matches\"\n}\n\ncheck_scrollview_map() {\n # Advisory: a file that uses \u003cScrollView> and .map( probably renders an unvirtualized list.\n local files file loc\n files=\"$(do_search '\u003cScrollView' | cut -d: -f1 | sort -u)\"\n [[ -z \"$files\" ]] && return 0\n while IFS= read -r file; do\n [[ -z \"$file\" ]] && continue\n if grep -Eq '\\.map\\(' \"$file\" 2>/dev/null; then\n loc=\"$(grep -En '\u003cScrollView' \"$file\" | head -1 | cut -d: -f1)\"\n record \"ADVISORY\" \"motion-virtualized-lists\" \\\n \"ScrollView combined with .map() — use FlashList for long lists\" \"$file:$loc\"\n fi\n done \u003c\u003c\u003c \"$files\"\n}\n\n# --- Checks (ERROR = high precision, ADVISORY = heuristic) ---\nrun_checks() {\n check ERROR native-avoid-material-ui \"Material Design component kit imported on iOS\" \\\n \"from ['\\\"](react-native-paper|@react-native-material/|@rneui/|react-native-elements)\"\n check ERROR nav-native-stack \"JavaScript stack navigator instead of the native stack\" \\\n \"(@react-navigation/stack|createStackNavigator)\"\n check ERROR touch-gesture-handler-thread \"PanResponder runs gestures on the JS thread\" \\\n \"PanResponder\"\n check ERROR touch-pressable-feedback \"TouchableWithoutFeedback gives no press feedback\" \\\n \"TouchableWithoutFeedback\"\n check ERROR acc-dynamic-type \"allowFontScaling disabled — breaks Dynamic Type\" \\\n \"allowFontScaling(\\s*=\\s*\\{\\s*false\\s*\\}|\\s*:\\s*false)\"\n check ERROR motion-ui-thread-animation \"useNativeDriver:false keeps the animation on the JS thread\" \\\n \"useNativeDriver\\s*:\\s*false\"\n\n check ADVISORY nav-native-tabs \"createBottomTabNavigator is a JS tab bar — prefer native tabs\" \\\n \"createBottomTabNavigator\"\n check ADVISORY visual-semantic-colors \"Hardcoded hex color — prefer PlatformColor semantic colors\" \\\n \"(color|backgroundColor|borderColor|tintColor)\\s*:\\s*['\\\"]#[0-9a-fA-F]{3,8}\"\n check ADVISORY visual-system-font \"Custom fontFamily on interface text — prefer the system font\" \\\n \"fontFamily\\s*:\"\n check ADVISORY system-status-bar \"Hardcoded StatusBar style — prefer style=\\\"auto\\\"\" \\\n \"StatusBar[^\\n]*style=['\\\"](dark|light)['\\\"]\"\n check_scrollview_map\n}\n\n# --- Output ---\nprint_text() {\n echo \"HIG verification report for: $TARGET\"\n echo \"============================================================\"\n if [[ ${#FINDINGS[@]} -eq 0 ]]; then\n echo \"No HIG violations found.\"\n echo \"============================================================\"\n echo \"Summary: 0 errors, 0 advisories\"\n return 0\n fi\n local sev label printed entry s rule msg loc\n for sev in ERROR ADVISORY; do\n printed=0\n if [[ \"$sev\" == \"ERROR\" ]]; then label=\"ERRORS\"; else label=\"ADVISORIES\"; fi\n for entry in \"${FINDINGS[@]}\"; do\n IFS=

Expo iOS HIG Verifier A read-only static checker that scans an Expo (React Native) project for violations of the rules and reports them grouped by severity, with locations and links to the rule that explains the fix. It is the automated counterpart to the reference skill: that skill teaches the rules; this one checks them. When to Apply Run this skill when: - The user asks to check, lint, audit, or review an Expo app for HIG compliance or native feel - Before merging or shipping Expo iOS UI changes, as a quality gate - After scaffolding new screens, to confirm they stay native - Investigating…

\\t' read -r s rule msg loc \u003c\u003c\u003c \"$entry\"\n [[ \"$s\" == \"$sev\" ]] || continue\n if [[ $printed -eq 0 ]]; then echo \"\"; echo \"$label:\"; printed=1; fi\n echo \" [$rule] $msg\"\n echo \" $loc\"\n echo \" -> $RULES_LINK/$rule.md\"\n done\n done\n echo \"\"\n echo \"============================================================\"\n echo \"Summary: $ERRORS errors, $ADVISORIES advisories\"\n}\n\njson_escape() { printf '%s' \"$1\" | sed 's/\\\\/\\\\\\\\/g; s/\"/\\\\\"/g'; }\n\nprint_json() {\n local first=1 entry s rule msg loc\n printf '['\n if [[ ${#FINDINGS[@]} -gt 0 ]]; then\n for entry in \"${FINDINGS[@]}\"; do\n IFS=

Expo iOS HIG Verifier A read-only static checker that scans an Expo (React Native) project for violations of the rules and reports them grouped by severity, with locations and links to the rule that explains the fix. It is the automated counterpart to the reference skill: that skill teaches the rules; this one checks them. When to Apply Run this skill when: - The user asks to check, lint, audit, or review an Expo app for HIG compliance or native feel - Before merging or shipping Expo iOS UI changes, as a quality gate - After scaffolding new screens, to confirm they stay native - Investigating…

\\t' read -r s rule msg loc \u003c\u003c\u003c \"$entry\"\n if [[ $first -eq 1 ]]; then first=0; else printf ','; fi\n printf '{\"severity\":\"%s\",\"rule\":\"%s\",\"message\":\"%s\",\"location\":\"%s\"}' \\\n \"$s\" \"$rule\" \"$(json_escape \"$msg\")\" \"$(json_escape \"$loc\")\"\n done\n fi\n printf ']\\n'\n}\n\nrun_checks\nif [[ $JSON -eq 1 ]]; then print_json; else print_text; fi\n\n# --- Exit status ---\nif [[ $ERRORS -gt 0 ]]; then exit 1; fi\nif [[ $STRICT -eq 1 && $ADVISORIES -gt 0 ]]; then exit 1; fi\nexit 0\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":7165,"content_sha256":"e2d473590656ad13e1413a2ec3ce59c5db6153e2578538ae356884d71dd69b2f"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Expo iOS HIG Verifier","type":"text"}]},{"type":"paragraph","content":[{"text":"A read-only static checker that scans an Expo (React Native) project for violations of the ","type":"text"},{"text":"expo-ios-hig","type":"text","marks":[{"type":"code_inline"}]},{"text":" rules and reports them grouped by severity, with ","type":"text"},{"text":"file:line","type":"text","marks":[{"type":"code_inline"}]},{"text":" locations and links to the rule that explains the fix. It is the automated counterpart to the ","type":"text"},{"text":"expo-ios-hig","type":"text","marks":[{"type":"code_inline"}]},{"text":" reference skill: that skill teaches the rules; this one checks them.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Apply","type":"text"}]},{"type":"paragraph","content":[{"text":"Run this skill when:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"The user asks to ","type":"text"},{"text":"check, lint, audit, or review","type":"text","marks":[{"type":"strong"}]},{"text":" an Expo app for HIG compliance or native feel","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Before merging or shipping Expo iOS UI changes, as a quality gate","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"After scaffolding new screens, to confirm they stay native","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Investigating why an Expo app \"feels like a web wrapper\" or \"feels like Android\"","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"It is ","type":"text"},{"text":"read-only","type":"text","marks":[{"type":"strong"}]},{"text":" — it never modifies the target project, so it is safe to run unsupervised.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow Overview","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"verify-hig.sh [project-dir]\n 1. Resolve search roots (app/ src/ components/ by default, or config.json)\n 2. Run static checks — one per detectable expo-ios-hig rule (rg, or grep fallback)\n 3. Aggregate findings: severity, rule, message, file:line\n 4. Print grouped report (ERRORS then ADVISORIES) with a link to each rule\n 5. Exit 0 if clean, 1 if any ERROR (with --strict, advisories fail too)","type":"text"}]},{"type":"paragraph","content":[{"text":"Run it:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash scripts/verify-hig.sh /path/to/expo-app # text report\nbash scripts/verify-hig.sh /path/to/expo-app --strict # advisories also fail\nbash scripts/verify-hig.sh /path/to/expo-app --json # machine-readable","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Checks","type":"text"}]},{"type":"paragraph","content":[{"text":"ERRORS","type":"text","marks":[{"type":"strong"}]},{"text":" are high-precision (import and literal-flag matches, low false positives). ","type":"text"},{"text":"ADVISORIES","type":"text","marks":[{"type":"strong"}]},{"text":" are heuristics that warrant a look but don't fail the run unless ","type":"text"},{"text":"--strict","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Severity","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Rule","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Detects","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ERROR","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"native-avoid-material-ui","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"react-native-paper","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"@react-native-material/*","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"@rneui/*","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"react-native-elements","type":"text","marks":[{"type":"code_inline"}]},{"text":" imports","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ERROR","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"nav-native-stack","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"@react-navigation/stack","type":"text","marks":[{"type":"code_inline"}]},{"text":" / ","type":"text"},{"text":"createStackNavigator","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ERROR","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"touch-gesture-handler-thread","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PanResponder","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ERROR","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"touch-pressable-feedback","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"TouchableWithoutFeedback","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ERROR","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"acc-dynamic-type","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"allowFontScaling={false}","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ERROR","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"motion-ui-thread-animation","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"useNativeDriver: false","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ADVISORY","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"nav-native-tabs","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"createBottomTabNavigator","type":"text","marks":[{"type":"code_inline"}]},{"text":" (JS tab bar)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ADVISORY","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"visual-semantic-colors","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"hardcoded hex in ","type":"text"},{"text":"color:","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"backgroundColor:","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"borderColor:","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"tintColor:","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ADVISORY","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"visual-system-font","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"custom ","type":"text"},{"text":"fontFamily:","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ADVISORY","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"system-status-bar","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"hardcoded ","type":"text"},{"text":"StatusBar style=\"dark\"/\"light\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ADVISORY","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"motion-virtualized-lists","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"a file using both ","type":"text"},{"text":"\u003cScrollView>","type":"text","marks":[{"type":"code_inline"}]},{"text":" and ","type":"text"},{"text":".map(","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"Each finding links to ","type":"text"},{"text":"expo-ios-hig/references/{rule}.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" (path configurable in ","type":"text"},{"text":"config.json","type":"text","marks":[{"type":"code_inline"}]},{"text":") for the explanation and fix.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Setup","type":"text"}]},{"type":"paragraph","content":[{"text":"config.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" is optional — sensible defaults apply. Override on first use if your project differs:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"search_roots","type":"text","marks":[{"type":"code_inline"}]},{"text":" — space-separated source dirs to scan (default ","type":"text"},{"text":"app src components","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"skill_rules_dir","type":"text","marks":[{"type":"code_inline"}]},{"text":" — path used in report links to the ","type":"text"},{"text":"expo-ios-hig","type":"text","marks":[{"type":"code_inline"}]},{"text":" rule files (default ","type":"text"},{"text":"../expo-ios-hig/references","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"If ","type":"text"},{"text":"jq","type":"text","marks":[{"type":"code_inline"}]},{"text":" is installed, the script reads these from ","type":"text"},{"text":"config.json","type":"text","marks":[{"type":"code_inline"}]},{"text":"; otherwise it uses the defaults. ","type":"text"},{"text":"rg","type":"text","marks":[{"type":"code_inline"}]},{"text":" (ripgrep) is used when available, with a ","type":"text"},{"text":"grep","type":"text","marks":[{"type":"code_inline"}]},{"text":" fallback — no hard dependency.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"How to Use","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run ","type":"text"},{"text":"scripts/verify-hig.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" against the Expo project root.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read the grouped report; open the linked rule file for any finding to see the fix.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Treat ERRORS as must-fix before shipping; review ADVISORIES (they include intentional exceptions).","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"To extend: add a ","type":"text"},{"text":"check ERROR|ADVISORY \u003crule> \"\u003cmessage>\" \"\u003cregex>\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" line in ","type":"text"},{"text":"run_checks()","type":"text","marks":[{"type":"code_inline"}]},{"text":" — see ","type":"text"},{"text":"references/workflow.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/workflow.md","title":null}}]},{"text":".","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Related Skills","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"expo-ios-hig","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" — the rules this verifier checks; every finding links back to it.","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"expo-ios-screen-scaffolder","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" — generates screens that pass these checks by construction.","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"expo-ios-hig-verify","author":"@skillopedia","source":{"stars":153,"repo_name":"dot-skills","origin_url":"https://github.com/pproenca/dot-skills/blob/HEAD/skills/.experimental/expo-ios-hig-verify/SKILL.md","repo_owner":"pproenca","body_sha256":"b5907c0e3f8d72710ecd875ec43907f6a10aeefed05723808976d0a979892e1c","cluster_key":"fa94b1389bfd27232d0baca82712698636cc38694af782591fa4fb1466f156e6","clean_bundle":{"format":"clean-skill-bundle-v1","source":"pproenca/dot-skills/skills/.experimental/expo-ios-hig-verify/SKILL.md","attachments":[{"id":"4574696d-c919-51b5-bf5c-88b4fa326d54","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4574696d-c919-51b5-bf5c-88b4fa326d54/attachment.json","path":"config.json","size":521,"sha256":"bb76b138f31cb8023f2da6026393e31136a9cf63daa0cbd46f9576a1dcb96a31","contentType":"application/json; charset=utf-8"},{"id":"84dbf669-9ea8-5bcc-90b9-065c5cfb1dfd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/84dbf669-9ea8-5bcc-90b9-065c5cfb1dfd/attachment.md","path":"gotchas.md","size":200,"sha256":"9f766628234fe8f4febc7ec3610af1d946e057fdc097e5782d044b0d628d75b2","contentType":"text/markdown; charset=utf-8"},{"id":"2ba62ad5-def8-5ae8-a8e0-56f0ee2f6915","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2ba62ad5-def8-5ae8-a8e0-56f0ee2f6915/attachment.json","path":"metadata.json","size":951,"sha256":"97774808750dae774903792bc352a4dc866768342f3d90a270ce0370db327ea4","contentType":"application/json; charset=utf-8"},{"id":"877153e5-30b0-5c7f-885b-e71aaef77406","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/877153e5-30b0-5c7f-885b-e71aaef77406/attachment.md","path":"references/workflow.md","size":3277,"sha256":"4b26a4a32cad2025b47b9f0b50ee5a23047dba98c486b3f0014d0516026a17df","contentType":"text/markdown; charset=utf-8"},{"id":"8ad15c90-4f4f-558c-b262-e26b5d0ec20d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8ad15c90-4f4f-558c-b262-e26b5d0ec20d/attachment.sh","path":"scripts/verify-hig.sh","size":7165,"sha256":"e2d473590656ad13e1413a2ec3ce59c5db6153e2578538ae356884d71dd69b2f","contentType":"application/x-sh; charset=utf-8"}],"bundle_sha256":"7a0ba22d48e922cd2768fc5eda795ff54b3e9ada0bd6eb8e9b709f7340acaf50","attachment_count":5,"text_attachments":5,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/.experimental/expo-ios-hig-verify/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"security","category_label":"Security"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"security","import_tag":"clean-skills-v1","description":"Static scan of an Expo / React Native iOS app for non-native patterns — Material component kits, JS navigators instead of native stack/tabs, PanResponder, disabled font scaling, hardcoded hex colors, unvirtualized lists — reports each violation with file:line and a link to the rule. Trigger when the user asks to check, lint, audit, or review an Expo iOS app for HIG compliance or \"native feel,\" or before shipping/merging Expo iOS UI. Pairs with the expo-ios-hig rules skill (it checks what that skill teaches) and the expo-ios-screen-scaffolder."}},"renderedAt":1782981944968}

Expo iOS HIG Verifier A read-only static checker that scans an Expo (React Native) project for violations of the rules and reports them grouped by severity, with locations and links to the rule that explains the fix. It is the automated counterpart to the reference skill: that skill teaches the rules; this one checks them. When to Apply Run this skill when: - The user asks to check, lint, audit, or review an Expo app for HIG compliance or native feel - Before merging or shipping Expo iOS UI changes, as a quality gate - After scaffolding new screens, to confirm they stay native - Investigating…