{"id":46300376,"url":"https://github.com/privacybydesign/irmamobile","last_synced_at":"2026-05-04T10:04:48.128Z","repository":{"id":43282907,"uuid":"263058889","full_name":"privacybydesign/irmamobile","owner":"privacybydesign","description":"Yivi app for iOS and Android","archived":false,"fork":false,"pushed_at":"2026-04-29T11:33:00.000Z","size":151577,"stargazers_count":114,"open_issues_count":76,"forks_count":28,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-04-29T13:31:41.001Z","etag":null,"topics":["android","app","eudi","identity","ios","irma","wallet","yivi"],"latest_commit_sha":null,"homepage":"https://yivi.app","language":"Dart","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/privacybydesign.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-05-11T14:01:07.000Z","updated_at":"2026-04-22T08:39:46.000Z","dependencies_parsed_at":"2023-09-27T19:14:03.213Z","dependency_job_id":"2cd6437a-92c6-49df-b0ac-b9ebb3902056","html_url":"https://github.com/privacybydesign/irmamobile","commit_stats":null,"previous_names":[],"tags_count":52,"template":false,"template_full_name":null,"purl":"pkg:github/privacybydesign/irmamobile","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/privacybydesign%2Firmamobile","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/privacybydesign%2Firmamobile/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/privacybydesign%2Firmamobile/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/privacybydesign%2Firmamobile/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/privacybydesign","download_url":"https://codeload.github.com/privacybydesign/irmamobile/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/privacybydesign%2Firmamobile/sbom","scorecard":{"id":469678,"data":{"date":"2025-08-11","repo":{"name":"github.com/privacybydesign/irmamobile","commit":"ef7a723aa9f1d846c0910c310c80c5cc5899ff4c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"Code-Review","score":2,"reason":"Found 1/4 approved changesets -- score normalized to 2","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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/delivery.yml:1","Warn: no topLevel permission defined: .github/workflows/status-checks.yml:1","Info: no jobLevel write permissions found"],"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":10,"reason":"no dangerous workflow patterns detected","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":"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:125: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:130: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:134: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:138: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:142: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:146: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:173: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:179: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:200: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:212: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:218: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:237: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:250: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:254: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:258: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:93: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:112: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/delivery.yml:157: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/delivery.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:93: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:113: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:126: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:132: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:150: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:161: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:167: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:186: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:199: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:205: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:210: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:227: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:269: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/status-checks.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/privacybydesign/irmamobile/status-checks.yml/master?enable=pin","Warn: goCommand not pinned by hash: ci_scripts/install_gomobile.sh:12","Info:   0 out of  49 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 goCommand dependencies pinned"],"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":"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":"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":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"Branch-Protection","score":8,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Info: required approving review count is 2 on branch 'master'","Warn: codeowners review is not required on branch 'master'","Info: status check found to merge onto on branch 'master'","Info: PRs are required in order to make changes on 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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 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":1,"reason":"9 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-2rxp-v6pw-ch6m","Warn: Project is vulnerable to: GHSA-4xqq-m2hx-25v8","Warn: Project is vulnerable to: GHSA-5866-49gr-22v4","Warn: Project is vulnerable to: GHSA-r55c-59qm-vjw6","Warn: Project is vulnerable to: GHSA-vg3r-rm7w-2xgh","Warn: Project is vulnerable to: GHSA-vmwr-mc7x-5vc3","Warn: Project is vulnerable to: GHSA-6f62-3596-g6w7","Warn: Project is vulnerable to: GHSA-r995-q44h-hr64","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77"],"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-19T13:31:56.220Z","repository_id":43282907,"created_at":"2025-08-19T13:31:56.220Z","updated_at":"2025-08-19T13:31:56.220Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32602730,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T22:12:39.696Z","status":"online","status_checked_at":"2026-05-04T02:00:06.625Z","response_time":58,"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":["android","app","eudi","identity","ios","irma","wallet","yivi"],"created_at":"2026-03-04T11:03:48.894Z","updated_at":"2026-05-04T10:04:48.123Z","avatar_url":"https://github.com/privacybydesign.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Yivi App\n\n## Authentication made easy, privacy-friendly, and secure\n\nYivi, formerly known as IRMA, offers a privacy-friendly, flexible and secure solution to many authentication problems,\nputting the user in full control over his/her data.\n\nThe Yivi app manages the user's cards containing personal data. It can receive new cards, selectively disclose data contained in the user's cards to others, and\nattaching data to signed statements. These data can be relevant properties, such as: \"I am over 18\", \"my name is\n...\" and \"I am entitled to access ....\". They are only stored on the user's device and nowhere else.\n\n\u003e **_NOTE:_** During the transition period in which we change IRMA to Yivi, it can happen that both names are used interchangeably.\n\n[\u003cimg src=\"https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png\"\n     alt=\"Get it on Google Play\"\n     height=\"80\"\u003e](https://play.google.com/store/apps/details?id=org.irmacard.cardemu)\n[\u003cimg src=\"https://yivi.app/img/app_store.png\"\n     alt=\"Get it on Apple App Store\"\n     height=\"80\"\u003e](https://itunes.apple.com/nl/app/irma-authentication/id1294092994)\n[\u003cimg src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on.png\"\n     alt=\"Get it on F-Droid\"\n     height=\"80\"\u003e](https://f-droid.org/packages/org.irmacard.cardemu/)\n\n\u003cimg src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/1.png\" width=\"200\" alt=\"Screenshot of the Yivi app on Android, showing the introduction screen at the start of the onboarding process\" /\u003e\u0026nbsp;\n\u003cimg src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/2.png\" width=\"200\" alt=\"Screenshot of the Yivi app on Android, showing the home screen with recent activities\" /\u003e\u0026nbsp;\n\u003cimg src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/3.png\" width=\"200\" alt=\"Screenshot of the Yivi app on Android, showing the issue wizard at the point where the user is collecting data\" /\u003e\u0026nbsp;\n\u003cimg src=\"fastlane/metadata/android/en-US/images/phoneScreenshots/4.png\" width=\"200\" alt=\"Screenshot of the Yivi app on Android, showing the issue wizard screen at the point where the user is about to share the collected data\" /\u003e\u0026nbsp;\n\n## Development setup\n\n* Clone the project\n\n      git clone --recursive git@github.com:privacybydesign/irmamobile.git\n\n* If your forgot to include `--recursive` in your `git clone`, make sure to init and update the submodules:\n\n      cd irmamobile\n      git submodule init\n      git submodule update\n\n* Install Java development kit. We recommend to use Java 17.\n\n      # On Debian / Ubuntu\n      apt install openjdk-17-jdk\n\n      # On MacOS\n      brew install openjdk@17\n      flutter config --jdk-dir /opt/homebrew/opt/openjdk@17/libexec/openjdk.jdk/Contents/Home\n\n* Install the Android SDK tools by going to the [Android developer download page](https://developer.android.com/studio/).\n  Make sure to install the build-tools and platform for Android \u003e= 28. In addition\n  to the SDK platform, the following SDK tools need to be installed:\n  * Android SDK Command-line Tools\n  * Android SDK Build-Tools\n  * Android SDK Platform-Tools\n  * NDK\n  * CMake\n\n  If you're using the SDK Manager of Android Studio: you can find specific versions for Build-Tools\n  by enabling the option `Show Package Details`.\n\n* Update your environment. You installed the Android SDK in the previous step, but\n  you will still need to update your `PATH` to make sure you can access the utilities provided and to\n  make sure that flutter keeps working, you will need to export an `ANDROID_HOME` environment\n  variable:\n\n      echo 'export ANDROID_HOME=\"/YOUR/PATH/TO/android-sdk\"' \u003e\u003e \"$HOME/.bashrc\"\n      echo 'export PATH=\"$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH\"' \u003e\u003e \"$HOME/.bashrc\"\n\n* Download Flutter from the [download page](https://flutter.dev/docs/get-started/install) and\n  follow their installation steps. Make sure to update your $PATH again.\n\n* Run `flutter doctor` to see what steps remain to get a fully operational development environment\n  for flutter (this may include accepting the android licenses). At this point you could also\n  download your development environment.\n\n* Install Go from the [Go download page](https://golang.org/dl/) or by using your OS package\n  manager.\n\n* Run `go install golang.org/x/mobile/cmd/gomobile` to install gomobile.\n\n* Run `gomobile init` to initialize gomobile.\n\n* Create the irmagobridge: `./bind_go.sh`.\n\n* Start an emulator or connect a device via USB and run the flutter project: `flutter run` (iOS) or\n  `flutter run --flavor alpha` (Android). You can also use Android Studio or Visual Studio Code for this step.\n  The alpha flavor on Android does not open universal links. If you need to test these, you need to build\n  the beta flavor (`flutter run --flavor beta`). In order to install a beta flavor build, you need to uninstall\n  the Play Store version of the Yivi app. Therefore, it is practical to only do this in a simulator or a dedicated\n  test device. In case you run the flutter project via Android Studio, you can specify the build flavor in the\n  run configuration. On iOS, no custom flavor should be specified.\n\n* You can use `flutter run -t` to run different app configurations, for example run `flutter run -t lib/main_prototypes.dart` to start the app in the prototypes menu.\n\n## Using `just`\nMost important things inside of this project can be controlled using [`just`](https://github.com/casey/just).\nTo see an overview of all available commands and what they do, run:\n\n      just --list\n\nYou can then use them from anywhere in the project.\nFor example to run the Flutter app you can type:\n\n      just run\n\n## JSON serialization code\n\nThis project uses json_serializer. To re-generate serialization code, run `./codegen.sh`\n\n## Integration tests\n_The integration tests are in development, so not all use cases are covered yet._\n\nAs preliminary to run the integration tests, you need a fully configured [irmamobile development setup](#development-setup).\n\nThe tests are located in the `yivi_app` directory, so `cd` into that before continuing.\n\n### Run locally using an iOS/Android simulator\nThe full set of integration tests can be started in the following way:\n\n      # For an iOS testing device/simulator\n      flutter test integration_test/test_all.dart\n      # For an Android testing device/simulator\n      flutter test integration_test/test_all.dart --flavor=alpha\n\nYou can also run the integration tests in a specific test file only. For example:\n\n      flutter test integration_test/issuance_test.dart\n\nNote: `flutter test` also supports directory paths as argument. When doing this, all tests in that particular directory are run.\nHowever, a new build is made for every test file. Running multiple tests in this way takes much more time for that reason.\n\n### Run on Android natively\n\nTo natively run the integration tests on Android, you can use the command below.\n\n      flutter pub get\n      (cd android \u0026\u0026 ./gradlew app:connectedAlphaDebugAndroidTest -Ptarget=`pwd`/../integration_test/test_all.dart)\n\nYou can also manually build APKs for testing using Fastlane.\n\n      bundle exec fastlane android_build_integration_test\n\nThe APKs can be found in `./fastlane/build`. They can be uploaded to services like [Google Firebase](https://flutter.dev/docs/testing/integration-tests#uploading-an-android-apk).\nYou can also run them locally using the following commands:\n\n      adb install ./fastlane/build/app-alpha-debug.apk\n      adb install ./fastlane/build/app-alpha-debug-androidTest.apk\n      adb shell am instrument -w -r foundation.privacybydesign.irmamobile.alpha.test/androidx.test.runner.AndroidJUnitRunner\n\n### Run on iOS natively\n\nTo natively run the integration tests as XCTests on iOS, you can do this using XCode.\n\nAt first, you need to choose which test you want to run. For example, to run the tests in `issuance_test.dart` you execute:\n\n      flutter build ios integration_test/issuance_test.dart --config-only\n\nThe tests can be started by opening the `ios/Runner.xcworkspace` in XCode and then start the tests via Product \u003e Test.\n\nYou can use testing services like [Google Firebase](https://docs.flutter.dev/testing/integration-tests#uploading-xcode-tests) to easily run your tests on physical devices.\nThe testing service of your choice needs to support XCTest (not to be confused with XCUITest).\nYou can make a build for this purpose using Fastlane:\n\n      bundle exec fastlane ios_build_integration_test\n\nThe integration test build should be provisioned with at least a development provisioning profile. More information\nabout how to set the provisioning profile can be found in the [Fastlane documentation](/fastlane/README.md#ios_build_integration_test).\n\nThe generated `./fastlane/build/ios_tests.zip` can be uploaded to Google Firebase.\n\n## Fastlane\nFor build automation we use Fastlane scripting. These scripts are used by our CI tooling (i.e. the GitHub Actions\nworkflows in .github/workflows). Documentation about the Fastlane scripting can be found [here](/fastlane/README.md).\n\n## Troubleshooting\n\n* Have you checked out the two submodules of this repository? If `find ./irma_configuration` is empty, this is the case.\n* If something has changed in the `irmagobridge` or in `irmago` then rerunning `./bind_go.sh` is required.\n* In case you get the warning that the `ndk-bundle` cannot be found, please set the `ANDROID_NDK_HOME`\n  environment variable to the right ndk version directory. These version directories can be found in `$ANDROID_HOME/ndk`.\n  For example, you have to specify `export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/\u003cNDK_VERSION\u003e`.\n  You can also make a symlink in `ANDROID_HOME` by doing\n  `ln -s $ANDROID_HOME/ndk/\u003cNDK_VERSION\u003e $ANDROID_HOME/ndk-bundle`. In here `\u003cNDK_VERSION\u003e` should be replaced\n  with the NDK version you want to use.\n* When you get an error related to `x_cgo_inittls` while running `./bind_go.sh`, you probably use an incorrect version of the Android NDK or your Go version is too old.\n* When the flutter tool cannot find the generated apk after building for Android, the flavor is probably omitted. You need to run `flutter run --flavor alpha` or `flutter run --flavor beta`.\n* When you are working with Windows, you need to manually make a symlink between the configuration folders. You can do this by opening a terminal as administrator and use the following command: `mklink /d .\\android\\app\\src\\main\\assets\\irma_configuration .\\irma_configuration`.\n* When Java jdk version is not compatible: set the jdk version flutter uses with `flutter config --jdk-dir \u003cjdk_dir\u003e`. Version 17 is recommended for this app (don't try to fiddle with gradle versions).\n* When you are building for iOS using XCode and you get `Dart Error: Can't load Kernel binary: Invalid kernel binary format version.`, then likely your Flutter cache is corrupted. You can empty and reload the Flutter cache in the following way:\n```shell\npushd $(which flutter)/../\nrm -rf ./cache\nflutter doctor\nflutter precache --ios\npopd\nflutter pub get\ncd ./ios \u0026\u0026 pod install\n```\n\n## Edit irmago directly\nSometimes it can be useful to directly edit irmago while debugging (do this in the `yivi_core` directory).\n```bash\ngo mod edit -replace github.com/privacybydesign/irmago=\u003cirmago_path_on_your_pc\u003e\ngo mod tidy\n./bind_go.sh\n```\n\nAfter each change in the Go code, you need to rerun `./bind_go.sh` to compile the changes.\nMake sure to never commit the changes in `go.mod` or `go.sum` in this (irmamobile) repository.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprivacybydesign%2Firmamobile","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprivacybydesign%2Firmamobile","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprivacybydesign%2Firmamobile/lists"}