{"id":31581375,"url":"https://github.com/dekuworks/241ra-mobile","last_synced_at":"2026-05-07T15:41:51.540Z","repository":{"id":315631781,"uuid":"1057329804","full_name":"DekuWorks/241RA-mobile","owner":"DekuWorks","description":"Official mobile app for 241RunnersAwareness.org","archived":false,"fork":false,"pushed_at":"2025-09-19T19:43:26.000Z","size":400,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-19T19:53:06.144Z","etag":null,"topics":["241runners","expo","mobile-app","react-native","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DekuWorks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-15T15:25:00.000Z","updated_at":"2025-09-19T19:43:29.000Z","dependencies_parsed_at":"2025-09-19T20:10:09.044Z","dependency_job_id":null,"html_url":"https://github.com/DekuWorks/241RA-mobile","commit_stats":null,"previous_names":["dekuworks/241ra-mobile"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/DekuWorks/241RA-mobile","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DekuWorks%2F241RA-mobile","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DekuWorks%2F241RA-mobile/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DekuWorks%2F241RA-mobile/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DekuWorks%2F241RA-mobile/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DekuWorks","download_url":"https://codeload.github.com/DekuWorks/241RA-mobile/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DekuWorks%2F241RA-mobile/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278526240,"owners_count":26001326,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"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":["241runners","expo","mobile-app","react-native","typescript"],"created_at":"2025-10-05T21:56:45.484Z","updated_at":"2026-05-07T15:41:51.520Z","avatar_url":"https://github.com/DekuWorks.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 241Runners Mobile (Android + iOS)\n\n**Official mobile app for [241RunnersAwareness.org](https://241runnersawareness.org).**  \nWeb repo: https://github.com/DekuWorks/241RunnersAwareness  \nAPI (shared with web): https://241runners-api-v2.azurewebsites.net/swagger/index.html\n\n## Overview\n\n- **Framework:** Expo (React Native + TypeScript)\n- **Platforms:** iOS (App Store), Android (Google Play)\n- **Backend:** Azure App Service (.NET 8 Web API) — same DB \u0026 users as the static site\n- **Auth:** Email/Password, Google OAuth, 2FA (TOTP + backup codes)\n- **Dual Role System:** Supports users with multiple roles (e.g., Runner + Admin)\n\n## Environment Configuration\n\n### Local Development\n\nCreate `.env` from example:\n\n```bash\ncp .env.example .env\n```\n\n**Required Variables:**\n\n- `EXPO_PUBLIC_API_URL=https://241runners-api-v2.azurewebsites.net`\n\n### EAS Build (Preview/Production)\n\nEnvironment variables are configured per profile in EAS:\n\n- **Preview:** `EXPO_PUBLIC_API_URL` set in EAS secrets\n- **Production:** `EXPO_PUBLIC_API_URL` set in EAS secrets\n\n**Important:** Never commit `.env` files. Only `EXPO_PUBLIC_*` variables are exposed to the client. Use EAS secrets for sensitive values.\n\n## Scripts\n\n```bash\n# Development\nnpm i\nnpm run start\nnpm run ios\nnpm run android\n\n# Code Quality\nnpm run lint          # ESLint check\nnpm run lint:fix      # ESLint fix\nnpm run format        # Prettier format\nnpm run format:check  # Prettier check\nnpm run typecheck     # TypeScript check\n\n# Testing\nnpm run test          # Run tests\nnpm run test:watch    # Watch mode\n\n# Building\nnpm run build:preview # EAS preview build\nnpm run build:prod    # EAS production build\nnpm run clean         # Clear Expo cache\n```\n\n## Bundle IDs\n\n- **iOS:** `org.runners241.app`\n- **Android:** `org.runners241.app`\n\n## Permissions\n\n- **Camera:** capture evidence for sightings\n- **Location (When In Use):** attach coordinates to reports; enable nearby alerts\n\n## Security\n\n- **Token Storage:** SecureStore (iOS Keychain, Android Keystore)\n- **API Client:** Centralized with 401 interceptor and token refresh\n- **Error Handling:** Production errors redacted, sensitive data filtered\n- **TLS:** All API communication encrypted\n- **Observability:** Sentry integration for production error tracking\n\n## Cross-Platform Integration\n\nThe mobile app is fully integrated with the main repository backend and supports the dual role system:\n\n- **[🔗 Cross-Platform Integration Summary](docs/CROSS_PLATFORM_INTEGRATION_SUMMARY.md)** - Complete dual role system implementation\n- **[🔧 Integration with Main Repo](docs/INTEGRATION_WITH_MAIN_REPO.md)** - Backend integration details\n- **Test Credentials**: `lthomas3350@gmail.com` / `Lisa2025!` (works for both user and admin flows)\n\n### Dual Role System Features\n- **Multiple Roles**: Users can have both regular and admin roles\n- **Seamless Access**: Same credentials work across web and mobile platforms\n- **Clean UX**: Role information displayed appropriately for each context\n- **Admin Portal**: Dual-role users can access admin functionality\n\n## Documentation\n\nAll project documentation has been organized in the [`docs/`](./docs/) folder:\n\n- **📱 App Store \u0026 Distribution** - Store submission guides and checklists\n- **🔧 Backend \u0026 API** - API documentation and integration guides  \n- **🚀 Deployment \u0026 Infrastructure** - Build, deployment, and CI/CD guides\n- **📊 Implementation \u0026 Development** - Development status and progress\n- **🔐 Privacy \u0026 Compliance** - Privacy policy and compliance documentation\n- **🏗️ Platform \u0026 Architecture** - Authentication and platform-specific guides\n\nSee [docs/README.md](./docs/README.md) for a complete index of all documentation.\n\n## Notes\n\n- Same users, roles, and database as the static site\n- Feature parity delivered in phases; see project board for roadmap\n\n---\n\n## 6) Expo/EAS Accounts \u0026 App IDs\n\n- [ ] Apple Developer ($99/yr) + connect in EAS\n- [ ] Google Play Developer ($25 one-off) + connect in EAS\n- [ ] iOS bundle ID: `org.runners241.app`\n- [ ] Android package: `org.runners241.app`\n\n---\n\n## 7) Keys \u0026 Permissions\n\n- [ ] **Maps:** set Google Maps keys (Android \u0026 iOS if using Google provider)\n- [ ] **Notifications:** configure Expo push (device token → your API)\n- [ ] **OAuth:** add mobile redirect URIs to your provider:\n  - iOS: `org.runners241.app:/oauthredirect`\n  - Android: `org.runners241.app:/oauthredirect`\n\n---\n\n## 8) Minimal E2E Smoke Test (must pass)\n\n- [ ] Existing web user logs into mobile (email/2FA)\n- [ ] Cases list loads (from v2 API)\n- [ ] Case detail opens\n- [ ] Report a sighting (camera + location) submits successfully\n- [ ] Push test delivers and deep-links to a case\n\n---\n\n## 9) First Builds\n\n```bash\n# Internal preview builds\nnpm run build:preview\n\n# Production builds\nnpm run build:prod\nnpm run submit:ios\nnpm run submit:android\n```\n\n## 10) Store Metadata (later)\n\n- Icons (1024 px), splash, 6–8 screenshots (Home, Cases, Map, Report, Admin)\n- Privacy Policy \u0026 Terms → static site URLs\n- Data Safety (Play) \u0026 Privacy Labels (Apple): camera + location (when in use)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdekuworks%2F241ra-mobile","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdekuworks%2F241ra-mobile","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdekuworks%2F241ra-mobile/lists"}