{"id":41249662,"url":"https://github.com/ga4gh/phenopacket-schema","last_synced_at":"2026-01-23T01:33:47.130Z","repository":{"id":30736144,"uuid":"125849553","full_name":"ga4gh/phenopacket-schema","owner":"ga4gh","description":"Repository for the GA4GH phenopacket schema","archived":false,"fork":false,"pushed_at":"2025-11-04T15:49:00.000Z","size":1536,"stargazers_count":90,"open_issues_count":32,"forks_count":31,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-11-11T13:16:27.808Z","etag":null,"topics":["ehr-phenotyping","ga4gh","monarchinitiative","phenopackets","phenotypes","protobuf","schema"],"latest_commit_sha":null,"homepage":"https://phenopacket-schema.readthedocs.io/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ga4gh.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":"CONTRIBUTING.rst","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":"2018-03-19T11:49:19.000Z","updated_at":"2025-09-30T08:45:53.000Z","dependencies_parsed_at":"2023-01-14T17:45:23.826Z","dependency_job_id":"9ff3c4f7-db96-43fa-9422-686bddf34784","html_url":"https://github.com/ga4gh/phenopacket-schema","commit_stats":{"total_commits":698,"total_committers":21,"mean_commits":33.23809523809524,"dds":0.336676217765043,"last_synced_commit":"2037b80083dc47492cfbd667e5027a1e976f49e4"},"previous_names":["phenopackets/phenopacket-schema"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/ga4gh/phenopacket-schema","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ga4gh%2Fphenopacket-schema","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ga4gh%2Fphenopacket-schema/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ga4gh%2Fphenopacket-schema/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ga4gh%2Fphenopacket-schema/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ga4gh","download_url":"https://codeload.github.com/ga4gh/phenopacket-schema/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ga4gh%2Fphenopacket-schema/sbom","scorecard":{"id":730929,"data":{"date":"2025-08-11","repo":{"name":"github.com/phenopackets/phenopacket-schema","commit":"01be197870a616435ee5820d5fba6e88e2783d50"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Maintained","score":3,"reason":"1 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"Code-Review","score":10,"reason":"all changesets reviewed","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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/maven.yml:1","Warn: no topLevel permission defined: .github/workflows/python.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":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: .mvn/wrapper/maven-wrapper.jar:1"],"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":1,"reason":"dependency not pinned by hash detected -- score normalized to 1","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/phenopackets/phenopacket-schema/maven.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/maven.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/phenopackets/phenopacket-schema/maven.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/phenopackets/phenopacket-schema/python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/phenopackets/phenopacket-schema/python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/phenopackets/phenopacket-schema/python.yml/master?enable=pin","Warn: pipCommand not pinned by hash: deploy-python.sh:34","Warn: pipCommand not pinned by hash: deploy-python.sh:38","Warn: pipCommand not pinned by hash: .github/workflows/python.yml:40","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   1 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   3 pipCommand 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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 2.0.0 not signed: https://api.github.com/repos/phenopackets/phenopacket-schema/releases/51781030","Warn: release artifact 1.0.0 not signed: https://api.github.com/repos/phenopackets/phenopacket-schema/releases/21800617","Warn: release artifact 1.0.0-RC4 not signed: https://api.github.com/repos/phenopackets/phenopacket-schema/releases/21586661","Warn: release artifact 2.0.0 does not have provenance: https://api.github.com/repos/phenopackets/phenopacket-schema/releases/51781030","Warn: release artifact 1.0.0 does not have provenance: https://api.github.com/repos/phenopackets/phenopacket-schema/releases/21800617","Warn: release artifact 1.0.0-RC4 does not have provenance: https://api.github.com/repos/phenopackets/phenopacket-schema/releases/21586661"],"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":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":"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":0,"reason":"12 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-230 / GHSA-248v-346w-9cwc","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-cpwx-vrp4-4pq7","Warn: Project is vulnerable to: GHSA-gmj6-6f8f-6699","Warn: Project is vulnerable to: GHSA-h75v-3vvj-5mfj","Warn: Project is vulnerable to: GHSA-q2x7-8rv6-6q7h","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: GHSA-48p4-8xcf-vxj5","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: GHSA-735f-pc8j-v9w8"],"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-22T14:23:02.122Z","repository_id":30736144,"created_at":"2025-08-22T14:23:02.122Z","updated_at":"2025-08-22T14:23:02.122Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28677710,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T01:00:35.747Z","status":"ssl_error","status_checked_at":"2026-01-23T01:00:19.529Z","response_time":144,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["ehr-phenotyping","ga4gh","monarchinitiative","phenopackets","phenotypes","protobuf","schema"],"created_at":"2026-01-23T01:33:47.044Z","updated_at":"2026-01-23T01:33:47.113Z","avatar_url":"https://github.com/ga4gh.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"Phenopacket schema\n==================\n\n|Build Status| |Maven Central| |Documentation|\n\n.. |Build Status| image:: https://travis-ci.org/phenopackets/phenopacket-schema.svg?branch=master\n  :target: https://travis-ci.org/phenopackets/phenopacket-schema\n\n.. |Maven Central| image:: https://maven-badges.herokuapp.com/maven-central/org.phenopackets/phenopacket-schema/badge.svg\n  :target: https://maven-badges.herokuapp.com/maven-central/org.phenopackets/phenopacket-schema\n\n.. |Documentation| image:: https://readthedocs.org/projects/phenopacket-schema/badge/?version=v2\n    :target: https://phenopacket-schema.readthedocs.io/en/v2/?badge=v2\n    :alt: Documentation Status\n\nThis has been produced as part of the `GA4GH`_ `Clinical Phenotype Data Capture Workstream`_ and it merges the existing `GA4GH metadata-schemas`_ work with a more focused model from the `phenopacket-reference-implementation`_.\n\n.. _GA4GH: https://ga4gh.org\n.. _Clinical Phenotype Data Capture Workstream: https://ga4gh-cp.github.io/\n.. _GA4GH metadata-schemas: https://github.com/ga4gh-metadata/metadata-schemas\n.. _phenopacket-reference-implementation: https://github.com/phenopackets/phenopacket-reference-implementation\n\n\nThis is a re-defined version of the original phenopacket with a more individual-centric approach. This new approach was taken in order to simplify the code required to represent and manipulate the data and also better represent this sort of data as it is in day to day use.\n\nDocumentation\n=============\n\nThe core documentation can be found at `Documentation`_\n\nThe documentation in this README is primarily for the users of the phenopacket-schema java library.\n\n.. _Documentation: https://phenopacket-schema.readthedocs.io/en/latest\n\nScope and Purpose\n=================\nThe goal of the phenopacket-schema is to define the phenotypic description of a patient/sample in the context of rare disease or cancer genomic diagnosis. It aims to provide sufficient and shareable information of the data outside of the EHR (Electronic Health Record) with the aim of enabling capturing of sufficient structured data at the point of care by a clinician or clinical geneticist for sharing with other labs or computational analysis of the data in clinical or research environments.\n\nThe schema aims to define a common, limited set of data types which may be composed into more specialised types for data sharing between resources using an agreed upon common schema (as defined in base.proto).\n\nThis common schema has been used to define the 'Phenopacket' which is a catch-all collection of data types, specifically focused on representing rare-disease or cancer samples for both initial data capture and analysis. The phenopacket is designed to be both human and machine-readable, and to inter-operate with the HL7 Fast Healthcare Interoperability Resources Specification (aka FHIR®).  \n\nVersioning\n==========\n\nThe library uses semantic versioning. See https://semver.org for details.\n\nEmail list\n==========\nThere is a low-volume mailing list for announcements about phenopackets at phenopackets@groups.io. More information\nabout this list is available at https://groups.io/g/phenopackets.\n\n\nUsage\n=====\nThe Phenopacket schema is defined using `Protobuf`_ which is `\"a language-neutral, platform-neutral extensible mechanism for serializing structured data\"`.  There are two ways to use this library, firstly using the ``Phenopacket`` as an exchange mechanism, secondly as a schema of basic types on which to build more specialist messages, yet allow for easy interoperability with other resources using the phenopackets schema.\nThe following sections describe how to achieve these two things.\n\n.. _Protobuf: https://developers.google.com/protocol-buffers/\n\nInclude phenopackets into your project\n--------------------------------------\n\n**Java** people can incorporate phenopackets into their code by importing the jar using maven:\n\n.. code:: xml\n\n    \u003cdependency\u003e\n        \u003cgroupId\u003eorg.phenopackets\u003c/groupId\u003e\n        \u003cartifactId\u003ephenopacket-schema\u003c/artifactId\u003e\n        \u003cversion\u003e${phenopacket-schema.version}\u003c/version\u003e\n    \u003c/dependency\u003e\n\n\nUsing phenopackets in **Python** is also straightforward:\n\n.. code:: bash\n\n    pip install phenopackets\n\n\nExchanging Phenopackets directly\n--------------------------------\nExamples on how these can be used can be found in the test directory. There are no explicit relationships defined between fields in the phenopacket (apart from the Pedigree), so it is vital that resources exchanging phenopackets agree on what is valid and what the fields mean in relation to other fields in the phenopacket. For example the ``Phenopacket.genes`` field may be agreed upon as representing the genes for a gene panel in one context, or a set of candidate genes or perhaps a diagnosed causative gene.\n\nJSON/YAML formats\n-----------------\nA Phenopacket can be transformed between the native binary format and JSON using the ``JsonFormat`` class from the ``protobuf-java-util`` library. This will also need to be added to your pom.xml\n\n.. code:: xml\n\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.google.protobuf\u003c/groupId\u003e\n        \u003cartifactId\u003eprotobuf-java-util\u003c/artifactId\u003e\n        \u003cversion\u003e${protobuf.version}\u003c/version\u003e\n    \u003c/dependency\u003e\n\n\n.. code:: bash\n\n    pip install protobuf\n\n\n``protobuf-java-util`` for java and ``protobuf`` for python contain simple utility methods to perform these transformations. Usage is shown here:\n\n.. code-block:: java\n\n    // Transform a Phenopacket into JSON\n    Phenopacket original = TestExamples.rareDiseasePhenopacket();\n\n    String asJson = JsonFormat.printer().print(original);\n    System.out.println(asJson);\n\n    // Convert the JSON back to a Phenopacket\n    Phenopacket.Builder phenoPacketBuilder = Phenopacket.newBuilder();\n    JsonFormat.parser().merge(jsonString, phenoPacketBuilder);\n    Phenopacket fromJson = phenoPacketBuilder.build();\n\n    // Convert the JSON into YAML (using Jackson)\n    JsonNode jsonNodeTree = new ObjectMapper().readTree(jsonString);\n    String yamlPhenopacket = new YAMLMapper().writeValueAsString(jsonNodeTree);\n\n    // Convert the YAML back into JSON (using Jackson)\n    JsonNode jsonNodeTree = new YAMLMapper().readTree(yamlString);\n    String jsonPhenopacket = new ObjectMapper().writeValueAsString(jsonNodeTree);\n\n    // And finally back into a Java object\n    Phenopacket.Builder phenoPacketBuilder2 = Phenopacket.newBuilder();\n    JsonFormat.parser().merge(jsonPhenopacket, phenoPacketBuilder2);\n    Phenopacket fromJson2 = phenoPacketBuilder2.build();\n\n\n.. code-block:: python\n\n    from google.protobuf.json_format import Parse, MessageToJson\n    from google.protobuf.timestamp_pb2 import Timestamp\n    from phenopackets import Phenopacket, Individual, PhenotypicFeature, OntologyClass\n\n    # Parsing phenopackets from json\n    with open('file.json', 'r') as jsfile:\n        phenopacket = Parse(message=Phenopacket(), text=jsfile.read())\n\n    # Writing phenopackets to json\n    with open('file.json', 'w') as jsfile:\n        subject = Individual(id=\"Zaphod\", sex=\"MALE\", date_of_birth=Timestamp(seconds=-123456798))\n        phenotypic_features = [PhenotypicFeature(type=OntologyClass(id=\"HG2G:00001\", label=\"Hoopy\")),\n                               PhenotypicFeature(type=OntologyClass(id=\"HG2G:00002\", label=\"Frood\"))]\n\n        phenopacket = Phenopacket(id=\"PPKT:1\", subject=subject, phenotypic_features=phenotypic_features)\n\n        json = MessageToJson(phenopacket)\n        jsfile.write(json)\n\n\nBuilding new messages from the schema\n-------------------------------------\nThere is an example of how to do this included in the `mme.proto`_ file. Here the Matchmaker Exchange (MME) API has been implemented using the phenopackets schema, defining custom messages as required, but re-using messages from `base.proto`_ where applicable. Using the above example, perhaps the ``Phenopacket.genes`` is a problem as you wish to record not only the gene panels ordered, but also the candidate genes discovered in two separate fields. In this case, a new bespoke message could be created, using the ``Gene`` as a building block.\n\n.. _mme.proto: https://github.com/phenopackets/phenopacket-schema/blob/master/src/test/proto/mme.proto\n.. _base.proto: https://github.com/phenopackets/phenopacket-schema/blob/master/src/main/proto/phenopackets/schema/v1/base.proto\n\nGit Submodules\n==============\nThis repo uses `git submodules`_ to import the `VRS protobuf` implementation. You may need to use the following command after cloning/update\nfor things to build correctly:\n\n.. code:: bash\n\n  $ git submodule update --init --recursive\n\n\n.. _git submodules: https://git-scm.com/book/en/v2/Git-Tools-Submodules\n.. _VRS protobuf: https://github.com/ga4gh/vrs-protobuf\n\nBuilding\n========\nThe project can be built using the awesome `Takari maven wrapper`_ which requires no local maven installation. The only requirement for the build is to have a working java installation and network access.\n\nTo do this ``cd`` to the project root and run the wrapper scripts:\n                                                    \n.. code:: bash\n\n    $ ./mvnw clean install\n\n\nor\n\n.. code:: bash\n\n    $ ./mvnw.cmd clean install\n\n\n.. _Takari maven wrapper: https://github.com/takari/maven-wrapper\n\nSign artefacts for release\n==========================\nThere is a ``release-sign-artifacts`` profile for **Java** which can be triggered with the command\n\n.. code:: bash\n\n    $ ./mvnw clean install -DperformRelease=true\n\n\nThe **Python** artefacts are released by running\n\nTest\n\n.. code:: bash\n\n    $ bash deploy-python.sh release-test\n\n\nProduction\n\n.. code:: bash\n\n    $ bash deploy-python.sh release-prod\n\n\nJava, Python and C++ artefacts\n==============================\nBuilding the project will automatically compile Java, Python and C++ artefacts. The Java jar file can be directly used in any Java project. For Python or C++ the build artefacts can be found at\n\n.. code:: bash\n\n    target/generated-sources/protobuf/python\n\nand\n\n.. code:: bash\n\n    target/generated-sources/protobuf/cpp\n\nOther languages will need to compile the files in ``src/main/proto`` to\ntheir desired language. The protobuf developer site has examples on how\nto do this, e.g `GO`_ or `C#`_. Protobuf also supports a `host of other\nlanguages`_.\n\n.. _GO: https://developers.google.com/protocol-buffers/docs/gotutorial#compiling-your-protocol-buffers\n.. _C#: https://developers.google.com/protocol-buffers/docs/csharptutorial#compiling-your-protocol-buffers\n.. _host of other languages: https://github.com/google/protobuf/tree/v3.7.0#protobuf-runtime-installation\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fga4gh%2Fphenopacket-schema","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fga4gh%2Fphenopacket-schema","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fga4gh%2Fphenopacket-schema/lists"}