Open Sustainable Technology

A curated list of open technology projects to sustain a stable climate, energy supply, biodiversity and natural resources.

Browse accepted projects | Review proposed projects | Propose new project | Open Issues

iNaturalistReactNative

Official iNaturalist client written in React Native that will eventually replace our existing iOS and Android apps.
https://github.com/inaturalist/iNaturalistReactNative

Last synced: about 2 hours ago
JSON representation

Repository metadata

Cross-platform version of the iNat mobile app

README

        

# iNaturalistReactNative ![test workflow](https://github.com/inaturalist/iNaturalistReactNative/actions/workflows/test.yml/badge.svg) ![iOS e2e workflow](https://github.com/inaturalist/iNaturalistReactNative/actions/workflows/e2e_ios.yml/badge.svg) ![Android e2e workflow](https://github.com/inaturalist/iNaturalistReactNative/actions/workflows/e2e_android.yml/badge.svg)

This is an official iNaturalist client written in React Native that will eventually replace our existing iOS and Android apps. Achieving parity with those established apps is taking some time, but we're getting there!

## Contributing
See [CONTRIBUTING](CONTRIBUTING.md) for guidelines on contributing to this project.

## Setup

### Requirements

* Xcode 15 or above
* [Android and iOS environment setup](https://reactnative.dev/docs/environment-setup) described in the RN docs

### Install packages and pods

1. Run `npm install`
1. Run `npx pod-install` or `cd ios && pod install` from the root directory
1. `cp env.example .env.staging` for staging and `cp env.example .env` for production and fill in appropriate values. This is not part of the code repo (contains secrets, such as OAuth client ID).
1. To run on Android, do this `cp android/example-keystore.properties android/keystore.properties`. Fill in the relevant values. If you are a member of iNat staff, get them from another member of iNat Staff.
1. Add AI Camera model and taxonomy files. The computer vision model files are not part of the code repo, and have to be installed. The app itself will load the model file with the filename specified in a .env file. On Android, the current file names are specified in these env variables `ANDROID_MODEL_FILE_NAME` and `ANDROID_TAXONOMY_FILE_NAME`. On iOS, the current file names are specified in these env variables `IOS_MODEL_FILE_NAME` and `IOS_TAXONOMY_FILE_NAME`. Currently, after a fresh clone of the repo, and copy of the env.example file, see above, you have to add the files following these steps:
1. Add the example model files by executing `npm run add-example-model`. If that does not work continue with the next step.
1. If the download script fails: The sample model files are available in this [`small_model.zip`](https://github.com/inaturalist/SeekReactNative/releases/tag/v2.9.1-138) file.
1. On Android, these files are named `small_inception_tf1.tflite` and `small_export_tax.csv`. Create a camera folder within Android assets (i.e. `android/app/src/debug/assets/camera`) and place the files there.
1. On iOS, these files are named `small_inception_tf1.mlmodel` and `small_export_tax.json` and should be added to the `ios` folder.

### Set up pre-commit hooks

1. We're using [Husky](https://typicode.github.io/husky/#/) to automatically run `eslint` before each commit. Run `npm run postinstall` to install Husky locally.
1. (Staff only) Set up GitGuardian to prevent yourself from committing secrets
1. [Install `ggshield`](https://docs.gitguardian.com/ggshield-docs/getting-started)
1. Get a GitGuardian API token from another staff developer and put it in the `GITGUARDIAN_API_KEY` env variable.

### Run build

1. Run `npm start -- --reset-cache` (`npm start` works too, but resetting the cache each time makes for a lot less build issues)
2. Run `npm run ios` or `npm run android`

### Running with staging environment

If you're on staff you can configure the app to read from and write to our staging server. Override `API_URL` to a staging API domain, either using local `.env.staging` file, or overriding the environment variable when calling `npm start`, e.g. `API_URL=http://example.com npm start -- --reset-cache`.

## Tests
We currently have three kinds of tests:

1. `tests/integration`: Tests the integration of multiple modules, e.g. a list of observation that makes requests to a mocked API, persists the response data in local storage, retrieves the data from local storage and renders components.
2. `tests/unit`: Tests only specific modules, like a single component, or a hook.
3. `e2e`: Tests user interactions on the finished app build running on the iOS simulator (see below).

### Unit tests & integration tests
We're using [Jest](https://jestjs.io/) and [React Native Testing Library](https://callstack.github.io/react-native-testing-library/) for most of our tests, [factoria](https://github.com/phanan/factoria) and [faker.js](https://github.com/Marak/faker.js/) to generate test data for use with mocks. `Local*` model factories represent locally persisted data, while `Remote*` factories represent that kinds of records we get from an API or external package.

```bash
# Run all tests
npm test

# Run test paths matching a pattern
npm test MyObs

# Run individual tests matching a pattern. Note the `--` to pass arguments to jest
npm test -- -t accessibility

# Update snapshots for a specific path
npm test Button.test.js -- --updateSnapshot
```

Note that you can run `npx jest` as well, but that will omit some environment variables we need to set for the test environment, so for consistent test runs please use `npm test`.

Also note that `i18next` needs to be initialized in individual test files (haven't figured out a way to await initialization before *all* tests, plus allowing tests to control initialization helps when testing different locales). Add `beforeAll( async ( ) => { await initI18next( ); } );` to a test file if it depends on localized text.

### E2E tests
We're using [Detox](https://wix.github.io/Detox/docs/introduction/getting-started/) for E2E tests. If you want to run the e2e tests on your local machine, make sure you follow the Detox environment setup instructions.

Then you have to populate `E2E_TEST_USERNAME` and `E2E_TEST_PASSWORD` in `.env` with real iNaturalist login credentials so the e2e test can actually authenticate.

Then you can run the tests:

```bash
# Build the app and run the tests
npm run e2e
```

If you don't have the iOS simulator the e2e tests are [configured](https://github.com/inaturalist/iNaturalistReactNative/blob/main/.detoxrc.js#L51) to use, you may need to create it in XCode 15: Go to Window > Devices and Simulators, click the Simulators tab, click the "+" button in the lower left, and create a simulator that matches the `device.simulator.device.type` setting in `.detoxrc.js`.

If you have built the app already for a previous test, and just want to run an updated test without changing the app code, you can run `npm run e2e:test`.

If you are running into some issues after the tests have been working for some time, try updating `applesimutils` with `brew update && brew upgrade applesimutils`.

If you want to run the Android tests you need to prepare your environment. Before you dive into the [setup](https://wix.github.io/Detox/docs/19.x/introduction/android-dev-env), know that alternatively you might find it easier setting up the required local emulator, preferrably an AOSP (Android Open Source Project) version, using Android Studio. Make sure the emulator has the same name as in the `.detoxrc.js` file.

Run `npm run e2e:build:android && npm run e2e:test:android` to build the APK for testing purposes and install and run it on the emulator with the name as stated in the `.detoxrc.js` file.

## Translations

### Adding new text

1. Add new strings in English to `src/i18n/strings.ftl` using [Fluent syntax](https://projectfluent.org/fluent/guide/), e.g.
```Fluent
# Header for a paragraph describing projects
ABOUT-PROJECTS = ABOUT
# Text describing what projects are
projects-description =
Projects are really great, probably iNat's best feature.
```
Try to match case and strike a balance between specificity and reusability when choosing a key. Please add context comments to help translators understand how the text is used, avoid variables whenever possible, and try to keep `strings.ftl` alphabetized by key.
1. Run `npm run translate` to validate strings and build the JSON files i18next needs to access text in the app
1. In a commponent, use the `useTranslation` hook to reference your new string, e.g.
```jsx
import { useTranslation } from "sharedHooks";
const MyComponent = ( ) => {
const { t } = useTranslation( );
return (

{ t( "ABOUT-PROJECTS" ) }
{ t( "projects-description" ) }

);
};
```
When components need to be included around interpolated variables, use the `` component:

Fluent:
```Fluent
Welcome-user = <0>Welcome back,0><1>{ $userHandle }1>
```

Usage:
```jsx
,

]}
/>
```

### Translating text

We manage translations through Crowdin. Actually updating the translation files should be largely automated, but this is what it looks like to do it manually (you must have the [Crowdin CLI](https://github.com/crowdin/crowdin-cli) installed and have an [access token](https://crowdin.com/settings#api-key) associated with a Crowdin user that can post files to the specified project):

```bash
# Upload new strings. Source and destination paths are specified in crowdin.yml
crowdin upload --token YOUR_ACCESS_TOKEN --project-id YOUR_PROJECT_ID

# Download new translations and build for use in the app
crowdin download --token YOUR_ACCESS_TOKEN --project-id YOUR_PROJECT_ID
npm run translate
git add src/i18n/l10n/*
git commit -a -m "Updated translations"
```

## Styling
We're using Nativewind, a styling system for React Native based on Tailwind CSS. Check the [Nativewind documentation](https://www.nativewind.dev/) to see what styles can be used in RN.

## Icons

We have a custom set of icons stored as SVG files and compiled into a font. New icons should be included with issues in a ready-to-use form, but some editing may be required.

1. Add / edit SVGs to / in `src/images/icons/` (`git add` any new icons). Icon SVGs must meet the following requirements
* `` element must have `width="24"` and `height="24"` attributes
* No paths with `fill-rule="evenodd"` attribute or `fill-rule: evenodd styles`
1. `npm run icons`
1. Rebuild the app (you'll have newly-linked assets that won't hot reload)

## Troubleshooting

1. Run `npx react-native clean-project`. This will give you options to clean caches, clean builds, reinstall pods, and reinstall node_modules. Using this eliminates a lot of hard-to-diagnose build issues.
1. If you're running on an M series chip, you may need to install a specific version of NDK to the app to build for Android. See `android/build.gradle`

## Deploying

We use [fastlane](https://docs.fastlane.tools/) to help automate parts of the deployment process, which requires some additional setup.

### Setting up fastlane

1. Make a [Github personal access token](https://github.com/settings/tokens/) with repo access in the `GITHUB_API_TOKEN` environmental variable.
1. `cp android/example-keystore.properties android/keystore.properties` and fill in the relevant values provided by another member of iNat staff.
1. `cp fastlane/example-Appfile fastlane/Appfile` and fill in the relevant values provided by another member of iNat staff.
1. Work with iNat staff to either get a new Apple ID or associate an existing one with the iNat Apple development team
1. Sign in to Xcode with your Apple ID
1. Manage Certificates and add an Apple Distribution certificate associated with the iNaturalist team

### Using Fastlane

The current expectation is that we tag to freeze the code, bump the internal build number, and describe the changes represented by the tag. Then we release to make builds and publish on Github. Later, presumably when some of the change logs have been translated, we push builds for internal testing. If that looks ok, we push to public testing, and later to production release.

```zsh
# Make a git tag. This will bump the build number and prompt you to describe
# what changed, which will be used for the eventual github release
# description and changelogs uploaded to the app stores.
fastlane tag

# Make a github release. This will make relevant builds, a github release, and
# add build files to the release
fastlane release

# Upload the build for the latest tag for internal testing
fastlane internal

# Upload the build for the latest tag for public testing (promotes latest
# internal build to open testing)
fastlane beta

# Upload the build for the latest tag to production release. In Android, this
# should just promote the last beta to prod.
fastlane prod
```

### Example: Build & Release for People Outside the Dev Team

1. Ensure all tests are passing on the main branch
1. Manual testing
1. Install a "Release" build on an iOS device
1. Online
1. Sign in
1. Make an observation by taking a new photo in the AI Camera; tap "Upload Now" to upload immediately; wait for upload to complete before moving on
1. Make an observation by taking a new photo in the StandardCamera; save without upload
1. Make an observation by importing an existing; save without upload
1. Make an observation without a photo; save without upload
1. Upload from the toolbar on MyObs
1. Offline
1. Go into airplane mode
1. Make an observation by taking a new photo in the AICamera
1. Make an observation by taking a new photo in the StandardCamera
1. Make an observation by importing an existing
1. Make an observation without a photo
1. Turn off airplane mode
1. Upload from the toolbar on MyObs
1. Install a "release" build on an Android device and repeat iOS steps
1. Write release notes based on commits since the last release. Try to keep them brief but emphasize what's new and what's fixed. Just keep them in a text editor; you'll save them at a later step.
1. Edit `package.json` and update the `version` per semantic versioning rules: bump the patch version if the only changes were bug fixes, bump minor version if there were new features, and bump the major version if the app was completely re-written or can't import data from previous versions.
1. `npm install` to set the version in `package-lock.json`
1. Commit changes
1. `bundle exec fastlane tag` to create a tag and bump the build number. You'll be prompted to enter those release notes you wrote. (:wq to save and exit)
1. `bundle exec fastlane release` to build and push a release to Github
1. `bundle exec fastlane internal` to distribute the builds to internal test groups in TestFlight and the Play Store
1. `bundle exec fastlane beta` to distribute the builds to external test groups in TestFlight and the Play Store


Owner metadata


GitHub Events

Total
Last Year

Committers metadata

Last synced: 1 day ago

Total Commits: 1,427
Total Committers: 15
Avg Commits per committer: 95.133
Development Distribution Score (DDS): 0.718

Commits in past year: 808
Committers in past year: 10
Avg Commits per committer in past year: 80.8
Development Distribution Score (DDS) in past year: 0.636

Name Email Commits
Ken-ichi Ueda k****a@g****m 402
Johannes Klein j****n@g****m 392
Amanda Bullington 3****n 365
Angie Ta a****e@i****g 126
budowski b****i@g****m 60
Chris c****b@g****m 58
Merhawit Gubsa m****a@g****m 7
dependabot[bot] 4****] 5
joergmlpts 6****s 4
Nick McConnell n****l@g****m 2
Corey Farwell c****f@r****g 2
Johannes Klein k****s@w****e 1
Alex Shepard a****x@m****m 1
Austin Crossman 8****5 1
Yahia Jabeur 4****r 1

Committer domains:


Issue and Pull Request metadata

Last synced: 1 day ago

Total issues: 543
Total pull requests: 459
Average time to close issues: about 2 months
Average time to close pull requests: 4 days
Total issue authors: 12
Total pull request authors: 10
Average comments per issue: 0.63
Average comments per pull request: 0.17
Merged pull request: 417
Bot issues: 0
Bot pull requests: 21

Past year issues: 472
Past year pull requests: 426
Past year average time to close issues: about 1 month
Past year average time to close pull requests: 3 days
Past year issue authors: 9
Past year pull request authors: 8
Past year average comments per issue: 0.55
Past year average comments per pull request: 0.14
Past year merged pull request: 387
Past year bot issues: 0
Past year bot pull requests: 21

More stats: https://issues.ecosyste.ms/repositories/lookup?url=https://github.com/inaturalist/iNaturalistReactNative

Top Issue Authors

  • kueda (281)
  • albullington (101)
  • jtklein (86)
  • abhasinat (50)
  • angielt (11)
  • tiwane (6)
  • carrieseltzer (3)
  • budowski (1)
  • Chrischuck (1)
  • flbn (1)
  • joergmlpts (1)
  • xurizaemon (1)

Top Pull Request Authors

  • albullington (183)
  • jtklein (93)
  • kueda (72)
  • budowski (44)
  • angielt (37)
  • dependabot[bot] (21)
  • joergmlpts (6)
  • frewsxcv (1)
  • alexshepard (1)
  • meru20 (1)

Top Issue Labels

  • bug (281)
  • enhancement (242)
  • Android (28)
  • good first issue (18)
  • devops (16)
  • iOS (12)
  • exploration (12)
  • user bug (12)
  • UI (8)
  • navigation (7)
  • crash (6)

Top Pull Request Labels

  • dependencies (21)
  • ruby (2)
  • javascript (2)

Dependencies

.github/workflows/e2e_android.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • actions/setup-java v3 composite
  • actions/setup-node v3 composite
  • actions/upload-artifact v3 composite
  • fkirc/skip-duplicate-actions master composite
  • iRoachie/slack-github-actions v2.3.0 composite
.github/workflows/e2e_ios.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • actions/setup-node v3 composite
  • actions/upload-artifact v3 composite
  • fkirc/skip-duplicate-actions master composite
  • iRoachie/slack-github-actions v2.3.0 composite
.github/workflows/test.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • actions/setup-node v3 composite
  • fkirc/skip-duplicate-actions master composite
  • iRoachie/slack-github-actions v2.3.0 composite
ios/Podfile cocoapods
  • RNShareMenu >= 0
  • RNVectorIcons >= 0
  • React-jsi >= 0
  • react-native-config >= 0
ios/Podfile.lock cocoapods
  • BEMCheckBox 1.4.1
  • BVLinearGradient 2.8.3
  • DoubleConversion 1.1.6
  • FBLazyVector 0.71.12
  • FBReactNativeSpec 0.71.12
  • Permission-LocationWhenInUse 3.8.0
  • Permission-PhotoLibrary 3.8.0
  • RCT-Folly 2021.07.22.00
  • RCTRequired 0.71.12
  • RCTTypeSafety 0.71.12
  • RNAudioRecorderPlayer 3.6.0
  • RNCAsyncStorage 1.19.3
  • RNCCheckbox 0.5.16
  • RNCPicker 2.5.0
  • RNDateTimePicker 7.6.0
  • RNDeviceInfo 10.9.0
  • RNFS 2.20.0
  • RNFlashList 1.6.1
  • RNGestureHandler 2.13.0
  • RNLocalize 2.2.6
  • RNPermissions 3.8.0
  • RNReanimated 2.17.0
  • RNSVG 13.9.0
  • RNScreens 3.20.0
  • RNShareMenu 6.0.0
  • RNVectorIcons 9.2.0
  • React 0.71.12
  • React-Codegen 0.71.12
  • React-Core 0.71.12
  • React-CoreModules 0.71.12
  • React-RCTActionSheet 0.71.12
  • React-RCTAnimation 0.71.12
  • React-RCTAppDelegate 0.71.12
  • React-RCTBlob 0.71.12
  • React-RCTImage 0.71.12
  • React-RCTLinking 0.71.12
  • React-RCTNetwork 0.71.12
  • React-RCTSettings 0.71.12
  • React-RCTText 0.71.12
  • React-RCTVibration 0.71.12
  • React-callinvoker 0.71.12
  • React-cxxreact 0.71.12
  • React-hermes 0.71.12
  • React-jsi 0.71.12
  • React-jsiexecutor 0.71.12
  • React-jsinspector 0.71.12
  • React-logger 0.71.12
  • React-perflogger 0.71.12
  • React-runtimeexecutor 0.71.12
  • ReactCommon 0.71.12
  • ReactNativeExceptionHandler 2.10.10
  • RealmJS 11.10.2
  • VisionCamera 2.15.4
  • VisionCameraPluginInatVision 0.1.0
  • Yoga 1.14.0
  • boost 1.76.0
  • fmt 6.2.1
  • glog 0.3.5
  • hermes-engine 0.71.12
  • libevent 2.1.12
  • react-native-cameraroll 5.9.0
  • react-native-config 1.5.0
  • react-native-exif-reader 0.2.3
  • react-native-geocoder-reborn 0.9.0
  • react-native-geolocation 3.1.0
  • react-native-image-picker 5.3.1
  • react-native-image-resizer 3.0.7
  • react-native-keep-awake 1.1.0
  • react-native-mail 6.1.1
  • react-native-maps 1.7.1
  • react-native-netinfo 9.4.1
  • react-native-orientation-locker 1.5.0
  • react-native-render-html 6.3.4
  • react-native-safe-area-context 4.7.2
  • react-native-sensitive-info 6.0.0-alpha.9
  • react-native-webview 11.26.1
android/app/build.gradle maven
  • androidx.appcompat:appcompat 1.1.0 implementation
  • androidx.swiperefreshlayout:swiperefreshlayout 1.0.0 implementation
  • com.facebook.react:hermes-android * implementation
  • com.facebook.react:react-android * implementation
android/build.gradle maven
package-lock.json npm
  • 1698 dependencies
package.json npm
  • @babel/core ^7.21.4 development
  • @babel/preset-env ^7.21.4 development
  • @babel/runtime ^7.21.0 development
  • @faker-js/faker ^7.6.0 development
  • @react-native-community/eslint-config ^3.2.0 development
  • @tanstack/eslint-plugin-query ^4.34.1 development
  • @testing-library/jest-native ^5.4.3 development
  • @testing-library/react-native ^12.3.0 development
  • @tsconfig/react-native ^2.0.2 development
  • @types/jest ^29.5.0 development
  • @types/react ^18.0.24 development
  • @types/react-test-renderer ^18.0.0 development
  • babel-jest ^29.5.0 development
  • babel-plugin-module-resolver ^5.0.0 development
  • detox ^20.12.1 development
  • dotenv ^16.3.1 development
  • download ^8.0.0 development
  • eslint ^8.49.0 development
  • eslint-config-airbnb ^19.0.4 development
  • eslint-import-resolver-babel-module ^5.3.2 development
  • eslint-plugin-eslint-comments ^3.2.0 development
  • eslint-plugin-flowtype ^8.0.3 development
  • eslint-plugin-i18next ^6.0.3 development
  • eslint-plugin-import ^2.28.1 development
  • eslint-plugin-jest ^27.4.0 development
  • eslint-plugin-jsx-a11y ^6.7.1 development
  • eslint-plugin-module-resolver ^1.5.0 development
  • eslint-plugin-react ^7.33.2 development
  • eslint-plugin-react-hooks ^4.6.0 development
  • eslint-plugin-react-native ^4.1.0 development
  • eslint-plugin-react-native-a11y ^3.3.0 development
  • eslint-plugin-simple-import-sort ^10.0.0 development
  • eslint-plugin-testing-library ^6.0.1 development
  • factoria ^4.0.1 development
  • flow-bin ^0.182.0 development
  • fluent_conv ^3.2.0 development
  • glob ^7.2.3 development
  • husky ^8.0.3 development
  • jest ^29.5.0 development
  • jest-circus ^29.5.0 development
  • metro-config 0.73.9 development
  • metro-react-native-babel-preset 0.73.10 development
  • nock ^13.3.3 development
  • patch-package ^8.0.0 development
  • prettier ^3.0.3 development
  • react-native-accessibility-engine ^3.2.0 development
  • react-native-clean-project ^4.0.1 development
  • react-native-config-node ^0.0.3 development
  • react-test-renderer 18.2.0 development
  • tailwindcss ^3.3.2 development
  • typescript 4.8.4 development
  • yargs ^17.7.2 development
  • @babel/eslint-parser ^7.21.3
  • @babel/preset-react ^7.18.6
  • @bam.tech/react-native-image-resizer ^3.0.7
  • @gorhom/bottom-sheet ^4.4.7
  • @react-native-async-storage/async-storage ^1.19.3
  • @react-native-camera-roll/camera-roll ^5.9.0
  • @react-native-community/checkbox ^0.5.16
  • @react-native-community/datetimepicker ^7.6.0
  • @react-native-community/geolocation ^3.1.0
  • @react-native-community/netinfo ^9.4.1
  • @react-native-picker/picker ^2.5.0
  • @react-navigation/bottom-tabs ^6.5.8
  • @react-navigation/drawer ^6.6.3
  • @react-navigation/elements ^1.3.17
  • @react-navigation/native ^6.1.7
  • @react-navigation/native-stack ^6.9.13
  • @react-spring/native 9.5.5
  • @realm/react ^0.4.3
  • @sayem314/react-native-keep-awake 1.1.0
  • @shopify/flash-list ^1.6.1
  • @tanstack/react-query ^4.35.3
  • apisauce 3.0.0
  • axios 0.27.2
  • babel-plugin-transform-inline-environment-variables ^0.4.3
  • classnames ^2.3.2
  • date-fns ^2.30.0
  • date-fns-tz ^2.0.0
  • fbjs ^3.0.5
  • i18next ^23.5.1
  • i18next-fluent ^2.0.0
  • i18next-resources-to-backend ^1.1.4
  • inaturalistjs github:inaturalist/inaturalistjs
  • intl-pluralrules ^2.0.1
  • linkify-html ^4.1.1
  • linkifyjs ^4.1.1
  • lodash ^4.17.21
  • markdown-it ^13.0.1
  • nativewind ^2.0.11
  • npm ^9.6.4
  • radio-buttons-react-native ^1.0.4
  • react 18.2.0
  • react-dom 18.2.0
  • react-i18next ^13.2.2
  • react-native 0.71.12
  • react-native-animated-dots-carousel ^1.0.2
  • react-native-audio-recorder-player ^3.6.0
  • react-native-circular-progress-indicator ^4.4.2
  • react-native-config 1.5.0
  • react-native-device-info ^10.9.0
  • react-native-email-link ^1.14.7
  • react-native-event-listeners ^1.0.7
  • react-native-exception-handler ^2.10.10
  • react-native-exif-reader github:inaturalist/react-native-exif-reader
  • react-native-fs ^2.20.0
  • react-native-geocoder-reborn ^0.9.0
  • react-native-gesture-handler ^2.13.0
  • react-native-image-pan-zoom ^2.1.12
  • react-native-image-picker ^5.3.1
  • react-native-jwt-io ^1.0.3
  • react-native-keyboard-aware-scroll-view ^0.9.5
  • react-native-linear-gradient ^2.8.3
  • react-native-localize ^2.2.6
  • react-native-logs ^5.0.1
  • react-native-mail github:chirag04/react-native-mail
  • react-native-maps ^1.7.1
  • react-native-modal ^13.0.1
  • react-native-modal-datetime-picker ^17.1.0
  • react-native-network-logger ^1.15.0
  • react-native-orientation-locker github:wonday/react-native-orientation-locker
  • react-native-paper ^5.10.5
  • react-native-permissions 3.8.0
  • react-native-picker-select 8.0.4
  • react-native-reanimated ^2.17.0
  • react-native-reanimated-carousel ^3.4.0
  • react-native-render-html ^6.3.4
  • react-native-safe-area-context ^4.7.2
  • react-native-screens 3.20.0
  • react-native-sensitive-info ^6.0.0-alpha.9
  • react-native-share-menu ^6.0.0
  • react-native-svg 13.9.0
  • react-native-svg-transformer ^1.0.0
  • react-native-uuid ^2.0.1
  • react-native-vector-icons ^9.1.0
  • react-native-vision-camera github:inaturalist/react-native-vision-camera#our-main-fork
  • react-native-webview ^11.26.1
  • react-tinder-card ^1.6.2
  • realm ^11.10.2
  • sanitize-html ^2.11.0
  • use-debounce ^9.0.4
  • vision-camera-plugin-inatvision github:inaturalist/vision-camera-plugin-inatvision
Gemfile rubygems
  • cocoapods >= 1.11.3
  • fastlane >= 0
  • nokogiri >= 0
Gemfile.lock rubygems
  • 117 dependencies
android/Gemfile rubygems
  • fastlane >= 0
android/Gemfile.lock rubygems
  • CFPropertyList 3.0.5
  • addressable 2.8.0
  • artifactory 3.0.15
  • atomos 0.1.3
  • aws-eventstream 1.2.0
  • aws-partitions 1.573.0
  • aws-sdk-core 3.130.0
  • aws-sdk-kms 1.55.0
  • aws-sdk-s3 1.113.0
  • aws-sigv4 1.4.0
  • babosa 1.0.4
  • bundler 2.3.7
  • claide 1.1.0
  • colored 1.2
  • colored2 3.1.2
  • commander 4.6.0
  • declarative 0.0.20
  • digest-crc 0.6.4
  • domain_name 0.5.20190701
  • dotenv 2.7.6
  • emoji_regex 3.2.3
  • excon 0.92.2
  • faraday 1.10.0
  • faraday-cookie_jar 0.0.7
  • faraday-em_http 1.0.0
  • faraday-em_synchrony 1.0.0
  • faraday-excon 1.1.0
  • faraday-httpclient 1.0.1
  • faraday-multipart 1.0.3
  • faraday-net_http 1.0.1
  • faraday-net_http_persistent 1.2.0
  • faraday-patron 1.0.0
  • faraday-rack 1.0.0
  • faraday-retry 1.0.3
  • faraday_middleware 1.2.0
  • fastimage 2.2.6
  • fastlane 2.205.1
  • fastlane-plugin-versioning_android 0.1.0
  • gh_inspector 1.1.3
  • google-apis-androidpublisher_v3 0.18.0
  • google-apis-core 0.4.2
  • google-apis-iamcredentials_v1 0.10.0
  • google-apis-playcustomapp_v1 0.7.0
  • google-apis-storage_v1 0.12.0
  • google-cloud-core 1.6.0
  • google-cloud-env 1.6.0
  • google-cloud-errors 1.2.0
  • google-cloud-storage 1.36.1
  • googleauth 1.1.2
  • highline 2.0.3
  • http-cookie 1.0.4
  • httpclient 2.8.3
  • jmespath 1.6.1
  • json 2.6.1
  • jwt 2.3.0
  • memoist 0.16.2
  • mini_magick 4.11.0
  • mini_mime 1.1.2
  • multi_json 1.15.0
  • multipart-post 2.0.0
  • nanaimo 0.3.0
  • naturally 2.2.1
  • optparse 0.1.1
  • os 1.1.4
  • plist 3.6.0
  • public_suffix 4.0.6
  • rake 13.0.6
  • representable 3.1.1
  • retriable 3.1.2
  • rexml 3.2.5
  • rouge 2.0.7
  • ruby2_keywords 0.0.5
  • rubyzip 2.3.2
  • security 0.1.3
  • signet 0.16.1
  • simctl 1.6.8
  • terminal-notifier 2.0.0
  • terminal-table 1.8.0
  • trailblazer-option 0.1.2
  • tty-cursor 0.7.1
  • tty-screen 0.8.1
  • tty-spinner 0.9.3
  • uber 0.1.0
  • unf 0.1.4
  • unf_ext 0.0.8.1
  • unicode-display_width 1.8.0
  • webrick 1.7.0
  • word_wrap 1.0.0
  • xcodeproj 1.21.0
  • xcpretty 0.3.0
  • xcpretty-travis-formatter 1.0.1
ios/Gemfile rubygems
  • fastlane >= 0
ios/Gemfile.lock rubygems
  • CFPropertyList 3.0.5
  • addressable 2.8.0
  • artifactory 3.0.15
  • atomos 0.1.3
  • aws-eventstream 1.2.0
  • aws-partitions 1.573.0
  • aws-sdk-core 3.130.0
  • aws-sdk-kms 1.55.0
  • aws-sdk-s3 1.113.0
  • aws-sigv4 1.4.0
  • babosa 1.0.4
  • bundler 2.3.7
  • claide 1.1.0
  • colored 1.2
  • colored2 3.1.2
  • commander 4.6.0
  • declarative 0.0.20
  • digest-crc 0.6.4
  • domain_name 0.5.20190701
  • dotenv 2.7.6
  • emoji_regex 3.2.3
  • excon 0.92.2
  • faraday 1.10.0
  • faraday-cookie_jar 0.0.7
  • faraday-em_http 1.0.0
  • faraday-em_synchrony 1.0.0
  • faraday-excon 1.1.0
  • faraday-httpclient 1.0.1
  • faraday-multipart 1.0.3
  • faraday-net_http 1.0.1
  • faraday-net_http_persistent 1.2.0
  • faraday-patron 1.0.0
  • faraday-rack 1.0.0
  • faraday-retry 1.0.3
  • faraday_middleware 1.2.0
  • fastimage 2.2.6
  • fastlane 2.205.1
  • gh_inspector 1.1.3
  • google-apis-androidpublisher_v3 0.18.0
  • google-apis-core 0.4.2
  • google-apis-iamcredentials_v1 0.10.0
  • google-apis-playcustomapp_v1 0.7.0
  • google-apis-storage_v1 0.12.0
  • google-cloud-core 1.6.0
  • google-cloud-env 1.6.0
  • google-cloud-errors 1.2.0
  • google-cloud-storage 1.36.1
  • googleauth 1.1.2
  • highline 2.0.3
  • http-cookie 1.0.4
  • httpclient 2.8.3
  • jmespath 1.6.1
  • json 2.6.1
  • jwt 2.3.0
  • memoist 0.16.2
  • mini_magick 4.11.0
  • mini_mime 1.1.2
  • multi_json 1.15.0
  • multipart-post 2.0.0
  • nanaimo 0.3.0
  • naturally 2.2.1
  • optparse 0.1.1
  • os 1.1.4
  • plist 3.6.0
  • public_suffix 4.0.6
  • rake 13.0.6
  • representable 3.1.1
  • retriable 3.1.2
  • rexml 3.2.5
  • rouge 2.0.7
  • ruby2_keywords 0.0.5
  • rubyzip 2.3.2
  • security 0.1.3
  • signet 0.16.1
  • simctl 1.6.8
  • terminal-notifier 2.0.0
  • terminal-table 1.8.0
  • trailblazer-option 0.1.2
  • tty-cursor 0.7.1
  • tty-screen 0.8.1
  • tty-spinner 0.9.3
  • uber 0.1.0
  • unf 0.1.4
  • unf_ext 0.0.8.1
  • unicode-display_width 1.8.0
  • webrick 1.7.0
  • word_wrap 1.0.0
  • xcodeproj 1.21.0
  • xcpretty 0.3.0
  • xcpretty-travis-formatter 1.0.1

Score: 7.635303886259415