{"id":33227630,"url":"https://github.com/luke-h1/foam","last_synced_at":"2026-02-22T17:24:45.070Z","repository":{"id":216804742,"uuid":"704597371","full_name":"luke-h1/foam","owner":"luke-h1","description":"WIP custom Twitch client for IOS \u0026 Android","archived":false,"fork":false,"pushed_at":"2025-11-13T09:45:45.000Z","size":480031,"stargazers_count":8,"open_issues_count":104,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-13T11:25:52.591Z","etag":null,"topics":["7tv","android","expo","expo-modules","hacktoberfest-accepted","ios","react-native","react-navigation","twitch"],"latest_commit_sha":null,"homepage":"https://foam-app.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/luke-h1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.MD","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":"2023-10-13T15:49:32.000Z","updated_at":"2025-10-25T16:38:51.000Z","dependencies_parsed_at":"2025-05-04T16:22:35.562Z","dependency_job_id":"ddf495a6-3cc4-4001-916e-94c4f9aa276a","html_url":"https://github.com/luke-h1/foam","commit_stats":null,"previous_names":["luke-h1/foam"],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/luke-h1/foam","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luke-h1%2Ffoam","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luke-h1%2Ffoam/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luke-h1%2Ffoam/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luke-h1%2Ffoam/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luke-h1","download_url":"https://codeload.github.com/luke-h1/foam/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luke-h1%2Ffoam/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284734138,"owners_count":27054622,"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-11-16T02:00:05.974Z","response_time":65,"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":["7tv","android","expo","expo-modules","hacktoberfest-accepted","ios","react-native","react-navigation","twitch"],"created_at":"2025-11-16T16:01:16.518Z","updated_at":"2026-02-16T21:10:54.498Z","avatar_url":"https://github.com/luke-h1.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Foam mobile app\n\nA new way to experience Twitch.tv on mobile\n\n## Why?\n\nTo improve my React native skills and learn various other tech\n\nThe native Twitch app experience doesn't quite line up with the desktop experience and it lacks support for third-party extensions that many people use to express themselves in chat. This project aims to be a mobile alternative that supports these extensions and provides a cleaner and more intutive UI.\n\n# Table of contents\n\n- [Foam mobile app](#foam-mobile-app)\n- [Why](#why)\n- [Table of contents](#table-of-contents)\n- [Project structure](#project-structure)\n- [Store Links](#store-links)\n- [Features](#features)\n- [Installation](#installation)\n  - [Recommended dev environment](#recommended-dev-environment)\n  - [Tips](#tips)\n  - [Running `development` version of the app locally](#running-development-version-of-the-app-locally)\n  - [Storybook](#storybook)\n  - [Running `preview` or `production` version of the app locally](#running-preview-or-production-version-of-the-app-locally)\n- [Contributing](#contributing)\n  - [Commit strategy - conventional commits](#commit-strategy-conventional-commits)\n  - [Git flow \\\u0026 Pull Requests](#git-flow--pull-requests)\n  - [Imports aliasing](#imports-aliasing)\n  - [dev-builds](#dev-builds)\n- [CI \\\u0026 CD](#ci-cd)\n  - [Developer experience](#developer-experience)\n  - [Continuous Delivery](#continuous-delivery)\n  - [E2E testing](#e2e-testing)\n    - [Running E2E tests locally](#running-e2e-tests-locally)\n  - [Local EAS build](#local-eas-build)\n- [Continuous Delivery pipeline](#continuous-delivery-pipeline)\n- [Release process](#release-process)\n  - [Trigger a new production build](#trigger-a-new-production-build)\n  - [Versioning strategy](#versioning-strategy)\n- [Testers management](#testers-management)\n  - [Android testers](#android-testers)\n  - [iOS testers](#ios-testers)\n- [Debugging](#debugging-1)\n- [Managing access to the project and associated services](#managing-access-to-the-project-and-associated-services)\n- [API dependencies](#api-dependencies)\n- [Markdown writing guide](#markdown-writing-guide)\n- [Bug Reports](#bug-reports)\n\n# Project structure\n\nThis is a [React Native app](https://reactnative.dev). This repository is responsible for powering the mobile app and its two variants:\n\n1. `production` - the `production` version of the app that is distributed via the stores (App store via TestFlight and Google Play(Via Google Beta Testers)). Eventually this variant will also submit to the actual stores for external users\n2. `development` - Used for local development and for installing development builds on your local phone when developing\n\nEach variant is configured with different `bundleId` for `iOS` and `packageName` for `Android` in order to be able to have all versions of the app installed on the same device at the same time.\n\nCore dependencies:\n\n| Library                                          | Category                       | Version | Description                                             |\n| ------------------------------------------------ | ------------------------------ | ------- | ------------------------------------------------------- |\n| [bun](https://bun.sh/)                           | Package manager \u0026 node runtime | 1.2.5   | Fastest package manager and node runtime                |\n| [React Native](https://reactnative.dev/)         | Mobile framework               | 0.81.4  | Cross-platform mobile framework                         |\n| [React](https://react.dev/)                      | UI framework                   | 19.1.0  | Most popular UI framework worldwide                     |\n| [TypeScript](https://www.typescriptlang.org/)    | Language                       | 5.9.2   | Static typechecking                                     |\n| [Expo](https://expo.dev/)                        | SDK                            | 54.0.25 | React native framework / Expo modules                   |\n| [React Navigation](https://reactnavigation.org/) | Navigation                     | 7.1.26  | Routing and navigation library                          |\n| [Maestro](https://maestro.mobile.dev/)           | E2E testing                    | 1.40.1  | Declarative UI testing                                  |\n| [EAS](https://expo.dev/eas)                      | CI/CD                          | N/A     | Build the app binaries and submit the app to the stores |\n| [Storybook](https://storybook.js.org/)           | UI preview                     | 8.4.4   | UI development \u0026 preview tool for React Native          |\n\nAdditional inspiration on how this project is structured is coming from: [Obytess React Native Starter](https://starter.obytes.com/), [Aetherspace Green Stack Starter](https://github.com/Aetherspace/green-stack-starter-demo#readme), [online docs as Storybook website](https://main--62c9a236ee16e6611d719e94.chromatic.com/?path=/story/aetherspace-quickstart--page), [Infinite Red cookbook for React Native](https://ignitecookbook.com/).\n\n## Store links\n\nTBA\n\n## Features\n\nTBA\n\n# Getting started\n\nYou will need the following in order to run the project locally:\n\n- [Node.js](https://nodejs.org/en/)\n- [NVM](https://github.com/nvm-sh/nvm)\n- [Xcode](https://developer.apple.com/xcode/)\n- [Android Studio](https://developer.android.com/studio)\n- [bun](https://bun.sh/)\n\nSee [Expo React Native project](https://docs.expo.dev/get-started/set-up-your-environment/), on how to prepare your environment first. (For more-in-depth understanding of React Native projects navigate to [React Native docs](https://reactnative.dev/) and [Expo docs](https://docs.expo.dev/)).\n\n1. Clone this repository\n\n- `git clone https://github.com/luke-h1/foam`\n\n2. Install `bun`\n\n- ```bash\n    version=$(cat .bun-version)\n    curl -fsSL \"https://bun.sh/install\" | bash -s \"bun-v$version\"\n  ```\n\n3. Ensure you're on the correct Node version\n\n- ```bash\n  nvm use\n  nvm install\n  ```\n\n4. Install dependencies\n\n- `cd foam`\n- `bun install`\n\n5. Acquire Twitch API credentials\n\n- Create a Twitch account if you do not have one already\n- Enable 2FA on your account otherwise you'll not be able to create apps via the developer console\n- Go to the [Twitch developer console](https://dev.twitch.tv/console/apps/create) and create a new application. Your OAUTH redirect settings need to look like the following (in order for it to work with the authentication proxy):\n\n\u003cimg src='.github/docs/twitch-settings.png' alt='Twitch app settings' /\u003e\n\n- Copy the client ID and client secret and paste them into a `.env` file in the root of the project. See `.env.example` for an example of what this file should look like\n\n- If you're on Linux or windows, you'll need to setup Android studio and install a device to run the app.\n\n- If you're on Mac you can just use the iOS simulator (via Xcode) to run the app\n\n6. Start the proxy server\n   The proxy server is responsible for proxying authentication requests to Twitch. This is due to a new requirement where Twitch do not let you proxy non `http` URLs. Locally this is just a simple Express server for developer convenience. In TestFlight, TestTrack and production, an AWS lambda backed by API gateway is responsible for performing this proxying.\n\n- `bun run start:proxy`\n\n7. Install development build on your simulator\n\n- `bun run prebuild`\n\n7. Run the app\n\n- `bun run ios`\n- `bun run android`\n\n## Recommended dev environment\n\n1. Mac - due to being able to run xcode and android simultaneously\n\n_IOS_:\n\n- Any IOS commands requires Xcode to be installed.\n  - A simulator must be preconfigured in Xcode settings.\n    - if no iOS versions are available, install the iOS runtime at `Xcode \u003e Settings \u003e Platforms`.\n    - if the simulator download keeps failing you can download it from the developer website.\n      - [Apple Developer](https://developer.apple.com/download/all/?q=Simulator%20Runtime)\n      - `sudo xcode-select -s /Applications/Xcode.app`\n      - `xcodebuild -runFirstLaunch`\n      - `xcrun simctl runtime add \"~/Downloads/iOS_17.4_Simulator_Runtime.dmg\"` (adapt the path to the downloaded file)\n  - In addition, ensure Xcode Command Line Tools are installed using `xcode-select --install`.\n- Expo will require you to configure Xcode Signing. We use automatic signing which let's expo deal with the signing so we don't have to do it manually.\n- Make sure you do have automatic signing setup properly. Open the project in xcode (`cd ios \u0026\u0026 xed .`) \u003e select the project \u003e Signing \u0026 Capabilities \u003e check `Automatically manage signing` and select a team + unique bundle identifier\n\n_Android_:\n\n- Install \"Android Studio\"\n  - Make sure you have the Android SDK installed (Android Studio \u003e Tools \u003e Android SDK).\n    - In \"SDK Platforms\": \"Android x\" (where x is Android's current version).\n    - In \"SDK Tools\": \"Android SDK Build-Tools\" and \"Android Emulator\" are required.\n    - Add `export ANDROID_HOME=/Users/\u003cyour_username\u003e/Library/Android/sdk` to your `.zshrc` or `.bashrc` (and restart your terminal).\n  - Setup an emulator (Android Studio \u003e Tools \u003e Device Manager).\n\n## Tips\n\n- To run on your phone (ensure connected via a cable) add `-- --device` to your command (i.e. `bun run ios -- --device`).\n- If the Android simulator frequently hangs or is very slow, [bump its memory limit](https://stackoverflow.com/a/40068396)\n\n## Running `development` version of the app locally\n\nIn order to run the `development` variant of the app locally you will need to run:\n\n1. `bun run prebuild` - prebuilds the native part of the app (generates `ios` \u0026 `android` folders)\n2. `bun run ios` - Builds the native part of the app \u0026 runs it on iOS\n3. `bun run android` - Builds the native part of the app and runs it on Android\n4. `bun run start` - once the native part of the project is installed on the emulator/simulator/your physical device you can run the JS metro server\n   - this will start the JS server that bundles and serves a hot-reloaded version of the JS app\n   - JS server will start automatically when running `bun run ios` or `bun run android`\n\n## Storybook\n\nStorybook is currently configured to preview UI components on app. Eventually the plan is to deploy this storybook somewhere on web\n\n\u003e [!WARNING]\n\u003e If you add a new `.stories.tsx` file, you need to run `bun run storybook:generate` to re-generate the list of all available stories.\n\n## Running `production` variant of the app locally\n\nTo run the `production` variant of the app locally, you'll need to follow these steps. This is useful for testing the production build configuration, verifying store-ready builds, or debugging production-specific issues.\n\n\u003e [!WARNING]\n\u003e The production variant uses different bundle identifiers and package names, so it can be installed alongside the development version on the same device.\n\n### Prerequisites\n\n1. **Environment Setup**: Ensure you have all the development environment requirements from the [Installation](#installation) section\n2. **Production Credentials**: You'll need production-specific credentials and configuration files:\n   - Production Google Services files (`GoogleService-Info-production.plist` for iOS, `google-services-prod.json` for Android)\n   - Production environment variables in your `.env` file\n   - Valid Apple Developer account and signing certificates for iOS\n\n### Steps\n\n1. **Set up production environment variables**\n\n   Ensure your `.env` file contains the correct values\n\n2. **Start the proxy server** (if needed for local testing and not using the auth proxy lambda)\n\n   ```bash\n   bun run start:proxy\n   ```\n\n3. **Run the production app**\n\n   **For iOS:**\n\n   ```bash\n   bun run ios:production\n   ```\n\n   **For Android:**\n\n   ```bash\n   bun run android:production\n   ```\n\n   These commands will:\n   - Build the native app with production configuration\n   - Install it on your simulator/device\n   - Start the Metro bundler for the JavaScript code\n\n### Alternative: Using EAS Build for Local Testing\n\nIf you want to test the exact production build that would be submitted to the stores, you can use EAS Build:\n\n1. **Build locally with EAS**\n\n   ```bash\n   # For iOS\n   eas build --profile production --platform ios --local\n\n   # For Android\n   eas build --profile production --platform android --local\n   ```\n\n2. **Install the built app**\n\n   The built `.ipa` (iOS) or `.apk` (Android) files will be in the `builds/` directory and can be installed on your device.\n\n### Troubleshooting\n\n- **Bundle identifier conflicts**: If you get signing errors, ensure your Apple Developer account has the production bundle identifier (`foam-tv`) registered\n- **Missing credentials**: Verify all production Google Services files are present and valid\n- **Environment variables**: Double-check that all required production environment variables are set correctly\n- **Build failures**: Check the EAS build logs for detailed error information\n\n### Key Differences from Development\n\n- Uses production bundle identifier (`foam-tv` for iOS, `com.lhowsam.foam` for Android)\n- App name shows as \"Foam\" (without dev suffix)\n- No development badge on the app icon\n- Uses production API endpoints and credentials\n- Optimized for performance and store submission\n\n# contributing\n\n## Commit strategy - conventional commits\n\nThis project follows the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) specification. [Husky](https://github.com/typicode/husky) is used to execute scrips according to git hooks in order to test if a developer is following the various linting rules and conventional commits. Run `bun commit` to start an interactive commit. Please familiarize yourself with the [specification](https://www.conventionalcommits.org/en/v1.0.0/#specification).\n\nExample:\n\n```\nfeat(chat): improve readability of username\nchore(deps): update `react-native` to `0.80.0`\nfix(streams): fix crash on `LiveStreamScreen`\n```\n\n## Git flow \u0026 pull requests\n\n1. For every change, create a new branch from `main`\n2. Use conventional commits for your commits and other good practices to help ease the review process\n3. Open a PR against `main` \u0026 title it using the pattern mentioned in [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/).\n   - Provide a proper description of the changes\n   - Include some screenshots/videos of the change if applicable\n   - Ensure to test your changes on a physical device as sometimes the simulator works but on a real device it breaks\n\n4. Assign a reviewer to the PR\n5. After the PR is approved \u0026 the checks pass, merge it to `main`\n6. `eas-cd-production.yml` is responsible for deploying the app to TestFlight/TestTrack. We currently don't have submit CI set up yet.\n\n## Import aliases\n\nWe use [tsconfig-paths](https://github.com/dividab/tsconfig-paths) to alias imports.\n\n## dev-builds\n\nSometimes you may want to run the app on your device to check your changes, see how it looks on a real device etc. In order to do this you need to run some steps to configure your device for the first time.\n\n1. Connect your phone via cable to your laptop/machine (you must ensure both devices are on the same network, otherwise this will not work.). Make sure to trust the phone/laptop when prompted.\n\n2. Open the project in Xcode: `cd ios \u0026\u0026 xed .` Make sure to login to xcode if you haven't already\n\n3. Your phone will then pair + connect to xcode. Let that complete\n\n4. When prompted select the project and click the 'hide code' button in the top-right\n\n5. Navigate to signing \u0026 capabilities\n\n6. Select your team, ensure the bundle identifier is `foam-dev` (or something else to avoid naming conflicts) and select your device from the dropdown `Foam \u003e YourPhoneName`\n\n7. Run a build by clicking the play button\n\n8. The app will then install on your device and run. Hot reloading will also work\n\nIf you get an error such as `no development servers found` then this means the laptop and/or phone is on a different network.\n\n# CI/CD\n\n## CI\n\nTODO\n\n## CD\n\nWe use [EAS](https://docs.expo.dev/build-reference/eas/) to build and publish the app\n\nThere is currently 3 variants of the app that can be installed on the same device\n\n1. `production` - the app that is distributed via the stores (App Store (via TestFlight) and Google Play (via Google Beta Testers))\n   - there is a manual trigger configured for `production` build - use GitHub actions to trigger it.\n2. `preview` - the app that is used to easily preview the changes from the PRs and is distributed via [`Internal distribution`](https://docs.expo.dev/build/internal-distribution) mechanism (QR codes)\n   - on iOS it requires the [device to be registered beforehand](https://docs.expo.dev/build/internal-distribution/#automation-on-ci-optional)\n3. `development` - the development version of the app (including development client) that is not distributed in any way and has to be built locally\n\nAll variants can be installed on the same device at the same time, because they have different `bundleIdentifier`s for `iOS` and different `packageName`s for `Android`. You can get more information about multiple app variants in [Expo docs](https://docs.expo.dev/tutorial/eas/multiple-app-variants/).\n\n## E2E testing\n\nWe use [Maestro](https://maestro.mobile.dev/) for E2E testing. Tests run against a mock server for deterministic results.\n\n### Quick start (dev client - recommended for local dev)\n\nUses a development build with Metro for hot reload during test development:\n\n```bash\n# Install Maestro (one-time)\ncurl -Ls \"https://get.maestro.mobile.dev\" | bash\n\n# Build the E2E dev client (one-time, or when native code changes)\nbun run e2e:dev:ios\n\n# Run tests (three terminals)\nbun run e2e:mock-server:dev                           # Terminal 1: Mock server\nAPP_VARIANT=e2e npx expo start --dev-client --localhost  # Terminal 2: Metro\nbun run maestro:test                                  # Terminal 3: Tests\n```\n\n### Standalone build (for CI)\n\nCreates a self-contained app with bundled JS - no Metro needed:\n\n```bash\n# Build standalone E2E app\nbun run e2e:build:ios\n\n# Run tests (two terminals)\nbun run e2e:mock-server:dev  # Terminal 1\nbun run maestro:test         # Terminal 2\n```\n\n### Commands\n\n| Command                       | Description                          |\n| ----------------------------- | ------------------------------------ |\n| `bun run e2e:dev:ios`         | Build dev client (local development) |\n| `bun run e2e:build:ios`       | Build standalone app (CI)            |\n| `bun run e2e:build:android`   | Build standalone app (Android)       |\n| `bun run maestro:test`        | Run all tests                        |\n| `bun run maestro:test:smoke`  | Run smoke tests only                 |\n| `bun run maestro:studio`      | Interactive test editor              |\n| `bun run e2e:mock-server:dev` | Start mock server (auto-reload)      |\n\n### OTA updates for E2E\n\nThe standalone E2E app supports OTA updates via the `e2e` channel, eliminating the need to rebuild for JS-only changes:\n\n```bash\n# Push JS update to E2E builds (no native rebuild needed)\neas update --channel e2e --message \"Fix E2E test\"\n```\n\nOnly rebuild (`bun run e2e:build:ios`) when native code changes. Use fingerprinting to detect this automatically in CI.\n\n### Build caching (EAS)\n\nLocal builds use EAS build caching to speed up `npx expo run:ios/android`. Builds are cached by fingerprint and reused when native code hasn't changed.\n\n**How it works:**\n\n- On `npx expo run:ios`, Expo checks EAS for a cached build matching the project fingerprint\n- If found, downloads and uses it (skips compilation)\n- If not found, compiles normally and uploads to EAS for future runs\n\nNo setup required - just ensure you're logged in with `eas login`.\n\n## Local EAS build\n\nTODO\n\n# Continuous delivery pipeline\n\nTODO\n\n# Release process\n\nThe `public` version of the app is distributed via the stores and is not available publicly yet:\n\nWe use [EAS Build](https://expo.dev/eas#build) to build app binaries and [EAS Submit](https://expo.dev/eas#submit) to submit them to the stores.\nProduction deployment is configured to be triggered manually.\nManual trigger is available from GitHub, Expo Dashboard or directly from the console using the following commands:\n\n- `bun run build:production:android` - builds the app for Android and auto-submits it to the Google Play Store\n- `bun run build:production:ios` - builds the app for iOS and auto-submits it to the App Store\n\nYou can inspect the builds history on the [EAS Builds dashboard](https://expo.dev/accounts/lukehowsam123/projects/foam/builds).\nYou can inspect the submissions history on the [EAS Submissions dashboard](https://expo.dev/accounts/lukehowsam123/projects/foam/submissions).\n\nYou can view the build queue on the [EAS build queue dashboard](https://expo.dev/eas-build-status)\n\n# Testers management\n\nAt the moment we do the internal testing for the `production` app variant.\nEvery time a new version is published to the stores testers all testers are able to test it out.\n\n## Android internal testers\n\n`Android Internal testing track`\n\nIn order to join the internal testing of the Android app distributed via Google Play Store you need to:\n\n1. Be able to access [Google Play Console](https://play.google.com/console/u/0/developers/9181778102935271854/app-list) using your email.\n1. Go to the [Google Play Console Internal Testing panel](https://play.google.com/console/u/0/developers/9181778102935271854/app/4972924111544509272/tracks/internal-testing).\n   - open details of `Foam internal testers` group\n   - provide email address of the tester that is associated with a Google account used in Play Store\n   - hit `Save changes` button\n1. Instruct the invited tester to open [Internal testing joining link](https://play.google.com/apps/internaltest/).\n1. Anytime a new app version is published to the internal testing track the tester will have to ensure the app is updated by visiting Play Store and re-installing the app\n1. The app is available at [Play Store](https://play.google.com/store/apps/details?id=), but the link is available only to the testers that are added to the internal testing track.\n\n## iOS internal testers\n\n`iOS TestFlight internal testing track`\n\nIn order to join the TestFlight internal testing of the iOS app distributed via App Store you need to:\n\n1. Be able to access [App Store Connect](https://appstoreconnect.apple.com/teams/767f19a6-9131-4dd6-bc88-1a1e0e1b72a4/apps/6742071860/testflight/ios)\n2. Invite the person to the team via [`Users and Access`](https://appstoreconnect.apple.com/access/users).\n   - provide `First Name`, `Last Name`, `Email`\n   - select `Customer Support` role\n   - hit `Next` button\n   - ensure only the `Foam` app is selected\n   - hit `Invite`\n3. Before we move on the person has to accept a team invitation that is sent via an email.\n4. Go to the [App Store Connect TestFlight panel](https://appstoreconnect.apple.com/teams/767f19a6-9131-4dd6-bc88-1a1e0e1b72a4/apps/6742071860/testflight/groups/c9bb8b4c-9f06-4036-905c-eba2157f39ed).\n   - hit `+` button and select the person from the list\n   - hit `Add` button\n5. Instruct the tester to open an email that is sent when the tester is added to the TestFlight group and follow the instructions to redeem the TestFlight invitation code.\n6. Anytime a new app version is published to the TestFlight the tester will have to ensure the app is updated by visiting TestFlight.\n\n# Debugging\n\n1. React Native comes with [`React Native DevTools`](https://reactnative.dev/docs/0.75/debugging) integrated by default.\n   Using them you can:\n   - inspect the React component tree\n   - debug the application using breakpoints\n   - access the runtime state of the application\n   - Highlight re-renders \u0026 more\n2. Use Xcode instruments for debugging IOS performance issues - https://reactnative.dev/docs/next/debugging-native-code\n3. Use Android studio performance profiler to debug Android performance issues `open project \u003e view \u003e tool windows \u003e profiler`\n\n# Managing access to the project and associated services\n\n- [Google Play Console](https://play.google.com/console/u/0/developers/9181778102935271854/users-and-permissions)\n  - access Play Console app dashboard\n  - manage releases to the Beta Testers\n  - manage data visible on the Play Store associated with the app\n\n- [App Store Connect](https://appstoreconnect.apple.com/apps/6742071860/distribution)\n  - access App Store Connect app dashboard\n  - manage releases to the TestFlight\n  - manage data visible on the App Store associated with the app\n\n- [EAS](https://expo.dev/accounts/lukehowsam123/projects/foam)\n  - access EAS dashboard\n  - manage builds and submissions\n  - manage app versioning\n  - manage Android and iOS specific credentials needed for building and submitting the app to the stores\n  - currently this account needs to be transferred to an org to enable sharing.\n\n2. Adhere to the [`Table of Contents`](#table-of-contents) structure\n\n# API dependencies\n\n1. The app currently depends on the following APIs and services to deliver its content\n\n| Title              | Description                                                               | Base URL                                        |\n| ------------------ | ------------------------------------------------------------------------- | ----------------------------------------------- |\n| Auth proxy         | Auth Lambda - handles proxying twitch authentication requests             | redacted for security                           |\n| Twitch ID          | Twitch Authentication API                                                 | https://id.twitch.tv                            |\n| Twitch Helix       | Twitch rest API                                                           | https://api.twitch.tv/helix                     |\n| Twitch eventsub    | Event sub WebSocket - used for reacting to twitch events in chat          | wss://eventsub.wss.twitch.tv/ws                 |\n| Twitch badges      | Provides Twitch badges                                                    | https://badges.twitch.tv/v1/badges              |\n| V3 7TV             | Used for 7tv emotes and emotes in chat                                    | https://7tv.io/v3                               |\n| 7TV events         | 7TV event WS - used for reacting to 7TV emote/badge/paint changes in chat | wss://events.7tv.io/v3                          |\n| V4 7TV             | V4 GQL endpoint - will be used for user paints                            | https://7tv.io/v3                               |\n| BTTV               | Used for BTTV badges and emotes in chat                                   | https://api.betterttv.net                       |\n| BTTV WS            | Used to subscribe and react to BTTV badge/emote changes                   | wss://sockets.betterttv.net/ws                  |\n| BTTV V3 cached     | Returns cached BTTV emotes and badges                                     | https://api.betterttv.net/3/cached              |\n| BTTV V3 cached FFZ | Returns cached FFZ emotes and badges                                      | https://api.betterttv.net/3/cached/frankerfacez |\n| V1 FFZ             | V1 FFZ - used for FFZ emotes \u0026 badges                                     | https://api.frankerfacez.com/v1                 |\n\n\u003e [!NOTE]\n\u003e To check the status of these services, visit their respective status pages:\n\u003e\n\u003e - Twitch services: https://status.twitch.com/\n\u003e - 7TV services: https://status.7tv.app/\n\u003e - Auth proxy: https://status.lhowsam.com\n\u003e - BTTV and FFZ do not have status pages\n\n# Markdown writing guide\n\n1. Take advantage of using GitHub flavored markdown\n\n   \u003e [!NOTE]\n   \u003e This is a note\n\n   \u003e [!WARNING]\n   \u003e This is a warning\n\n   \u003e [!IMPORTANT]\n   \u003e This is important\n\n   \u003e [!TIP]\n   \u003e This is a tip\n\n   \u003e [!CAUTION]\n   \u003e This is a caution\n\n# Bug reports\n\nIf you encounter a problem with this project, please open an issue. Be sure to include:\n\n- Node version\n- OS\n- Brief but thorough reproduction steps of the issue (including screenshots/videos)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluke-h1%2Ffoam","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluke-h1%2Ffoam","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluke-h1%2Ffoam/lists"}