{"id":15646991,"url":"https://github.com/mglagola/exptool","last_synced_at":"2025-09-08T07:38:32.123Z","repository":{"id":143879052,"uuid":"120030893","full_name":"mglagola/exptool","owner":"mglagola","description":"📲 Expo cli to help automate expo standalone iOS and Android builds and deployments","archived":false,"fork":false,"pushed_at":"2018-06-30T03:06:22.000Z","size":52,"stargazers_count":47,"open_issues_count":1,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-08-09T05:56:46.473Z","etag":null,"topics":["automation","cli","continous-integration","continuous-delivery","continuous-deployment","continuous-integration","continuous-testing","expo","nodejs","npm","react-native"],"latest_commit_sha":null,"homepage":"https://blog.expo.io/automating-standalone-expo-app-builds-and-deployments-with-fastlane-exp-and-exptool-9b2f5ad0a2cd","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mglagola.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-02-02T21:02:04.000Z","updated_at":"2024-11-30T05:19:45.000Z","dependencies_parsed_at":null,"dependency_job_id":"4d9b90a3-3aa9-47ed-bea4-1bdcf3d22a91","html_url":"https://github.com/mglagola/exptool","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/mglagola/exptool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mglagola%2Fexptool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mglagola%2Fexptool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mglagola%2Fexptool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mglagola%2Fexptool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mglagola","download_url":"https://codeload.github.com/mglagola/exptool/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mglagola%2Fexptool/sbom","scorecard":{"id":639384,"data":{"date":"2025-08-11","repo":{"name":"github.com/mglagola/exptool","commit":"d64d8c397ac802e61ae879acad78f82c59635174"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.3,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 1/18 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"37 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-6chw-6frg-f759","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-rq8g-5pc5-wrhr","Warn: Project is vulnerable to: GHSA-hr2v-3952-633q","Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-qrmc-fj45-qfc2","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-44pw-h2cw-w3vq","Warn: Project is vulnerable to: GHSA-c429-5p7v-vgjp","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-2pr6-76vf-7546","Warn: Project is vulnerable to: GHSA-8j8c-7jfh-h6hx","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-282f-qqgm-c34q","Warn: Project is vulnerable to: GHSA-4xc9-xhrj-v574","Warn: Project is vulnerable to: GHSA-x5rq-j2xg-h7qm","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-4rq4-32rv-6wp6","Warn: Project is vulnerable to: GHSA-64g7-mvw6-v9qj","Warn: Project is vulnerable to: GHSA-2m39-62fm-q8r3","Warn: Project is vulnerable to: GHSA-mf6x-7mm4-x2g7","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T10:15:38.090Z","repository_id":143879052,"created_at":"2025-08-21T10:15:38.090Z","updated_at":"2025-08-21T10:15:38.090Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274152680,"owners_count":25231291,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-08T02:00:09.813Z","response_time":121,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","cli","continous-integration","continuous-delivery","continuous-deployment","continuous-integration","continuous-testing","expo","nodejs","npm","react-native"],"created_at":"2024-10-03T12:16:08.192Z","updated_at":"2025-09-08T07:38:32.096Z","avatar_url":"https://github.com/mglagola.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"Exptool was originally created to help automate standalone expo app builds, but [exp](https://docs.expo.io/versions/latest/guides/exp-cli.html) recently implemented the [necessary](https://github.com/expo/exp/pull/102) [features](https://github.com/expo/exp/pull/103) required to fulfill this goal.\n\n**Exptool is no longer needed to automate expo standalone builds**. Take a look at this [blog post](https://blog.expo.io/automating-standalone-expo-app-builds-and-deployments-with-fastlane-exp-and-exptool-9b2f5ad0a2cd) if you're looking to automate your standalone builds without exptool.\n\n# Exptool 📲\n\n* Exptool was created to help automate [expo standalone](https://docs.expo.io/versions/latest/guides/building-standalone-apps.html) iOS and Android builds and deployments.\n* Exptool + [exp](https://docs.expo.io/versions/latest/guides/exp-cli.html) + [fastlane](https://fastlane.tools) = 🏆🥇.\n  * See [example](#examples) below for more details on how to combine these 💯 tools.\n\n## Getting Started\n\nInstall via npm (or yarn):\n\n```bash\n$ npm install -g exptool\n```\n\n## Usage\n\n```bash\n$ exptool --help\n```\n\n```\n  Usage: exptool [options] [command]\n\n  Expo toolset to help with automation\n\n  Options:\n\n    -V, --version  output the version number\n    -h, --help     output usage information\n\n  Commands:\n\n    check:status [project-dir]                 Checks the build status for a given project. Will exit with non-zero status code if the project is already building\n    wait:build [options] [project-dir]         Wait for active build to complete\n    download:artifact [options] [project-dir]  Downloads the most recent artifact for a given project\n    url:artifact [project-dir]                 Prints the latest url artifact for a given project\n    url:expo [options] [project-dir]           Prints the expo url for a given project and [optional] release channel\n    android:package [project-dir]              Prints the android package name for a given project (reads from app.json)\n    inc:build [project-dir]                    Increments the ios.buildNumber and android.versionCode in app.json\n```\n\n## Examples\n\n#### Blog Posts\n\n* [Automating Standalone Expo App Builds and Deployments with Fastlane, Exp, and Exptool](https://blog.expo.io/automating-standalone-expo-app-builds-and-deployments-with-fastlane-exp-and-exptool-9b2f5ad0a2cd)\n\n#### Wiki\n\n* [Step By Step Example Usage](#step-by-step-example-usage)\n* [Bash Script Example](https://github.com/mglagola/exptool/wiki/Bash-Script-Example)\n* [GitLab CI CD YAML Example](https://github.com/mglagola/exptool/wiki/GitLab-CI-CD-YAML-Example)\n\n## Step By Step Example Usage\n\n_**Note**: The following example is a shortened version of [a longer blog post walkthrough](https://blog.expo.io/automating-standalone-expo-app-builds-and-deployments-with-fastlane-exp-and-exptool-9b2f5ad0a2cd)._\n\nThe following is a sequence of bash commands that, when executed in sequence, will automate your expo iOS and Android standalone app builds and deployments.\n\nYou can run these commands on your local machine, or ideally, **translate these commands to your continuous-integration/continuous-deployment service**. These commands are written to be ran in the same directory as your expo project.\n\nThis is meant to be a guide, so customize it to fit your automation needs!\n\n#### Prerequisites / Notes\n\n* This guide assumes you have [exp](https://docs.expo.io/versions/latest/guides/exp-cli.html) and [fastlane](https://fastlane.tools) installed and understand how to use them!\n* Be conscious of env variables along the way.\n* If you decide to use [fastlane](https://fastlane.tools), the `fastlane deliver` command will only work on macOS.\n\n#### Setup\n\n```bash\n# Install dependencies.\nnpm install\n\n# [Optional] Login to expo using username \u0026 password.\n# You may or may not need to do this depending on your setup.\n# Note the $EXPO_USERNAME and $EXPO_PASSWORD env variables.\nexp login -u $EXPO_USERNAME -p $EXPO_PASSWORD --non-interactive\n```\n\n#### Publish To Expo\n\n```bash\n# Publish `production` release\nexp publish --release-channel production --non-interactive\n```\n\n#### Build Standalone Android APK\n\n```bash\n# Makes sure that there are no active standalone apps being built at this time.\n# Will exit with a non-zero status code if there is an active standalone app already being built.\nexptool check:status \n\n# Start building standalone android build using `production` release channel.\nexp build:android --release-channel production --non-interactive\n\n# Wait for the build to finish, checking its status every 2 mins (timeout is 20 mins).\n# Will exit 0 (success) once the build has successfully been built.\n# Android builds take a little longer in my experience, hence the longer interval and timeout.\nexptool wait:build --interval 120 --timeout 1200\n\n# Download the artifact to current directory as `app.apk`\nexptool download:artifact\n\n# [Optional/Advanced] Use fastlane to upload your current standalone android build.\n# Customize this to fit your needs. Take note of env variables. \n# Check out https://docs.fastlane.tools for more info.\nfastlane supply --package_name \"$(exptool android:package)\" --apk \"app.apk\" --json_key_data \"$JSON_KEY_DATA\" --skip_upload_metadata --skip_upload_images --skip_upload_screenshots\n```\n\n#### Build Standalone iOS IPA\n```bash\n# This section is extremely similar to android steps above,\n# take a look there if you have any questions.\nexptool check:status\nexp build:ios --release-channel production --non-interactive\nexptool wait:build # using default interval \u0026 timeout\nexptool download:artifact\n\n# [Optional/Advanced] Use fastlane to upload your current standalone iOS build to iTunes Connect.\n# set $FASTLANE_PASSWORD=\u003cyour-itunes-connect-password\u003e if you want to skip password prompt.\n# Take note of env variables.\n# Check out https://docs.fastlane.tools for more info.\nfastlane deliver --verbose --ipa \"app.ipa\" --username \"$ITC_EMAIL\" --skip_screenshots --skip_metadata\n```\n\n#### Tear Down\n```bash\n# [Optional] You may or may not need to do this depending on your setup.\nexp logout\n```\n\n## Questions, Issues, Feature Requests\n\nSomething missing? Have a question? Create a pull request or open an issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmglagola%2Fexptool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmglagola%2Fexptool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmglagola%2Fexptool/lists"}