{"id":51049506,"url":"https://github.com/ardasnturk/react-native-accessibility-automation","last_synced_at":"2026-06-22T16:01:50.851Z","repository":{"id":365619274,"uuid":"1272442280","full_name":"ardasnturk/react-native-accessibility-automation","owner":"ardasnturk","description":"Self-hosted accessibility automation and reporting dashboard for Expo and React Native apps.","archived":false,"fork":false,"pushed_at":"2026-06-18T05:06:36.000Z","size":537,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-18T07:12:04.576Z","etag":null,"topics":["a11y","accessibility","android","appium","automation","expo","ios","nextjs","react-native","testing","webdriverio"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ardasnturk.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-17T16:01:36.000Z","updated_at":"2026-06-18T05:06:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ardasnturk/react-native-accessibility-automation","commit_stats":null,"previous_names":["ardasnturk/react-native-accessibility-automation"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/ardasnturk/react-native-accessibility-automation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ardasnturk%2Freact-native-accessibility-automation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ardasnturk%2Freact-native-accessibility-automation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ardasnturk%2Freact-native-accessibility-automation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ardasnturk%2Freact-native-accessibility-automation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ardasnturk","download_url":"https://codeload.github.com/ardasnturk/react-native-accessibility-automation/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ardasnturk%2Freact-native-accessibility-automation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34655719,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a11y","accessibility","android","appium","automation","expo","ios","nextjs","react-native","testing","webdriverio"],"created_at":"2026-06-22T16:01:49.960Z","updated_at":"2026-06-22T16:01:50.844Z","avatar_url":"https://github.com/ardasnturk.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# React Native Accessibility Automation\n\nReact Native Accessibility Automation is a self-hosted accessibility crawler for Expo and React Native apps. It uses Appium to launch an app on an iOS Simulator or Android Emulator, explores reachable screens, audits visible interactive elements, captures screenshots, and presents results in a local responsive web dashboard.\n\nThe project is designed for teams that want repeatable local accessibility checks without sending app builds, screenshots, or crawler reports to a hosted service. It is currently focused on Expo Dev Client and iOS Simulator workflows, with Android support available through Appium UiAutomator2 configuration.\n\n## Release Status\n\nCurrent release: `0.1.0`\n\nThis first public release includes the TypeScript crawler, the self-hosted Next.js dashboard, simulator onboarding, report history, screenshots, XML artifacts, grouped crawler events, and English/Turkish UI support.\n\n## Standards Alignment\n\nThis project produces reports aligned with [W3C/WAI Mobile Accessibility](https://www.w3.org/WAI/standards-guidelines/mobile/) guidance.\n\nW3C states that there are no separate W3C mobile accessibility guidelines; mobile accessibility is covered by existing W3C accessibility standards and guidance, including WCAG. The crawler therefore maps automated findings to relevant WCAG/WAI references where possible, including:\n\n- WCAG 2.2 Success Criterion 4.1.2: Name, Role, Value\n- WCAG 2.2 Success Criterion 2.5.8: Target Size (Minimum)\n- WCAG 2.2 Success Criterion 2.4.6: Headings and Labels\n- WCAG 2.2 Success Criterion 2.5.3: Label in Name\n- W3C/WAI mobile accessibility guidance for applying WCAG to mobile, native, and hybrid applications\n\nThe generated JSON and Markdown reports include standards metadata and per-finding standard references. This is an automated alignment report, not a complete WCAG conformance claim. Manual testing is still required for full accessibility evaluation.\n\n## License\n\nThis project is released under the [MIT License](LICENSE).\n\n## Community\n\n- Read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request.\n- Use GitHub Issues for reproducible bugs and feature requests.\n- Do not include sensitive app screenshots, XML output, or user data in public issues.\n\n## Features\n\n- Next.js App Router web app with a landing page and local dashboard.\n- Modern SaaS-style command center with sidebar navigation, report history, live crawl logs, evidence preview, and responsive report review panes.\n- Web-based onboarding for simulator device, installed iOS runtime, and Expo Dev Client bundle id.\n- Start, stop, and monitor crawls from the web UI.\n- Light and dark mode support.\n- English and Turkish dashboard UI.\n- Automatic Appium startup, simulator boot, and app launch through configurable bootstrap hooks.\n- TypeScript crawler powered by Appium and WebdriverIO.\n- Bounded crawling with max screen, depth, duration, app-ready, and per-screen action limits.\n- Duplicate screen/action filtering to reduce repeated navigation loops.\n- Native alert and blocking-overlay recovery attempts.\n- Runtime event reporting for crawler errors, skipped actions, native alerts, and recovery attempts.\n- Timestamped report runs under `reports/run-*`.\n- Previous report list with date, summary, open, and delete actions.\n- Screenshot, XML, JSON, and Markdown output for each run.\n- Responsive dashboard for desktop, tablet, and mobile layouts.\n\n## Requirements\n\n- macOS with Xcode and iOS Simulator for iOS crawling.\n- Node.js 20+.\n- Yarn 1.x.\n- An installed Expo Dev Client or EAS simulator build for the target app.\n\nInstall dependencies and Appium drivers:\n\n```bash\nyarn install\nyarn appium driver install xcuitest\nyarn appium driver install uiautomator2\n```\n\n## Quick Start\n\nStart the self-hosted dashboard:\n\n```bash\nyarn start\n```\n\nOpen:\n\n```text\nhttp://127.0.0.1:4174\n```\n\nThe landing page is available at `/`. Open `/dashboard` to configure and run crawls. On first dashboard launch, the app asks for:\n\n- simulator device\n- installed iOS runtime\n- Expo Dev Client bundle id\n- optional Expo server startup settings\n\nClick **Continue** to save the local config. Then click **Start Crawl**. The server starts the crawl command, Appium starts when needed, the simulator boots, the app launches, and logs stream into the dashboard.\n\nUse **Stop** to terminate a long crawl. The server first sends `SIGINT`, then escalates to `SIGTERM` and `SIGKILL` if the process tree does not stop.\n\n## Dashboard Workflow\n\nThe dashboard opens to a report history page, not directly to the last report. Use the toolbar to switch language, change theme, refresh local state, or reopen settings.\n\n- **Command Center** shows run state, setup actions, and primary crawl controls.\n- **Start Crawl** starts a new timestamped run.\n- **Previous Reports** lists saved runs by date.\n- **Open** opens a selected report.\n- **Delete** removes a saved report run.\n- **Settings** reopens simulator/device/bundle id configuration.\n- **Start Expo server before crawling** starts the configured Expo command before Appium opens the app.\n- **Refresh** reloads status, reports, and logs.\n\nEach report view includes:\n\n- summary cards for screens, errors, warnings, and completion status\n- visited screens\n- screenshots\n- XML source links\n- accessibility findings\n- runtime events\n- crawl job logs\n- summary metrics\n\n## Report Output\n\nWeb-started crawls write each run to a timestamped directory:\n\n```text\nreports/run-2026-06-17T15-58-25-163Z/report.json\nreports/run-2026-06-17T15-58-25-163Z/report.md\nreports/run-2026-06-17T15-58-25-163Z/screen-001.png\nreports/run-2026-06-17T15-58-25-163Z/screen-001.xml\n```\n\nManual crawls use the configured output directory unless `REPORT_OUTPUT_DIR` is provided.\n\n```bash\nREPORT_OUTPUT_DIR=reports/my-run yarn a11y:crawl\n```\n\n## Configuration\n\nThe web UI writes local settings to:\n\n```text\na11y-crawler.config.json\n```\n\nThis file is intentionally ignored by git. If it does not exist, the server falls back to `a11y-crawler.config.example.json` and then to built-in defaults.\n\nFor iOS with an installed Expo Dev Client, the important capabilities are:\n\n```json\n{\n  \"platformName\": \"iOS\",\n  \"appium:automationName\": \"XCUITest\",\n  \"appium:deviceName\": \"iPhone 17 Pro\",\n  \"appium:platformVersion\": \"26.5\",\n  \"appium:bundleId\": \"com.yourcompany.yourexpoapp\",\n  \"appium:noReset\": true,\n  \"appium:autoAcceptAlerts\": true,\n  \"appium:newCommandTimeout\": 300,\n  \"appium:waitForIdleTimeout\": 2,\n  \"appium:reduceMotion\": true\n}\n```\n\nFor an EAS simulator build artifact, you can use an `.app` path instead of `bundleId`:\n\n```json\n{\n  \"appium:app\": \"/absolute/path/to/YourExpoApp.app\",\n  \"appium:noReset\": true\n}\n```\n\nAndroid support is available through UiAutomator2, but the current web onboarding focuses on iOS simulator selection:\n\n```json\n{\n  \"platformName\": \"Android\",\n  \"appium:automationName\": \"UiAutomator2\",\n  \"appium:deviceName\": \"Pixel_8\",\n  \"appium:appPackage\": \"com.yourcompany.yourexpoapp\",\n  \"appium:appActivity\": \".MainActivity\",\n  \"appium:noReset\": true,\n  \"appium:autoGrantPermissions\": true,\n  \"appium:newCommandTimeout\": 300\n}\n```\n\n## Bootstrap Hooks\n\nThe `bootstrap` section controls local dependency startup:\n\n```json\n{\n  \"bootstrap\": {\n    \"startAppium\": true,\n    \"appiumCommand\": \"yarn appium:server\",\n    \"startSimulator\": true,\n    \"simulatorName\": \"iPhone 17 Pro\",\n    \"startExpo\": false,\n    \"expoCommand\": \"yarn expo start --dev-client\",\n    \"expoCwd\": \"../your-expo-app\",\n    \"startupTimeoutMs\": 90000\n  }\n}\n```\n\nExpo startup remains project-specific. For the most reliable automation, install an Expo Dev Client or EAS simulator build first and use `bundleId`.\n\nTo let the web UI start Expo automatically, enable **Start Expo server before crawling** in Settings and set:\n\n- `Expo Project Path`: path to the Expo app directory, for example `../my-expo-app`\n- `Expo Command`: command to run inside that directory, for example `yarn expo start --dev-client`\n\n## Crawl Controls\n\nUseful controls in `a11y-crawler.config.json`:\n\n- `maxDepth`: maximum navigation depth.\n- `maxScreens`: maximum unique screens to save.\n- `maxDurationMs`: hard crawl duration limit.\n- `appReadyTimeoutMs`: how long to wait for splash/update/loading screens to finish.\n- `maxActionsPerScreen`: maximum tap attempts per screen.\n- `maxTapTargetsPerScreen`: maximum detected targets stored per screen.\n- `tapTimeoutMs`: per-element tap wait timeout.\n- `settleMs`: delay after navigation/tap actions.\n- `denyLabels`: case-insensitive label fragments that must not be tapped.\n- `denyPatterns`: regular expressions for elements that must not be tapped.\n- `seedActions`: optional startup actions, such as dismissing onboarding.\n\n## React Native Accessibility Pattern\n\nUse `testID` for automation and accessibility props for assistive technology.\n\n```tsx\n\u003cPressable\n  testID=\"settingsButton\"\n  accessible\n  accessibilityRole=\"button\"\n  accessibilityLabel=\"Settings\"\n\u003e\n  \u003cText\u003eSettings\u003c/Text\u003e\n\u003c/Pressable\u003e\n```\n\n`testID` helps the crawler find the element. It does not provide a meaningful screen reader name by itself.\n\n## Project Scripts\n\nUse the web dashboard for normal operation. The CLI scripts are still available for local debugging and automation.\n\n| Script | Purpose |\n| ------ | ------- |\n| `yarn start` | Build and start the self-hosted Next.js dashboard on `127.0.0.1:4174`. |\n| `yarn dev` | Start the Next.js development server. |\n| `yarn a11y:crawl` | Run the crawler directly with `a11y-crawler.config.json`. |\n| `yarn appium:server` | Start Appium with relaxed security for local automation. |\n| `yarn build` | Build the Next.js app. |\n\n## Manual CLI Usage\n\nStart Appium manually:\n\n```bash\nyarn appium:server\n```\n\nRun the crawler directly:\n\n```bash\nyarn a11y:crawl\n```\n\n## Development\n\nRun the Next.js development server:\n\n```bash\nyarn dev\n```\n\nOpen:\n\n```text\nhttp://127.0.0.1:4174\n```\n\nBefore committing changes:\n\n```bash\nyarn tsc --noEmit\nyarn build\n```\n\nThe project intentionally keeps the crawler, Next.js API routes, and dashboard in one package while the API is still small. Split packages only when public extension points become stable.\n\n## Limitations\n\nThis is a black-box crawler. It can explore screens reachable through visible UI elements, but it cannot guarantee full app coverage without app-specific guidance. Authentication, destructive actions, payment flows, feature flags, deep links, remote data state, and custom gestures should be modeled with seed actions, deny lists, or future app-specific plugins.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fardasnturk%2Freact-native-accessibility-automation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fardasnturk%2Freact-native-accessibility-automation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fardasnturk%2Freact-native-accessibility-automation/lists"}