{"id":22727072,"url":"https://github.com/microbiomedata/nmdc-field-notes","last_synced_at":"2025-04-12T15:51:33.585Z","repository":{"id":235309339,"uuid":"733265194","full_name":"microbiomedata/nmdc-field-notes","owner":"microbiomedata","description":"Mobile app for metadata collection on the go","archived":false,"fork":false,"pushed_at":"2025-04-07T22:26:28.000Z","size":8467,"stargazers_count":2,"open_issues_count":29,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-07T22:28:31.334Z","etag":null,"topics":["capacitor","ionic","react"],"latest_commit_sha":null,"homepage":"https://fieldnotes.microbiomedata.org/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/microbiomedata.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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}},"created_at":"2023-12-18T23:58:21.000Z","updated_at":"2025-03-19T22:18:26.000Z","dependencies_parsed_at":"2024-07-08T01:29:03.327Z","dependency_job_id":"3cd4d29a-72f4-40c9-bfad-b1ed42b18b90","html_url":"https://github.com/microbiomedata/nmdc-field-notes","commit_stats":null,"previous_names":["microbiomedata/nmdc-field-notes"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microbiomedata%2Fnmdc-field-notes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microbiomedata%2Fnmdc-field-notes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microbiomedata%2Fnmdc-field-notes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/microbiomedata%2Fnmdc-field-notes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/microbiomedata","download_url":"https://codeload.github.com/microbiomedata/nmdc-field-notes/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248591971,"owners_count":21130156,"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","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":["capacitor","ionic","react"],"created_at":"2024-12-10T17:09:11.969Z","updated_at":"2025-04-12T15:51:33.577Z","avatar_url":"https://github.com/microbiomedata.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NMDC Field Notes\n\nNMDC Field Notes is a mobile app researchers can use to collect metadata in the field.\n\nThe app is currently in development.\n\n## Development\n\n### Install dependencies\n\n#### Node.js and npm\n\nInstall [Node.js v20](https://nodejs.org/en/download/), which includes npm.\n\n\u003e Once you've done that, you'll be able to run Node.js via `$ node` and npm via `$ npm`.\n\n#### Ionic CLI\n\nInstall the [Ionic CLI](https://ionicframework.com/docs/cli) globally.\n\n```shell\nnpm install -g @ionic/cli\n```\n\n\u003e The `-g` option tells npm you want it to install that package globally, which the Ionic CLI's authors recommend.\n\u003e Once you've done that, you'll be able to run the Ionic CLI via `$ ionic`.\n\n#### npm packages\n\nInstall the npm packages upon which this project depends.\n\n```shell\nnpm install\n```\n\n\u003e That tells npm you want it to install all the packages listed in the `package-lock.json` file,\n\u003e which was programmatically generated from the manually-maintained `package.json` file.\n\n### Set up Capacitor environment\n\n[Capacitor](https://capacitorjs.com/) is a library that gives the web application access to the device's native functionality (e.g. location, camera, and storage). Review the Capacitor [environment setup](https://capacitorjs.com/docs/getting-started/environment-setup) documentation and make sure you have the necessary dependencies installed.\n\n### Setup local environment\n\nThe application loads values from environment variables defined in a `.env.local` file.\n\n\u003e That file is intentionally not stored in the Git repository. That file is [loaded automatically by Vite](https://vitejs.dev/guide/env-and-mode), which exposes the environment variables via the `import.meta.env` object. The application's `config.ts` file then uses that object to make a `config` object—and the rest of the application uses that `config` object instead of directly accessing the `import.meta.env` object.\n\nYou can copy the `.env.local.example` file to `.env.local` to get started.\n\n```shell\ncp .env.local.example .env.local\n```\n\n### Start development server\n\nRun the `dev` script defined in `package.json`.\n\n```shell\nnpm run dev\n```\n\nThat will start a development server, serving the web version of the mobile app.\n\n\u003e The development server is powered by [Vite](https://vitejs.dev/guide/cli.html#dev-server).\n\n### Using a local `nmdc-server`\n\nIf you want your local Field Notes instance to work with a local `nmdc-server` instance, there are a few environment variables to set on the server side.\n\nThe `NMDC_CORS_ALLOW_ORIGINS` variable controls which origins are allowed to make CORS requests to the server. It is a comma-separated list of origins. Add `http://127.0.0.1:8100` to allow requests from the web-based interface. Add `capacitor://localhost` and `https://localhost` to allow requests from device simulators. So for example, in the `nmdc-server` `.env` file:\n\n```\nNMDC_CORS_ALLOW_ORIGINS=capacitor://localhost,https://localhost,http://127.0.0.1:8100\n```\n\nThe `NMDC_LOGIN_REDIRECT_ALLOW_ORIGINS` variable controls which origins are allowed to redirect to after login. It is a comma-separated list of origins. Add `http://127.0.0.1:8100` to allow redirects to the web-based interface. Add `org.microbiomedata.fieldnotes://` to allow redirects to mobile apps. So for example, in the `nmdc-server` `.env` file:\n\n```\nNMDC_LOGIN_REDIRECT_ALLOW_ORIGINS=http://127.0.0.1:8100,org.microbiomedata.fieldnotes://\n```\n\n### Using the dev `nmdc-server`\n\nAlternatively, you can have your local Field Notes instance talk to the dev `nmdc-server` instance. In that case, you can set the `NMDC_SERVER_URL` environment variable in your `.env.local` file to `https://data-dev.microbiomedata.org`.\n\n### Visit development server\n\nWe recommend you use your web browser's developer tools to [decrease the size of your web browser's viewport](\u003c(https://ionicframework.com/docs/developing/previewing#simulating-a-mobile-viewport)\u003e) so that it resembles the screen of a mobile device, then visit the development server.\n\nYou can visit the development server at:\n\n- http://127.0.0.1:8100\n\n#### Switching styles between iOS and Android\n\nBy default, Ionic will use the web browser's user agent to determine whether to style the web app like an iOS app or an Android app. For most web browser user agents, it will style it like an Android app. You can force a particular style by adding the `ionic:mode` [query parameter](https://ionicframework.com/docs/developing/tips#changing-mode) to the URL, as shown below.\n\n##### Force iOS style\n\n```diff\n- http://127.0.0.1:8100/\n+ http://127.0.0.1:8100/?ionic:mode=ios\n```\n\n##### Force Android style\n\n```diff\n- http://127.0.0.1:8100/\n+ http://127.0.0.1:8100/?ionic:mode=md\n```\n\n\u003e The `md` stands for [Material Design](https://material.google.com).\n\n#### Hiding the ReactQueryDevtools icon\n\nWhen running the app in _development_ mode, a colorful icon will be visible in the lower right corner of the screen. Clicking on that icon will reveal a devtools panel specific to the [React Query/TanStack Query](https://tanstack.com/query/v4/docs/framework/react/devtools) library the app was built with.\n\nIn case you want to temporarily hide that icon from the UI (e.g. when taking screenshots for release notes), you can do so by either:\n\n- Temporarily commenting out the `\u003cReactQueryDevtools initialIsOpen={false} /\u003e` element (in `src/QueryClientProvider.tsx`); or\n- Temporarily running the app in _production_ mode:\n  ```shell\n  NODE_ENV=production npm run dev\n  ```\n\n### Run linter\n\nRun the linter.\n\n```shell\nnpm run lint\n```\n\n\u003e That tells npm you want it to run the script named `lint`, defined in the `package.json` file.\n\u003e At the time of this writing, that script runs `eslint src`.\n\n### Run circular import check\n\nIdentify circular imports using the [`madge`](https://github.com/pahen/madge) package.\n\n```shell\nnpm run check.imports\n```\n\n### Run automated tests\n\n#### Unit tests\n\nRun the unit tests.\n\n```shell\nnpm run test.unit\n```\n\n\u003e That tells npm you want it to run the script named `test.unit`, defined in the `package.json` file.\n\u003e At the time of this writing, that script runs `vitest`.\n\n#### End-to-end tests\n\nAssuming the development server is running, you can run the end-to-end tests with:\n\n```shell\nnpm run test.e2e\n```\n\n\u003e That tells npm you want it to run the script named `test.e2e`, defined in the `package.json` file.\n\u003e At the time of this writing, that script runs `cypress run`.\n\n### (Optional) Run iOS simulator\n\nAssuming you're using a Mac, here's how you can simulate the iOS version of the mobile app.\n\nDownload and install [Xcode](https://developer.apple.com/xcode/) (if you haven't already).\n\nIf either (a) this is your first time running the simulator, or (b) you have added a Capacitor plugin since the last time you ran the simulator; run:\n\n```shell\nionic capacitor sync ios\n```\n\nStart the simulator with live reloading enabled:\n\n```shell\nnpm run dev.ios\n```\n\nThe simulator may take a few minutes to start. Eventually, the console will say \"`Deploying App.app to \u003cuuid\u003e`\" and the simulator will appear.\n\n### (Optional) Run Android simulator\n\nIf you haven't already, download and install Android Studio and an Android SDK following the instructions in the [Capacitor documentation](https://capacitorjs.com/docs/getting-started/environment-setup#android-requirements).\n\nIf either (a) this is your first time running the simulator, or (b) you have added a Capacitor plugin since the last time you ran the simulator; run:\n\n```shell\nionic capacitor sync android\n```\n\nStart the simulator with live reloading enabled:\n\n```shell\nnpm run dev.android\n```\n\nOnce the simulator is running and the app opens, you may see a message saying \"The webpage at http://127.0.0.1:8100 could not be loaded because net::ERR_CONNECTION_REFUSED\". In that case run the following while the simulator is running and then relaunch the app within the simulator:\n\n```shell\nadb reverse tcp:8100 tcp:8100\n```\n\nIf you are using a [local](#using-a-local-nmdc-server) `nmdc-server` instance, you must forward the port to the Android simulator. Assuming your local `nmdc-server` is running on port 8000 (the default), run the following after the simulator has started:\n\n```shell\nadb reverse tcp:8000 tcp:8000\n```\n\n### Format code\n\nWe use [Prettier](https://prettier.io/) to ensure the files in this repository are formatted the way we want.\n\nYou can use it like this:\n\n```shell\n# Check whether any files are not formatted.\nnpm run check.format\n\n# Format all files.\nnpm run format\n```\n\nThe `.prettierignore` file tells Prettier which files we want it to\n[ignore](https://prettier.io/docs/en/ignore#ignoring-files-prettierignore) (i.e. to _not_ format).\n\n\u003e The `.prettierignore` file automatically inherits from the `.gitignore` file.\n\nThe `prettier.config.js` file can be used to override Prettier's\ndefault [configuration](https://prettier.io/docs/en/configuration).\n\n\u003e Also, the presence of the file signifies to [code editors](https://prettier.io/docs/en/editors)\n\u003e that this project uses Prettier; which may influence some features of the editor.\n\n### Preview UI components\n\nWe use [Storybook](https://storybook.js.org/) to preview UI components in isolation.\n\n\u003e Storybook is an interactive directory of your UI components and their stories.\n\u003e In the past, you'd have to spin up the app, navigate to a page, and contort the UI into the right state. (...)\n\u003e With Storybook, you can skip all those steps and jump straight to working on a UI component in a specific state.\n\u003e\n\u003e Source: [Why Storybook?](https://storybook.js.org/docs/get-started/why-storybook#storybook-keeps-track-of-every-story)\n\nYou can start the Storybook web server by running:\n\n```shell\nnpm run storybook\n```\n\nOnce the Storybook web server is running, you will be able to access it at:\n\n- http://localhost:6006\n\n### Add an environment variable\n\nHere's how you can introduce a new environment variable to the code base:\n\n1. Add its TypeScript type information to the `ImportMetaEnv` interface in `src/vite-env.d.ts`\n2. Add its name and an example value to `.env.local.example`\n3. Add the variable to the `Config` interface and the `config` object in `config.ts`\n4. Elsewhere in the code base, access the variable via the `config` object exported by `config.ts` (instead of\n   accessing `import.meta.env.{NAME}` directly)\n\n### Debugging Firebase Analytics\n\n#### Background\n\nThis project uses Firebase to collect analytics data. There are two separate Firebase projects: one for development and one for production. This is important so that analytics data generated by local development does not contribute to our actual metrics. If you need to access the Firebase console for either project, ask a team member to give you access.\n\nEach Firebase project has its own native configuration files. Switching between the two projects is controlled by the `NODE_ENV` environment variable (see the iOS scheme/Android flavor settings in `capacitor.config.ts`). When the `NODE_ENV` is set to `production`, the app will use the production Firebase configuration files (`android/app/src/prod/google-services.json` and `ios/App/prod/GoogleService-Info.plist`). Otherwise, the app will use the development Firebase configuration files (`android/app/src/dev/google-services.json` and `ios/App/dev/GoogleService-Info.plist`).\n\n\u003e For more information on setting up multiple environments in Capacitor, see the [Capacitor documentation](https://capacitorjs.com/docs/guides/environment-specific-configurations). For Firebase-specific information, see the [Firebase documentation](https://firebase.google.com/docs/projects/multiprojects).\n\n#### Enabling local analytics\n\n**By default, local development instances will not send analytics data to Firebase**. This is controlled by the `VITE_ENABLE_FIREBASE_ANALYTICS` environment variable. You can enable local analytics by adding the following line to your `.env.local` file:\n\n```\nVITE_ENABLE_FIREBASE_ANALYTICS=true\n```\n\nOnly add this line if you are actively developing code that sends analytics events, and be sure to remove it when you are done.\n\n#### Debugging analytics events\n\nIt is recommended that you use a native device simulator to debug analytics events. This is because the native Firebase SDKs generate events which cannot be generated by the web SDK. For example to use an iOS simulator, run:\n\n```shell\nnpm run dev.ios\n```\n\nThe app's XCode project is already configured to use [Firebase's DebugView](https://firebase.google.com/docs/analytics/debugview) via the `-FIRDebugEnabled` flag. Once your device simulator is running, navigate to the DebugView page in the Firebase console for the \"NMDC Field Notes DEV\" project. You should see events being logged in real-time.\n\n\u003e Sometimes, it seems to take a few minutes and/or a page reload for the first events to appear.\n\nIf you use an Android simulator:\n\n```shell\nnpm run dev.android\n```\n\nThere is one extra step required to enable DebugView. Once the simulator is running, run the following command:\n\n```shell\nadb shell setprop debug.firebase.analytics.app org.microbiomedata.fieldnotes.dev\n```\n\nThat must be run each time the Android simulator is started.\n\n### Make a release\n\nCreating a release involves three steps:\n\n- Increment the build number and optionally update the version number\n- Create and distribute a new Android build\n- Create and distribute a new iOS build\n\n#### Incrementing build and version numbers\n\n**Decide**: Are you releasing a new **build** or a new **version**?\n\n\u003cdetails\u003e\n\u003csummary\u003eHow do I choose?\u003c/summary\u003e\n\n- A build release is a new **testing** release of the app. It may be thought of as a release candidate. It implies a new `buildNumber` in `package.json`. This corresponds to a new \"build number\" in [iOS terms](https://help.apple.com/xcode/mac/current/#/devba7f53ad4) or \"versionCode\" in [Android terms](https://developer.android.com/studio/publish/versioning). New builds (of already-released _versions_) do not go through Apple's approval process when released to TestFlight.\n- A version release is a new **general** release of the app. It implies a new `version` number in `package.json` _and_ new `buildNumber`. The commit where these numbers are updated is also tagged. The new `version` corresponds to a new \"version number\" in [iOS terms](https://help.apple.com/xcode/mac/current/#/devba7f53ad4) or \"versionName\" in [Android terms](https://developer.android.com/studio/publish/versioning). There will typically be several build releases before a version release.\n\n\u003c/details\u003e\n\n1. Ensure you are on the main branch and have the latest changes.\n   ```shell\n   git checkout main \u0026\u0026 git pull\n   ```\n2. Update build and (optionally) version numbers.\n   1. If this is a **build** release, run the following commands to increment the build number.\n      ```shell\n      npm run release -- build\n      git push\n      ```\n   2. If this is a **version** release, decide whether the new version will be a patch, minor, or major version. Then, run the following commands to create a new version commit and tag. **NOTE**: During the beta testing period, use only minor or patch versions.\n      ```shell\n      npm run release -- patch  # (or \"minor\" or \"major\")\n      git push --follow-tags\n      ```\n3. If this is a **version** release, check [GitHub Actions](https://github.com/microbiomedata/nmdc-field-notes/actions) to ensure that pushing the version tag triggered the workflow that creates a new GitHub Release. Ensure that the workflow completed successfully.\n\n#### Create and Distribute a new Android Build\n\nIf this is your first time creating an Android build, follow these **one-time** keystore setup instructions before proceeding to the build/distribute instructions below.\n\n\u003cdetails\u003e\n\u003csummary\u003eShow/hide one-time keystore setup instructions\u003c/summary\u003e\n\n1. Obtain two passwords from other developers: the keystore decryption password and the keystore password. Save these securely in a password manager.\n2. Download the encrypted keystore file from NERSC.\n   ```shell\n   scp \u003cuser\u003e@dtn01.nersc.gov:/global/cfs/cdirs/m3408/nmdc-field-notes/android-keystore/org.microbiomedata.fieldnotes.keystore.tar.gz.enc .\n   ```\n3. Decrypt the keystore file into the `android` directory. Enter the keystore decryption password when prompted.\n   ```shell\n   openssl enc -d -aes256 -pbkdf2 -in ./org.microbiomedata.fieldnotes.keystore.tar.gz.enc | tar xz -C ./android\n   ```\n4. Remove the encrypted keystore file.\n   ```shell\n   rm org.microbiomedata.fieldnotes.keystore.tar.gz.enc\n   ```\n\n\u003c/details\u003e\n\n##### Create and Distribute an Android Build via GitHub\n\n1. Build the Android APK file.\n   1. Open the Android project in Android Studio.\n      ```shell\n      ionic capacitor open android\n      ```\n   2. In the toolbar, click `Build` \u003e `Generate Signed App Bundle / APK...`\n   3. Select \"APK\" and click \"Next\"\n   4. Enter the following information and click \"Next\"\n      - Key store path: `\u003cproject root\u003e/android/org.microbiomedata.fieldnotes.keystore`\n      - Key store password: `\u003ckeystore password\u003e`\n      - Key alias: `nmdc field notes`\n      - Key password: `\u003ckeystore password\u003e`\n   5. Select the \"release\" build variant and click \"Create\"\n   6. Wait for the gradle build to complete. Look for notification saying \"Build completed successfully for module 'android.app.main' with 1 build variant.\"\n2. Distribute the APK file via the GitHub Release.\n   1. Make a copy of the APK file with the version and build numbers in the filename.\n      ```shell\n      # Run this from the root directory of the repository:\n      npm run rename.apk\n      ```\n   2. Edit the vX.Y.Z [GitHub Release](https://github.com/microbiomedata/nmdc-field-notes/releases) and attach the `org.microbiomedata.fieldnotes-vX.Y.Z-build.N.apk` file to it. **NOTE**: If this is a **build** release there may be one or more existing APK files attached to the release. This is by design.\n   3. Delete the APK file from your local project root.\n      ```shell\n      # Run this from the root directory of the repository:\n      rm org.microbiomedata.fieldnotes-*.apk\n      ```\n\n##### Create and Distribute an Android Build via Google Play\n\n1. Build the Android AAB file.\n   1. If you haven't already done so, open the Android project in Android Studio.\n      ```shell\n      ionic capacitor open android\n      ```\n   2. In the toolbar, click `Build` \u003e `Generate Signed App Bundle / APK...`\n   3. Select \"**Android App Bundle**\" and click \"Next\".\n   4. Enter the following information and click \"Next\".\n      - Key store path: `\u003cproject root\u003e/android/org.microbiomedata.fieldnotes.keystore`\n      - Key store password: `\u003ckeystore password\u003e`\n      - Key alias: `nmdc field notes`\n      - Key password: `\u003ckeystore password\u003e`\n   5. Select the \"release\" build variant and click \"Create\".\n   6. Wait for the gradle build to complete. Look for notification saying \"App bundle(s) generated successfully for module 'android.app.main' with 0 build variants.\"\n2. Distribute the AAB file via Google Play.\n   1. In your web browser, go to the [Google Play Console](https://play.google.com/console).\n   2. In the Google Play Console, under the \"NMDC Field Notes\" app, go to \"Test and release\" \u003e \"Testing\" \u003e \"**Internal testing**\".\n   3. On the \"Internal testing\" page, click the \"Create new release\" button in the upper right.\n   4. On the \"Create internal testing release\" page, click \"Upload\" and select the Android AAB file you generated earlier.\n      - It will be located at: `android/app/prod/release/app-prod-release.aab`\n      - It can take a minute or two for Google to \"optimize\" the file once uploaded.\n   5. Scroll down to the \"Release details\" section and customize the release name and description.\n      - Release name: Use the format `VERSION (BUILD)` instead of `BUILD (VERSION)`; e.g., use `0.1.0 (10)` instead of `10 (0.1.0)`\n      - Release notes: Replace \"Enter or paste your release notes...\" with any release notes you want to include.\n   6. Click \"Next\".\n   7. On the next page, if you see a warning about there being no \"deobfuscation file\" present, you can disregard that warning.\n   8. Click \"Save and publish\".\n      - In the confirmation dialog that appears, click \"Save and publish\".\n   9. Delete the AAB file from your local project file tree.\n      ```shell\n      # Run this from the root directory of the repository:\n      rm android/app/prod/release/app-prod-release.aab\n      ```\n\n#### Create and Distribute a new iOS Build\n\n\u003e [!NOTE]\n\u003e These instructions are based around distributing via TestFlight for the beta release period. These will be updated later to include App Store distribution once a stable release is ready.\n\n1. Create the iOS build:\n   1. Open the iOS project in Xcode.\n      ```shell\n      ionic capacitor open ios\n      ```\n   2. Select the `App_Prod` scheme by clicking (in the toolbar) `Product` \u003e `Scheme` \u003e `App_Prod`.\n   3. \"[Create an archive of the app](https://developer.apple.com/documentation/xcode/distributing-your-app-for-beta-testing-and-releases#Create-an-archive-of-your-app)\" by clicking (in the toolbar) `Product` \u003e `Archive`\n   4. \"[Select the method of distribution](https://developer.apple.com/documentation/xcode/distributing-your-app-for-beta-testing-and-releases#Select-a-method-for-distribution)\" to be TestFlight \u0026 App Store\n   5. Click the \"Validate App\" button to validate the build with respect to App Store Connect\n   6. Click the \"Distribute App\" button to upload the build to App Store Connect\n   7. Select the `App` scheme by clicking (in the toolbar) `Product` \u003e `Scheme` \u003e `App` (to return to the development scheme).\n2. Distribute the iOS build via TestFlight:\n   1. Log in to [App Store Connect](https://appstoreconnect.apple.com/)\n   2. Go to `Apps` \u003e `NMDC Field Notes` \u003e `TestFlight`\n   3. Under \"iOS Builds,\" find the newly-uploaded build (in the table of all builds)\n   4. If it says \"Missing Compliance\", click \"Manage\", select \"None of the algorithms mentioned above\", and click \"Save\". The words \"Ready to Submit\" will take the place of the \"Missing Compliance\" message.\n   5. In the sidebar, click on one of the tester groups (e.g. NMDC iOS Developers)\n   6. Add the newly-uploaded build to this group (by clicking the `+` button next to \"Builds\"). At this point the people in that tester group will receive an email telling them that a new build is available to test (and that they can get it by opening the TestFlight app).\n   7. Repeat the previous two substeps for the other tester groups.\n\n## License / Copyright\n\nNMDC Field Notes Phone Application (NMDC Field Notes) Copyright (c) 2024, The Regents of the University of California,\nthrough Lawrence Berkeley National Laboratory, and Triad National Security, LLC through Los Alamos National Laboratory (subject\nto receipt of any required approvals from the U.S. Dept. of Energy). All rights reserved.\n\nIf you have questions about your rights to use or distribute this software,\nplease contact Berkeley Lab's Intellectual Property Office at\nIPO@lbl.gov.\n\nNOTICE. This Software was developed under funding from the U.S. Department\nof Energy and the U.S. Government consequently retains certain rights. As\nsuch, the U.S. Government has been granted for itself and others acting on\nits behalf a paid-up, nonexclusive, irrevocable, worldwide license in the\nSoftware to reproduce, distribute copies to the public, prepare derivative\nworks, and perform publicly and display publicly, and to permit others to do so.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicrobiomedata%2Fnmdc-field-notes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmicrobiomedata%2Fnmdc-field-notes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicrobiomedata%2Fnmdc-field-notes/lists"}