Page Not Found | Geo Garden Club
-
+
diff --git a/assets/js/0a1fe8aa.c37a0d9c.js b/assets/js/0a1fe8aa.fdb3c4cc.js
similarity index 52%
rename from assets/js/0a1fe8aa.c37a0d9c.js
rename to assets/js/0a1fe8aa.fdb3c4cc.js
index 46d4c2e15..43fe261f3 100644
--- a/assets/js/0a1fe8aa.c37a0d9c.js
+++ b/assets/js/0a1fe8aa.fdb3c4cc.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkgeogardenclub_github_io=self.webpackChunkgeogardenclub_github_io||[]).push([[8912],{8806:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>s,metadata:()=>a,toc:()=>r});var i=t(5893),o=t(1151);const s={hide_table_of_contents:!1},l="Deployment",a={id:"develop/release-1.0/deployment",title:"Deployment",description:"For the GeoGardenClub project, deployment refers to the process by which a version of the GeoGardenClub app is made available on a physical device such as an Apple or Android phone or tablet.",source:"@site/docs/develop/release-1.0/deployment.md",sourceDirName:"develop/release-1.0",slug:"/develop/release-1.0/deployment",permalink:"/docs/develop/release-1.0/deployment",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{hide_table_of_contents:!1},sidebar:"developSidebar",previous:{title:"Core Value Propositions",permalink:"/docs/develop/release-1.0/cvp"},next:{title:"Testing",permalink:"/docs/develop/release-1.0/testing"}},d={},r=[{value:"Documenting deployment versions",id:"documenting-deployment-versions",level:2},{value:"Deployment management",id:"deployment-management",level:2},{value:"0. Prerequisites",id:"0-prerequisites",level:2},{value:"1. Update the ChangeLog",id:"1-update-the-changelog",level:2},{value:"2. Build the deployment files",id:"2-build-the-deployment-files",level:2},{value:"3. Deploy the iOS app",id:"3-deploy-the-ios-app",level:2},{value:"3. Deploy the Android App",id:"3-deploy-the-android-app",level:2},{value:"Adding new beta testers (iOS)",id:"adding-new-beta-testers-ios",level:2},{value:"Adding new beta testers (Android)",id:"adding-new-beta-testers-android",level:2},{value:"Testing on a physical device without deployment",id:"testing-on-a-physical-device-without-deployment",level:2}];function h(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"deployment",children:"Deployment"}),"\n",(0,i.jsx)(n.p,{children:"For the GeoGardenClub project, deployment refers to the process by which a version of the GeoGardenClub app is made available on a physical device such as an Apple or Android phone or tablet."}),"\n",(0,i.jsx)(n.h2,{id:"documenting-deployment-versions",children:"Documenting deployment versions"}),"\n",(0,i.jsxs)(n.p,{children:["We expect to make many deployments during the Beta release period as we fix bugs or implement enhancements. Each new deployment will require a new version number (specified in the pubspec.yml file), and we will document what has changed in each new version via ",(0,i.jsx)(n.a,{href:"https://github.com/geogardenclub/ggc_app/blob/main/CHANGELOG.md",children:"CHANGELOG.md"}),". To manage version numbers and the changelog file, we will use ",(0,i.jsx)(n.a,{href:"https://pub.dev/packages/cider",children:"Cider"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["We also want to be able to access the ChangeLog inside the deployed app---this is a simple way for users to both know what version of the app they have installed, and what new features or changes they can expect to find in a new version. So, when we do a deployment, the ",(0,i.jsx)(n.code,{children:"run_deploy.sh"})," script will copy the top-level CHANGELOG.md file into the assets/ folder so that it gets included in the various apps."]}),"\n",(0,i.jsx)(n.p,{children:"We will adhere to two standards:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["For the changelog format, we will adhere to ",(0,i.jsx)(n.a,{href:"https://keepachangelog.com/en/1.0.0/",children:"Keep a Changelog"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["For the version number format, we will adhere to ",(0,i.jsx)(n.a,{href:"https://semver.org/spec/v2.0.0.html",children:"Semantic Versioning"}),'. For the beta release, since there is no public "API", the ',(0,i.jsx)(n.em,{children:"major"}),' version will always be "1". The deploy script automatically increments the minor version and increments the build number.']}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"deployment-management",children:"Deployment management"}),"\n",(0,i.jsx)(n.p,{children:'The deployment process is handled by a single developer referred to as the "Deployment Manager" (DM). Initially, Philip will be the DM.'}),"\n",(0,i.jsx)(n.h2,{id:"0-prerequisites",children:"0. Prerequisites"}),"\n",(0,i.jsx)(n.p,{children:"Prior to a deployment, it is good practice to:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Do a ",(0,i.jsx)(n.a,{href:"backups",children:"backup"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Run the integrity checker and resolve any violations."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"1-update-the-changelog",children:"1. Update the ChangeLog"}),"\n",(0,i.jsxs)(n.p,{children:["Invoke ",(0,i.jsx)(n.code,{children:"cider log added "})," to document new additions (or use ",(0,i.jsx)(n.code,{children:"changed"})," or ",(0,i.jsx)(n.code,{children:"fixed"}),") since the last release. Enclose the message in quotes. For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:'cider log added "Terms and Conditions"\n'})}),"\n",(0,i.jsx)(n.h2,{id:"2-build-the-deployment-files",children:"2. Build the deployment files"}),"\n",(0,i.jsxs)(n.p,{children:["Invoke ",(0,i.jsx)(n.code,{children:"./run_deploy.sh"}),". This script does the following:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Invokes ",(0,i.jsx)(n.code,{children:"cider bump minor"})," and ",(0,i.jsx)(n.code,{children:"cider release"})," so that all of the unreleased changes are moved to a new release number, and that release number is recorded in the pubspec.yml."]}),"\n",(0,i.jsx)(n.li,{children:"Commits the updated CHANGELOG.md and pubspec.yml files to GitHub."}),"\n",(0,i.jsxs)(n.li,{children:['Creates a "deploy directory" at ',(0,i.jsx)(n.code,{children:"~/Desktop/ggc-deploy-"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Builds the ggc_app.ipa file and copies it to the deploy directory."}),"\n",(0,i.jsx)(n.li,{children:"Builds the app-release.aab file and copies it to the deploy directory."}),"\n",(0,i.jsx)(n.li,{children:"Gets the release notes for the current release and copies them to the deploy directory."}),"\n",(0,i.jsxs)(n.li,{children:["Invokes ",(0,i.jsx)(n.code,{children:"firebase deploy"})," to build and deploy the web version of the app."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"3-deploy-the-ios-app",children:"3. Deploy the iOS app"}),"\n",(0,i.jsx)(n.p,{children:"First, open the Transporter app and drag the ggc_app.ipa file from the Desktop folder onto the App."}),"\n",(0,i.jsxs)(n.p,{children:["Second, login to ",(0,i.jsx)(n.a,{href:"https://appstoreconnect.apple.com/login",children:"App Store Connect"}),'. Click on "Apps", then "GeoGardenClub", then "TestFlight".']}),"\n",(0,i.jsx)(n.p,{children:"Wait for a few minutes for the uploaded version to become available for distribution via TestFlight."}),"\n",(0,i.jsx)(n.p,{children:'Once available, the "internal" testers will be automatically notified.'}),"\n",(0,i.jsx)(n.p,{children:'To submit the build for external testing, click on "External" on the left sidebar, then click the "+" button next to the "Builds" section, and add the most recent build. It will then be submitted for review. This review appears to take 3-7 days to complete. At that point, the public URL can be distributed and anyone who already installed the app via that link should be able to update to the new build.'}),"\n",(0,i.jsx)(n.h2,{id:"3-deploy-the-android-app",children:"3. Deploy the Android App"}),"\n",(0,i.jsxs)(n.p,{children:["Open the ",(0,i.jsx)(n.a,{href:"https://play.google.com/console/u/0/developers/8896023390666377316/app/4974477500315919596/tracks/internal-testing",children:"Google Play Console Internal Testing Page"}),' and click on "Create new release".']}),"\n",(0,i.jsx)(n.p,{children:"Upload app-release.aab file from the folder containing the newly created release."}),"\n",(0,i.jsx)(n.p,{children:'Once uploaded, click "Next" to go to the Preview and Confirm page. Ensure that everything looks OK, then click "Save and Publish".'}),"\n",(0,i.jsxs)(n.p,{children:["Now go to the ",(0,i.jsx)(n.a,{href:"https://play.google.com/console/u/0/developers/8896023390666377316/app/4974477500315919596/pre-launch-report/overview",children:"Prelaunch Report Overview"})," page. After about an hour, you will be able to check the results of testing on the new version and see if there are any issues that need to be addressed."]}),"\n",(0,i.jsx)(n.h2,{id:"adding-new-beta-testers-ios",children:"Adding new beta testers (iOS)"}),"\n",(0,i.jsx)(n.p,{children:"Previously, we needed the email address they use with their Apple ID in order to add them as an internal tester in App Store Connect."}),"\n",(0,i.jsx)(n.p,{children:"We are now trying to use external testing so that we can simply distribute a URL to anyone who wants to test the app."}),"\n",(0,i.jsx)(n.h2,{id:"adding-new-beta-testers-android",children:"Adding new beta testers (Android)"}),"\n",(0,i.jsx)(n.p,{children:"Currently, we need the gmail address that the user has associated with their Android device so that we can add them as an internal tester."}),"\n",(0,i.jsx)(n.h2,{id:"testing-on-a-physical-device-without-deployment",children:"Testing on a physical device without deployment"}),"\n",(0,i.jsx)(n.p,{children:"Sometimes it is useful to try out the app on a physical device without having to go through deployment steps. Currently only Philip can do this due to iOS signing issues."}),"\n",(0,i.jsx)(n.p,{children:"Here is what you need to do:"}),"\n",(0,i.jsx)(n.p,{children:"First, delete the app from your physical device."}),"\n",(0,i.jsx)(n.p,{children:"Second, connect the physical device to a laptop."}),"\n",(0,i.jsxs)(n.p,{children:["Third, run ",(0,i.jsx)(n.code,{children:"flutter devices"})," to verify that the device shows up. You should see output like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:" % flutter devices \nFound 5 connected devices:\n Philip's iPhone (mobile) \u2022 00008030-000364940A98802E \u2022 ios \u2022 iOS 17.5.1 21F90\n iPhone 11 (mobile) \u2022 8E550E86-3173-4342-B197-A557B83E40A2 \u2022 ios \u2022 com.apple.CoreSimulator.SimRuntime.iOS-17-5\n (simulator)\n macOS (desktop) \u2022 macos \u2022 darwin-arm64 \u2022 macOS 14.4.1 23E224 darwin-arm64\n Mac Designed for iPad (desktop) \u2022 mac-designed-for-ipad \u2022 darwin \u2022 macOS 14.4.1 23E224 darwin-arm64\n Chrome (web) \u2022 chrome \u2022 web-javascript \u2022 Google Chrome 125.0.6422.113\n"})}),"\n",(0,i.jsx)(n.p,{children:"Notice that the first device is my physical device connected to my laptop."}),"\n",(0,i.jsxs)(n.p,{children:["Now, to run the code in release mode on this physical device, you invoke ",(0,i.jsx)(n.code,{children:"flutter run --release"})," and select the physical device like so. (Make sure your device is unlocked while running this command.)"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"% flutter run --release\nConnected devices:\nPhilip's iPhone (mobile) \u2022 00008030-000364940A98802E \u2022 ios \u2022 iOS 17.5.1 21F90\niPhone 11 (mobile) \u2022 8E550E86-3173-4342-B197-A557B83E40A2 \u2022 ios \u2022 com.apple.CoreSimulator.SimRuntime.iOS-17-5\n(simulator)\nmacOS (desktop) \u2022 macos \u2022 darwin-arm64 \u2022 macOS 14.4.1 23E224 darwin-arm64\nMac Designed for iPad (desktop) \u2022 mac-designed-for-ipad \u2022 darwin \u2022 macOS 14.4.1 23E224 darwin-arm64\nChrome (web) \u2022 chrome \u2022 web-javascript \u2022 Google Chrome 125.0.6422.113\n\nChecking for wireless devices...\n\nNo wireless devices were found.\n\n[1]: Philip's iPhone (00008030-000364940A98802E)\n[2]: iPhone 11 (8E550E86-3173-4342-B197-A557B83E40A2)\n[3]: macOS (macos)\n[4]: Mac Designed for iPad (mac-designed-for-ipad)\n[5]: Chrome (chrome)\nPlease choose one (or \"q\" to quit): 1\nLaunching lib/main.dart on Philip's iPhone in release mode...\nAutomatically signing iOS for device deployment using specified development team in Xcode project: 8M69898HLM\nRunning Xcode build... \n \u2514\u2500Compiling, linking and signing... 8.8s\nXcode build done. 67.9s\nInstalling and launching... 7.1s\n\nFlutter run key commands.\nh List all available interactive commands.\nc Clear the screen\nq Quit (terminate the application on the device).\n\n"})})]})}function c(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>l});var i=t(7294);const o={},s=i.createContext(o);function l(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkgeogardenclub_github_io=self.webpackChunkgeogardenclub_github_io||[]).push([[8912],{8806:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>s,metadata:()=>a,toc:()=>r});var i=t(5893),o=t(1151);const s={hide_table_of_contents:!1},l="Deployment",a={id:"develop/release-1.0/deployment",title:"Deployment",description:"For the GeoGardenClub project, deployment refers to the process by which a version of the GeoGardenClub app is made available on a physical device such as an Apple or Android phone or tablet.",source:"@site/docs/develop/release-1.0/deployment.md",sourceDirName:"develop/release-1.0",slug:"/develop/release-1.0/deployment",permalink:"/docs/develop/release-1.0/deployment",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{hide_table_of_contents:!1},sidebar:"developSidebar",previous:{title:"Core Value Propositions",permalink:"/docs/develop/release-1.0/cvp"},next:{title:"Testing",permalink:"/docs/develop/release-1.0/testing"}},d={},r=[{value:"Documenting deployment versions",id:"documenting-deployment-versions",level:2},{value:"Deployment management",id:"deployment-management",level:2},{value:"0. Prerequisites",id:"0-prerequisites",level:2},{value:"1. Update the ChangeLog",id:"1-update-the-changelog",level:2},{value:"2. Build the deployment files",id:"2-build-the-deployment-files",level:2},{value:"3. Deploy the iOS app",id:"3-deploy-the-ios-app",level:2},{value:"3. Deploy the Android App",id:"3-deploy-the-android-app",level:2},{value:"Adding new beta testers (iOS)",id:"adding-new-beta-testers-ios",level:2},{value:"Adding new beta testers (Android)",id:"adding-new-beta-testers-android",level:2},{value:"Testing on a physical device without deployment",id:"testing-on-a-physical-device-without-deployment",level:2}];function h(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"deployment",children:"Deployment"}),"\n",(0,i.jsx)(n.p,{children:"For the GeoGardenClub project, deployment refers to the process by which a version of the GeoGardenClub app is made available on a physical device such as an Apple or Android phone or tablet."}),"\n",(0,i.jsx)(n.h2,{id:"documenting-deployment-versions",children:"Documenting deployment versions"}),"\n",(0,i.jsxs)(n.p,{children:["We expect to make many deployments during the Beta release period as we fix bugs or implement enhancements. Each new deployment will require a new version number (specified in the pubspec.yml file), and we will document what has changed in each new version via ",(0,i.jsx)(n.a,{href:"https://github.com/geogardenclub/ggc_app/blob/main/CHANGELOG.md",children:"CHANGELOG.md"}),". To manage version numbers and the changelog file, we will use ",(0,i.jsx)(n.a,{href:"https://pub.dev/packages/cider",children:"Cider"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["We also want to be able to access the ChangeLog inside the deployed app---this is a simple way for users to both know what version of the app they have installed, and what new features or changes they can expect to find in a new version. So, when we do a deployment, the ",(0,i.jsx)(n.code,{children:"run_deploy.sh"})," script will copy the top-level CHANGELOG.md file into the assets/ folder so that it gets included in the various apps."]}),"\n",(0,i.jsx)(n.p,{children:"We will adhere to two standards:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["For the changelog format, we will adhere to ",(0,i.jsx)(n.a,{href:"https://keepachangelog.com/en/1.0.0/",children:"Keep a Changelog"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["For the version number format, we will adhere to ",(0,i.jsx)(n.a,{href:"https://semver.org/spec/v2.0.0.html",children:"Semantic Versioning"}),'. For the beta release, since there is no public "API", the ',(0,i.jsx)(n.em,{children:"major"}),' version will always be "1". The deploy script automatically increments the minor version and increments the build number.']}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"deployment-management",children:"Deployment management"}),"\n",(0,i.jsx)(n.p,{children:'The deployment process is handled by a single developer referred to as the "Deployment Manager" (DM). Initially, Philip will be the DM.'}),"\n",(0,i.jsx)(n.h2,{id:"0-prerequisites",children:"0. Prerequisites"}),"\n",(0,i.jsx)(n.p,{children:"Prior to a deployment, it is good practice to:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Do a ",(0,i.jsx)(n.a,{href:"backups",children:"backup"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Run the integrity checker and resolve any violations."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"1-update-the-changelog",children:"1. Update the ChangeLog"}),"\n",(0,i.jsxs)(n.p,{children:["Invoke ",(0,i.jsx)(n.code,{children:"cider log added "})," to document new additions (or use ",(0,i.jsx)(n.code,{children:"changed"})," or ",(0,i.jsx)(n.code,{children:"fixed"}),") since the last release. Enclose the message in quotes. For example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-shell",children:'cider log added "Terms and Conditions"\n'})}),"\n",(0,i.jsx)(n.h2,{id:"2-build-the-deployment-files",children:"2. Build the deployment files"}),"\n",(0,i.jsxs)(n.p,{children:["Invoke ",(0,i.jsx)(n.code,{children:"./run_deploy.sh"}),". This script does the following:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Invokes ",(0,i.jsx)(n.code,{children:"cider bump minor"})," and ",(0,i.jsx)(n.code,{children:"cider release"})," so that all of the unreleased changes are moved to a new release number, and that release number is recorded in the pubspec.yml."]}),"\n",(0,i.jsx)(n.li,{children:"Commits the updated CHANGELOG.md and pubspec.yml files to GitHub."}),"\n",(0,i.jsxs)(n.li,{children:['Creates a "deploy directory" at ',(0,i.jsx)(n.code,{children:"~/Desktop/ggc-deploy-"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Builds the ggc_app.ipa file and copies it to the deploy directory."}),"\n",(0,i.jsx)(n.li,{children:"Builds the app-release.aab file and copies it to the deploy directory."}),"\n",(0,i.jsx)(n.li,{children:"Gets the release notes for the current release and copies them to the deploy directory."}),"\n",(0,i.jsxs)(n.li,{children:["Invokes ",(0,i.jsx)(n.code,{children:"firebase deploy"})," to build and deploy the web version of the app."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"3-deploy-the-ios-app",children:"3. Deploy the iOS app"}),"\n",(0,i.jsx)(n.p,{children:"First, open the Transporter app and drag the ggc_app.ipa file from the Desktop folder onto the App."}),"\n",(0,i.jsxs)(n.p,{children:["Second, login to ",(0,i.jsx)(n.a,{href:"https://appstoreconnect.apple.com/login",children:"App Store Connect"}),'. Click on "Apps", then "GeoGardenClub", then "TestFlight".']}),"\n",(0,i.jsx)(n.p,{children:"Wait for a few minutes for the uploaded version to become available for distribution via TestFlight."}),"\n",(0,i.jsx)(n.p,{children:'Once available, the "internal" testers will be automatically notified.'}),"\n",(0,i.jsx)(n.p,{children:'Now submit the build for external testing. Click on "External" on the left sidebar, then click the "+" button next to the "Builds" section, and add the most recent build. It will then be submitted for review. This review appears to take 3-7 days to complete. At that point, the public URL can be distributed and anyone who already installed the app via that link should be able to update to the new build.'}),"\n",(0,i.jsx)(n.h2,{id:"3-deploy-the-android-app",children:"3. Deploy the Android App"}),"\n",(0,i.jsxs)(n.p,{children:["Open the ",(0,i.jsx)(n.a,{href:"https://play.google.com/console/u/0/developers/8896023390666377316/app/4974477500315919596/tracks/internal-testing",children:"Google Play Console Internal Testing Page"}),' and click on "Create new release".']}),"\n",(0,i.jsx)(n.p,{children:"Upload app-release.aab file from the folder containing the newly created release."}),"\n",(0,i.jsx)(n.p,{children:'Once uploaded, click "Next" to go to the Preview and Confirm page. Ensure that everything looks OK, then click "Save and Publish".'}),"\n",(0,i.jsxs)(n.p,{children:["Now go to the ",(0,i.jsx)(n.a,{href:"https://play.google.com/console/u/0/developers/8896023390666377316/app/4974477500315919596/pre-launch-report/overview",children:"Prelaunch Report Overview"})," page. After about an hour, you will be able to check the results of testing on the new version and see if there are any issues that need to be addressed."]}),"\n",(0,i.jsx)(n.p,{children:'Finally, "promote" this version to the "Closed testing" track. This triggers an internal review by Google that takes a few days, but is useful as it results in additional quality assurance testing by Google.'}),"\n",(0,i.jsx)(n.h2,{id:"adding-new-beta-testers-ios",children:"Adding new beta testers (iOS)"}),"\n",(0,i.jsx)(n.p,{children:"Previously, we needed the email address they use with their Apple ID in order to add them as an internal tester in App Store Connect."}),"\n",(0,i.jsx)(n.p,{children:"We are now trying to use external testing so that we can simply distribute a URL to anyone who wants to test the app."}),"\n",(0,i.jsx)(n.h2,{id:"adding-new-beta-testers-android",children:"Adding new beta testers (Android)"}),"\n",(0,i.jsx)(n.p,{children:"Currently, we need the gmail address that the user has associated with their Android device so that we can add them as an internal tester."}),"\n",(0,i.jsx)(n.h2,{id:"testing-on-a-physical-device-without-deployment",children:"Testing on a physical device without deployment"}),"\n",(0,i.jsx)(n.p,{children:"Sometimes it is useful to try out the app on a physical device without having to go through deployment steps. Currently only Philip can do this due to iOS signing issues."}),"\n",(0,i.jsx)(n.p,{children:"Here is what you need to do:"}),"\n",(0,i.jsx)(n.p,{children:"First, delete the app from your physical device."}),"\n",(0,i.jsx)(n.p,{children:"Second, connect the physical device to a laptop."}),"\n",(0,i.jsxs)(n.p,{children:["Third, run ",(0,i.jsx)(n.code,{children:"flutter devices"})," to verify that the device shows up. You should see output like this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:" % flutter devices \nFound 5 connected devices:\n Philip's iPhone (mobile) \u2022 00008030-000364940A98802E \u2022 ios \u2022 iOS 17.5.1 21F90\n iPhone 11 (mobile) \u2022 8E550E86-3173-4342-B197-A557B83E40A2 \u2022 ios \u2022 com.apple.CoreSimulator.SimRuntime.iOS-17-5\n (simulator)\n macOS (desktop) \u2022 macos \u2022 darwin-arm64 \u2022 macOS 14.4.1 23E224 darwin-arm64\n Mac Designed for iPad (desktop) \u2022 mac-designed-for-ipad \u2022 darwin \u2022 macOS 14.4.1 23E224 darwin-arm64\n Chrome (web) \u2022 chrome \u2022 web-javascript \u2022 Google Chrome 125.0.6422.113\n"})}),"\n",(0,i.jsx)(n.p,{children:"Notice that the first device is my physical device connected to my laptop."}),"\n",(0,i.jsxs)(n.p,{children:["Now, to run the code in release mode on this physical device, you invoke ",(0,i.jsx)(n.code,{children:"flutter run --release"})," and select the physical device like so. (Make sure your device is unlocked while running this command.)"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"% flutter run --release\nConnected devices:\nPhilip's iPhone (mobile) \u2022 00008030-000364940A98802E \u2022 ios \u2022 iOS 17.5.1 21F90\niPhone 11 (mobile) \u2022 8E550E86-3173-4342-B197-A557B83E40A2 \u2022 ios \u2022 com.apple.CoreSimulator.SimRuntime.iOS-17-5\n(simulator)\nmacOS (desktop) \u2022 macos \u2022 darwin-arm64 \u2022 macOS 14.4.1 23E224 darwin-arm64\nMac Designed for iPad (desktop) \u2022 mac-designed-for-ipad \u2022 darwin \u2022 macOS 14.4.1 23E224 darwin-arm64\nChrome (web) \u2022 chrome \u2022 web-javascript \u2022 Google Chrome 125.0.6422.113\n\nChecking for wireless devices...\n\nNo wireless devices were found.\n\n[1]: Philip's iPhone (00008030-000364940A98802E)\n[2]: iPhone 11 (8E550E86-3173-4342-B197-A557B83E40A2)\n[3]: macOS (macos)\n[4]: Mac Designed for iPad (mac-designed-for-ipad)\n[5]: Chrome (chrome)\nPlease choose one (or \"q\" to quit): 1\nLaunching lib/main.dart on Philip's iPhone in release mode...\nAutomatically signing iOS for device deployment using specified development team in Xcode project: 8M69898HLM\nRunning Xcode build... \n \u2514\u2500Compiling, linking and signing... 8.8s\nXcode build done. 67.9s\nInstalling and launching... 7.1s\n\nFlutter run key commands.\nh List all available interactive commands.\nc Clear the screen\nq Quit (terminate the application on the device).\n\n"})})]})}function c(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},1151:(e,n,t)=>{t.d(n,{Z:()=>a,a:()=>l});var i=t(7294);const o={},s=i.createContext(o);function l(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:l(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/runtime~main.f74138b1.js b/assets/js/runtime~main.b34191b1.js
similarity index 99%
rename from assets/js/runtime~main.f74138b1.js
rename to assets/js/runtime~main.b34191b1.js
index 391d13d26..c3b534d85 100644
--- a/assets/js/runtime~main.f74138b1.js
+++ b/assets/js/runtime~main.b34191b1.js
@@ -1 +1 @@
-(()=>{"use strict";var e,a,c,f,b,d={},r={};function t(e){var a=r[e];if(void 0!==a)return a.exports;var c=r[e]={exports:{}};return d[e].call(c.exports,c,c.exports,t),c.exports}t.m=d,e=[],t.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i=b)&&Object.keys(t.O).every((e=>t.O[e](c[o])))?c.splice(o--,1):(r=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[c,f,b]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var b=Object.create(null);t.r(b);var d={};a=a||[null,c({}),c([]),c(c)];for(var r=2&f&&e;"object"==typeof r&&!~a.indexOf(r);r=c(r))Object.getOwnPropertyNames(r).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,t.d(b,d),b},t.d=(e,a)=>{for(var c in a)t.o(a,c)&&!t.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,c)=>(t.f[c](e,a),a)),[])),t.u=e=>"assets/js/"+({234:"39838d4e",616:"d0e791fc",814:"95f4d37c",825:"7be5f79d",864:"eac03826",1218:"1be3623c",1320:"b5521830",1420:"6741c1a9",1549:"1506d638",1585:"2450005c",1666:"c401bc0d",1833:"70438708",1937:"49882d99",1974:"2b7e4bbf",2076:"477a2718",2122:"b75ab542",2535:"814f3328",2799:"954aa590",2825:"0f7bf3fd",3014:"4a78ad51",3085:"1f391b9e",3089:"a6aa9e1f",3113:"25003e4f",3170:"5d9c8300",3481:"cd34c441",3560:"17d8eee1",3576:"98dbdb4e",3608:"9e4087bc",3629:"aba21aa0",3844:"772c3429",4e3:"afc29949",4057:"c03baef0",4195:"c4f5d8e4",4345:"2a883cfd",4368:"a94703ab",4524:"e27695c2",4583:"7c110bd0",4713:"bc03b1b7",5014:"38346c4b",5980:"a7456010",6103:"ccc49370",6142:"bebdd554",6265:"906ac375",6378:"7fda5be5",6419:"7d8ebacd",6427:"59628a4d",6504:"53a3e6dc",6800:"2f9db241",6826:"7d4abc73",6906:"9ebba4ea",6974:"af21c641",7222:"0bd3a280",7393:"acecf23e",7414:"393be207",7540:"0f1af657",7664:"reactPlayerPreview",7918:"17896441",7937:"c48bbb24",8277:"8175d4ae",8294:"3463d78f",8518:"a7bd4aaa",8700:"d75fb1fa",8912:"0a1fe8aa",8989:"677c60fa",9208:"36994c47",9268:"ba771284",9278:"975c475b",9586:"3b4579e8",9597:"ccc89dea",9601:"18fc9463",9661:"5e95c892",9866:"11f6a8a1",9929:"1863cff0"}[e]||e)+"."+{234:"c018e484",616:"8f0cc111",814:"ab9703d6",825:"807e3cd0",864:"afeaf968",1218:"db056d99",1320:"4602f9d3",1420:"895932f4",1549:"ef2c1de3",1585:"7802b98f",1666:"ce34a38f",1833:"be451620",1937:"72129c72",1974:"489a3842",2076:"55a76664",2122:"a8ed6914",2535:"ef1127a7",2799:"df28dd9f",2825:"98576b34",3014:"2a4217e6",3085:"1098bfb7",3089:"97675d78",3113:"55d7a4c2",3170:"c81a2e5c",3481:"201ef405",3560:"a2e31f7d",3576:"2344809a",3608:"184caae9",3629:"eb980bea",3844:"b19c2743",4e3:"db1b9cc8",4057:"1f8c690e",4195:"051dcb50",4345:"5fcea617",4368:"fc5d121a",4524:"7fb97173",4583:"7af2e341",4713:"c883eb66",4888:"83111e67",5014:"5c7ac204",5655:"ab3e12ff",5980:"f93cbc61",6103:"3bf98003",6142:"d510be5a",6265:"7a97d3f6",6378:"ad94a555",6419:"fdf4e449",6427:"dea2be0e",6504:"805d7273",6800:"6772b440",6826:"76534341",6906:"76673f88",6974:"02ea1519",7222:"0fafd57c",7393:"4dea44b6",7414:"a0604016",7540:"fb8fd293",7664:"e5a1011e",7918:"c6bf4361",7937:"c8b11591",8040:"f26b8eb2",8277:"fd9f65cc",8294:"086e2690",8518:"3b9b4b09",8700:"5552693c",8912:"c37a0d9c",8989:"1a004c87",9102:"8ff78acc",9208:"203bad01",9268:"8fc5f603",9278:"6f4cd942",9586:"dddaddc9",9597:"02aacb7e",9601:"e6cd124c",9661:"fa791912",9866:"df2bb729",9929:"1dd0adf2"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},b="geogardenclub-github-io:",t.l=(e,a,c,d)=>{if(f[e])f[e].push(a);else{var r,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{r.onerror=r.onload=null,clearTimeout(s);var b=f[e];if(delete f[e],r.parentNode&&r.parentNode.removeChild(r),b&&b.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=l.bind(null,r.onerror),r.onload=l.bind(null,r.onload),o&&document.head.appendChild(r)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={17896441:"7918",70438708:"1833","39838d4e":"234",d0e791fc:"616","95f4d37c":"814","7be5f79d":"825",eac03826:"864","1be3623c":"1218",b5521830:"1320","6741c1a9":"1420","1506d638":"1549","2450005c":"1585",c401bc0d:"1666","49882d99":"1937","2b7e4bbf":"1974","477a2718":"2076",b75ab542:"2122","814f3328":"2535","954aa590":"2799","0f7bf3fd":"2825","4a78ad51":"3014","1f391b9e":"3085",a6aa9e1f:"3089","25003e4f":"3113","5d9c8300":"3170",cd34c441:"3481","17d8eee1":"3560","98dbdb4e":"3576","9e4087bc":"3608",aba21aa0:"3629","772c3429":"3844",afc29949:"4000",c03baef0:"4057",c4f5d8e4:"4195","2a883cfd":"4345",a94703ab:"4368",e27695c2:"4524","7c110bd0":"4583",bc03b1b7:"4713","38346c4b":"5014",a7456010:"5980",ccc49370:"6103",bebdd554:"6142","906ac375":"6265","7fda5be5":"6378","7d8ebacd":"6419","59628a4d":"6427","53a3e6dc":"6504","2f9db241":"6800","7d4abc73":"6826","9ebba4ea":"6906",af21c641:"6974","0bd3a280":"7222",acecf23e:"7393","393be207":"7414","0f1af657":"7540",reactPlayerPreview:"7664",c48bbb24:"7937","8175d4ae":"8277","3463d78f":"8294",a7bd4aaa:"8518",d75fb1fa:"8700","0a1fe8aa":"8912","677c60fa":"8989","36994c47":"9208",ba771284:"9268","975c475b":"9278","3b4579e8":"9586",ccc89dea:"9597","18fc9463":"9601","5e95c892":"9661","11f6a8a1":"9866","1863cff0":"9929"}[e]||e,t.p+t.u(e)},(()=>{var e={1303:0,532:0};t.f.j=(a,c)=>{var f=t.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((c,b)=>f=e[a]=[c,b]));c.push(f[2]=b);var d=t.p+t.u(a),r=new Error;t.l(d,(c=>{if(t.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var b=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;r.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",r.name="ChunkLoadError",r.type=b,r.request=d,f[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,c)=>{var f,b,d=c[0],r=c[1],o=c[2],n=0;if(d.some((a=>0!==e[a]))){for(f in r)t.o(r,f)&&(t.m[f]=r[f]);if(o)var i=o(t)}for(a&&a(c);n{"use strict";var e,a,c,f,b,d={},r={};function t(e){var a=r[e];if(void 0!==a)return a.exports;var c=r[e]={exports:{}};return d[e].call(c.exports,c,c.exports,t),c.exports}t.m=d,e=[],t.O=(a,c,f,b)=>{if(!c){var d=1/0;for(i=0;i=b)&&Object.keys(t.O).every((e=>t.O[e](c[o])))?c.splice(o--,1):(r=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[c,f,b]},t.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return t.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,t.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var b=Object.create(null);t.r(b);var d={};a=a||[null,c({}),c([]),c(c)];for(var r=2&f&&e;"object"==typeof r&&!~a.indexOf(r);r=c(r))Object.getOwnPropertyNames(r).forEach((a=>d[a]=()=>e[a]));return d.default=()=>e,t.d(b,d),b},t.d=(e,a)=>{for(var c in a)t.o(a,c)&&!t.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce(((a,c)=>(t.f[c](e,a),a)),[])),t.u=e=>"assets/js/"+({234:"39838d4e",616:"d0e791fc",814:"95f4d37c",825:"7be5f79d",864:"eac03826",1218:"1be3623c",1320:"b5521830",1420:"6741c1a9",1549:"1506d638",1585:"2450005c",1666:"c401bc0d",1833:"70438708",1937:"49882d99",1974:"2b7e4bbf",2076:"477a2718",2122:"b75ab542",2535:"814f3328",2799:"954aa590",2825:"0f7bf3fd",3014:"4a78ad51",3085:"1f391b9e",3089:"a6aa9e1f",3113:"25003e4f",3170:"5d9c8300",3481:"cd34c441",3560:"17d8eee1",3576:"98dbdb4e",3608:"9e4087bc",3629:"aba21aa0",3844:"772c3429",4e3:"afc29949",4057:"c03baef0",4195:"c4f5d8e4",4345:"2a883cfd",4368:"a94703ab",4524:"e27695c2",4583:"7c110bd0",4713:"bc03b1b7",5014:"38346c4b",5980:"a7456010",6103:"ccc49370",6142:"bebdd554",6265:"906ac375",6378:"7fda5be5",6419:"7d8ebacd",6427:"59628a4d",6504:"53a3e6dc",6800:"2f9db241",6826:"7d4abc73",6906:"9ebba4ea",6974:"af21c641",7222:"0bd3a280",7393:"acecf23e",7414:"393be207",7540:"0f1af657",7664:"reactPlayerPreview",7918:"17896441",7937:"c48bbb24",8277:"8175d4ae",8294:"3463d78f",8518:"a7bd4aaa",8700:"d75fb1fa",8912:"0a1fe8aa",8989:"677c60fa",9208:"36994c47",9268:"ba771284",9278:"975c475b",9586:"3b4579e8",9597:"ccc89dea",9601:"18fc9463",9661:"5e95c892",9866:"11f6a8a1",9929:"1863cff0"}[e]||e)+"."+{234:"c018e484",616:"8f0cc111",814:"ab9703d6",825:"807e3cd0",864:"afeaf968",1218:"db056d99",1320:"4602f9d3",1420:"895932f4",1549:"ef2c1de3",1585:"7802b98f",1666:"ce34a38f",1833:"be451620",1937:"72129c72",1974:"489a3842",2076:"55a76664",2122:"a8ed6914",2535:"ef1127a7",2799:"df28dd9f",2825:"98576b34",3014:"2a4217e6",3085:"1098bfb7",3089:"97675d78",3113:"55d7a4c2",3170:"c81a2e5c",3481:"201ef405",3560:"a2e31f7d",3576:"2344809a",3608:"184caae9",3629:"eb980bea",3844:"b19c2743",4e3:"db1b9cc8",4057:"1f8c690e",4195:"051dcb50",4345:"5fcea617",4368:"fc5d121a",4524:"7fb97173",4583:"7af2e341",4713:"c883eb66",4888:"83111e67",5014:"5c7ac204",5655:"ab3e12ff",5980:"f93cbc61",6103:"3bf98003",6142:"d510be5a",6265:"7a97d3f6",6378:"ad94a555",6419:"fdf4e449",6427:"dea2be0e",6504:"805d7273",6800:"6772b440",6826:"76534341",6906:"76673f88",6974:"02ea1519",7222:"0fafd57c",7393:"4dea44b6",7414:"a0604016",7540:"fb8fd293",7664:"e5a1011e",7918:"c6bf4361",7937:"c8b11591",8040:"f26b8eb2",8277:"fd9f65cc",8294:"086e2690",8518:"3b9b4b09",8700:"5552693c",8912:"fdb3c4cc",8989:"1a004c87",9102:"8ff78acc",9208:"203bad01",9268:"8fc5f603",9278:"6f4cd942",9586:"dddaddc9",9597:"02aacb7e",9601:"e6cd124c",9661:"fa791912",9866:"df2bb729",9929:"1dd0adf2"}[e]+".js",t.miniCssF=e=>{},t.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),t.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},b="geogardenclub-github-io:",t.l=(e,a,c,d)=>{if(f[e])f[e].push(a);else{var r,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{r.onerror=r.onload=null,clearTimeout(s);var b=f[e];if(delete f[e],r.parentNode&&r.parentNode.removeChild(r),b&&b.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=l.bind(null,r.onerror),r.onload=l.bind(null,r.onload),o&&document.head.appendChild(r)}},t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.p="/",t.gca=function(e){return e={17896441:"7918",70438708:"1833","39838d4e":"234",d0e791fc:"616","95f4d37c":"814","7be5f79d":"825",eac03826:"864","1be3623c":"1218",b5521830:"1320","6741c1a9":"1420","1506d638":"1549","2450005c":"1585",c401bc0d:"1666","49882d99":"1937","2b7e4bbf":"1974","477a2718":"2076",b75ab542:"2122","814f3328":"2535","954aa590":"2799","0f7bf3fd":"2825","4a78ad51":"3014","1f391b9e":"3085",a6aa9e1f:"3089","25003e4f":"3113","5d9c8300":"3170",cd34c441:"3481","17d8eee1":"3560","98dbdb4e":"3576","9e4087bc":"3608",aba21aa0:"3629","772c3429":"3844",afc29949:"4000",c03baef0:"4057",c4f5d8e4:"4195","2a883cfd":"4345",a94703ab:"4368",e27695c2:"4524","7c110bd0":"4583",bc03b1b7:"4713","38346c4b":"5014",a7456010:"5980",ccc49370:"6103",bebdd554:"6142","906ac375":"6265","7fda5be5":"6378","7d8ebacd":"6419","59628a4d":"6427","53a3e6dc":"6504","2f9db241":"6800","7d4abc73":"6826","9ebba4ea":"6906",af21c641:"6974","0bd3a280":"7222",acecf23e:"7393","393be207":"7414","0f1af657":"7540",reactPlayerPreview:"7664",c48bbb24:"7937","8175d4ae":"8277","3463d78f":"8294",a7bd4aaa:"8518",d75fb1fa:"8700","0a1fe8aa":"8912","677c60fa":"8989","36994c47":"9208",ba771284:"9268","975c475b":"9278","3b4579e8":"9586",ccc89dea:"9597","18fc9463":"9601","5e95c892":"9661","11f6a8a1":"9866","1863cff0":"9929"}[e]||e,t.p+t.u(e)},(()=>{var e={1303:0,532:0};t.f.j=(a,c)=>{var f=t.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var b=new Promise(((c,b)=>f=e[a]=[c,b]));c.push(f[2]=b);var d=t.p+t.u(a),r=new Error;t.l(d,(c=>{if(t.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var b=c&&("load"===c.type?"missing":c.type),d=c&&c.target&&c.target.src;r.message="Loading chunk "+a+" failed.\n("+b+": "+d+")",r.name="ChunkLoadError",r.type=b,r.request=d,f[1](r)}}),"chunk-"+a,a)}},t.O.j=a=>0===e[a];var a=(a,c)=>{var f,b,d=c[0],r=c[1],o=c[2],n=0;if(d.some((a=>0!==e[a]))){for(f in r)t.o(r,f)&&(t.m[f]=r[f]);if(o)var i=o(t)}for(a&&a(c);nBlog | Geo Garden Club
-
+
diff --git a/blog/2023/02/10/welcome.html b/blog/2023/02/10/welcome.html
index 344d8596b..76a426fa5 100644
--- a/blog/2023/02/10/welcome.html
+++ b/blog/2023/02/10/welcome.html
@@ -5,7 +5,7 @@
Welcome, Geo Garden Club! Aloha, Agile Garden Club! | Geo Garden Club
-
+
diff --git a/blog/archive.html b/blog/archive.html
index 3453015ae..23e0d47e6 100644
--- a/blog/archive.html
+++ b/blog/archive.html
@@ -5,7 +5,7 @@
Archive | Geo Garden Club
-
+
diff --git a/docs/develop.html b/docs/develop.html
index 44703899e..1736d5f96 100644
--- a/docs/develop.html
+++ b/docs/develop.html
@@ -5,7 +5,7 @@
Welcome to the GGC Developers Guide | Geo Garden Club
-
+
diff --git a/docs/develop/milestones.html b/docs/develop/milestones.html
index d2bbb5d63..9e3c87b89 100644
--- a/docs/develop/milestones.html
+++ b/docs/develop/milestones.html
@@ -5,7 +5,7 @@
Milestones | Geo Garden Club
-
+
diff --git a/docs/develop/mockup/chatgpt-feedback.html b/docs/develop/mockup/chatgpt-feedback.html
index 9d1fda898..17a88afa0 100644
--- a/docs/develop/mockup/chatgpt-feedback.html
+++ b/docs/develop/mockup/chatgpt-feedback.html
@@ -5,7 +5,7 @@
ChatGPT feedback | Geo Garden Club
-
+
diff --git a/docs/develop/mockup/customer-feedback.html b/docs/develop/mockup/customer-feedback.html
index 4bd9d9df9..d665f32f9 100644
--- a/docs/develop/mockup/customer-feedback.html
+++ b/docs/develop/mockup/customer-feedback.html
@@ -5,7 +5,7 @@
Customer feedback | Geo Garden Club
-
+
diff --git a/docs/develop/mockup/design.html b/docs/develop/mockup/design.html
index 4a68a9674..a85424e51 100644
--- a/docs/develop/mockup/design.html
+++ b/docs/develop/mockup/design.html
@@ -5,7 +5,7 @@
Design and implementation | Geo Garden Club
-
+
diff --git a/docs/develop/mockup/entrepreneur-feedback.html b/docs/develop/mockup/entrepreneur-feedback.html
index 7a7732394..a32deb2d5 100644
--- a/docs/develop/mockup/entrepreneur-feedback.html
+++ b/docs/develop/mockup/entrepreneur-feedback.html
@@ -5,7 +5,7 @@
Entrepreneur feedback | Geo Garden Club
-
+
diff --git a/docs/develop/onboarding.html b/docs/develop/onboarding.html
index 2b7b23f76..67054de10 100644
--- a/docs/develop/onboarding.html
+++ b/docs/develop/onboarding.html
@@ -5,7 +5,7 @@
Onboarding | Geo Garden Club
-
+
diff --git a/docs/develop/release-1.0/architecture.html b/docs/develop/release-1.0/architecture.html
index c9a147678..8e53a4fa8 100644
--- a/docs/develop/release-1.0/architecture.html
+++ b/docs/develop/release-1.0/architecture.html
@@ -5,7 +5,7 @@
Architecture | Geo Garden Club
-
+
diff --git a/docs/develop/release-1.0/backups.html b/docs/develop/release-1.0/backups.html
index fbdbbf08e..0f582a536 100644
--- a/docs/develop/release-1.0/backups.html
+++ b/docs/develop/release-1.0/backups.html
@@ -5,7 +5,7 @@
Backups | Geo Garden Club
-
+
diff --git a/docs/develop/release-1.0/beta-test-feedback.html b/docs/develop/release-1.0/beta-test-feedback.html
index 8d34b71ee..5721e8149 100644
--- a/docs/develop/release-1.0/beta-test-feedback.html
+++ b/docs/develop/release-1.0/beta-test-feedback.html
@@ -5,7 +5,7 @@
Release 1.0 (Beta) Feedback | Geo Garden Club
-
+
diff --git a/docs/develop/release-1.0/coding-standards.html b/docs/develop/release-1.0/coding-standards.html
index c5b2c3f9c..513855186 100644
--- a/docs/develop/release-1.0/coding-standards.html
+++ b/docs/develop/release-1.0/coding-standards.html
@@ -5,7 +5,7 @@
Coding Standards | Geo Garden Club
-
+
diff --git a/docs/develop/release-1.0/cvp.html b/docs/develop/release-1.0/cvp.html
index 383b9cd4d..75b71a487 100644
--- a/docs/develop/release-1.0/cvp.html
+++ b/docs/develop/release-1.0/cvp.html
@@ -5,7 +5,7 @@
Core Value Propositions | Geo Garden Club
-
+
diff --git a/docs/develop/release-1.0/deployment.html b/docs/develop/release-1.0/deployment.html
index 939ac7702..9fb1c827f 100644
--- a/docs/develop/release-1.0/deployment.html
+++ b/docs/develop/release-1.0/deployment.html
@@ -5,7 +5,7 @@
Deployment | Geo Garden Club
-
+
@@ -46,12 +46,13 @@
3. Depl
Second, login to App Store Connect. Click on "Apps", then "GeoGardenClub", then "TestFlight".
Wait for a few minutes for the uploaded version to become available for distribution via TestFlight.
Once available, the "internal" testers will be automatically notified.
-
To submit the build for external testing, click on "External" on the left sidebar, then click the "+" button next to the "Builds" section, and add the most recent build. It will then be submitted for review. This review appears to take 3-7 days to complete. At that point, the public URL can be distributed and anyone who already installed the app via that link should be able to update to the new build.
+
Now submit the build for external testing. Click on "External" on the left sidebar, then click the "+" button next to the "Builds" section, and add the most recent build. It will then be submitted for review. This review appears to take 3-7 days to complete. At that point, the public URL can be distributed and anyone who already installed the app via that link should be able to update to the new build.
Upload app-release.aab file from the folder containing the newly created release.
Once uploaded, click "Next" to go to the Preview and Confirm page. Ensure that everything looks OK, then click "Save and Publish".
Now go to the Prelaunch Report Overview page. After about an hour, you will be able to check the results of testing on the new version and see if there are any issues that need to be addressed.
+
Finally, "promote" this version to the "Closed testing" track. This triggers an internal review by Google that takes a few days, but is useful as it results in additional quality assurance testing by Google.