{"id":13771934,"url":"https://github.com/hiredscorelabs/cornell","last_synced_at":"2025-12-14T08:39:17.298Z","repository":{"id":39790879,"uuid":"384136311","full_name":"hiredscorelabs/cornell","owner":"hiredscorelabs","description":"Cornell -  record \u0026 replay mock server","archived":false,"fork":false,"pushed_at":"2024-01-28T14:51:07.000Z","size":3481,"stargazers_count":143,"open_issues_count":1,"forks_count":10,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-09-01T02:38:24.531Z","etag":null,"topics":["mock","python","testing"],"latest_commit_sha":null,"homepage":"https://hiredscorelabs.github.io/cornell/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hiredscorelabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2021-07-08T13:37:30.000Z","updated_at":"2025-08-18T11:15:50.000Z","dependencies_parsed_at":"2024-01-13T00:36:49.355Z","dependency_job_id":"7e901fb0-eda6-4684-9082-e8439e11ae44","html_url":"https://github.com/hiredscorelabs/cornell","commit_stats":{"total_commits":28,"total_committers":8,"mean_commits":3.5,"dds":0.6428571428571428,"last_synced_commit":"77efe6fe7a3df30754f8fe77b7194d1addf2678e"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hiredscorelabs/cornell","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hiredscorelabs%2Fcornell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hiredscorelabs%2Fcornell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hiredscorelabs%2Fcornell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hiredscorelabs%2Fcornell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hiredscorelabs","download_url":"https://codeload.github.com/hiredscorelabs/cornell/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hiredscorelabs%2Fcornell/sbom","scorecard":{"id":465217,"data":{"date":"2025-08-11","repo":{"name":"github.com/hiredscorelabs/cornell","commit":"e9f49fef2dbb75a17424277d4ef66fb07cc58980"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"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":6,"reason":"Found 17/28 approved changesets -- score normalized to 6","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/main.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":"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":"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":"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":"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":"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":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT 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":"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":"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/main.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/hiredscorelabs/cornell/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/hiredscorelabs/cornell/main.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating python:3 to python:3@sha256:50cbf8e58ca53a806b99250b1ba2d16c19433e8c42e7eb4ac4ea924b095e280b","Warn: pipCommand not pinned by hash: Dockerfile:3","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:19","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   2 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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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 19 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":"82 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-c2jc-4fpr-4vhg","Warn: Project is vulnerable to: GHSA-vpf5-82c8-9v36","Warn: Project is vulnerable to: GHSA-whgm-jr23-g3j9","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-cph5-m8f7-6c5x","Warn: Project is vulnerable to: GHSA-wf5p-g6vw-rhxx","Warn: Project is vulnerable to: GHSA-jr5f-v2jv-69x6","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-w8qv-6jwh-64r5","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-7gc6-qh9x-w6h8","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-mf6x-hrgr-658f","Warn: Project is vulnerable to: GHSA-xrh7-m5pp-39r6","Warn: Project is vulnerable to: GHSA-6h5x-7c5m-7cr7","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-cj88-88mr-972w","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-33f9-j839-rf8h","Warn: Project is vulnerable to: GHSA-c36v-fmgq-m8hx","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-qrpm-p2h7-hrv2","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hqhp-5p83-hx96","Warn: Project is vulnerable to: GHSA-3949-f494-cm99","Warn: Project is vulnerable to: GHSA-x7hr-w5r2-h6wg","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-76p7-773f-r4q5","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-g4rg-993r-mgx7","Warn: Project is vulnerable to: GHSA-4rq4-32rv-6wp6","Warn: Project is vulnerable to: GHSA-64g7-mvw6-v9qj","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-w5p7-h5w8-2hfq","Warn: Project is vulnerable to: GHSA-fhg7-m89q-25r3","Warn: Project is vulnerable to: GHSA-hh27-ffr2-f2jc","Warn: Project is vulnerable to: GHSA-rqff-837h-mm52","Warn: Project is vulnerable to: GHSA-8v38-pw62-9cw2","Warn: Project is vulnerable to: GHSA-hgjh-723h-mx2j","Warn: Project is vulnerable to: GHSA-jf5r-8hm2-f872","Warn: Project is vulnerable to: GHSA-hc6q-2mpp-qw7j","Warn: Project is vulnerable to: GHSA-4vvj-4cpr-p986","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"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-19T12:18:49.444Z","repository_id":39790879,"created_at":"2025-08-19T12:18:49.444Z","updated_at":"2025-08-19T12:18:49.444Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27723440,"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-12-14T02:00:11.348Z","response_time":56,"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":["mock","python","testing"],"created_at":"2024-08-03T17:00:57.816Z","updated_at":"2025-12-14T08:39:17.221Z","avatar_url":"https://github.com/hiredscorelabs.png","language":"Python","funding_links":[],"categories":["Mock and Stub"],"sub_categories":[],"readme":"# Cornell: record \u0026 replay mock server\n\n[![Build Status](https://travis-ci.com/hiredscorelabs/cornell.svg?branch=master)](https://app.travis-ci.com/github/hiredscorelabs/cornell)\n[![Python Version](https://img.shields.io/badge/python-3.7%20%7C%203.8%20%7C%203.9-blue)](https://www.python.org/downloads/release/python-390/)\n[![Docker Hub](https://img.shields.io/docker/pulls/hiredscorelabs/cornell.svg)](https://hub.docker.com/r/hiredscorelabs/cornell)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://imgur.com/ShxP4AI.png\" alt=\"Cornell Logo\"\u003e\n\u003c/p\u003e\n\n\n\u003e Cornell makes it dead simple, via its record and replay features to perform end-to-end testing in a fast and isolated testing environment.\n\nWhen your application integrates with multiple web-based services, end-to-end testing is crucial before deploying to production.\nMocking is often a tedious task. It becomes even more tiresome when working with multiple APIs from multiple vendors.\n\n[vcrpy](https://github.com/kevin1024/vcrpy) is an awesome library that records and replays HTTP interactions for unit tests. Its output is saved to reusable \"cassette\" files.\n\nBy wrapping vcrpy with Flask, Cornell provides a lightweight record and replay server that can be easily used during distributed system testing and simulate all HTTP traffic needed for your tests.\n\n## Basic Use Case\n\nWhen you're working with distributed systems, the test client entry point triggers a cascade of events that eventually send HTTP requests to an external server\n\n![System in test](https://imgur.com/OlDNTiD.jpg) \n\nWith Cornell server started, it will act as a proxy (**record mode**) between the outgoing HTTP requests and the external server and will record all relevant interactions.\nOnce interactions are recorded, Cornell can work in replay mode, replacing the external server entirely, short-circuiting the calls and instead, replying back instantly with the previously recorded response.\n\n![System in test](https://imgur.com/ZXTFgaP.jpg) \n\n\n## Installation \n\nTo install from [PyPI](https://pypi.org/project/cornell/), all you need to do is this:\n\n```bash \n  pip install cornell\n```\n\n## Usage\n\n```bash\nUsage: cornell_server.py [OPTIONS]\n\n  Usage Examples: Record mode: `cornell --forward_uri=\"https://remote_server/api\" --record -cd custom_cassette_dir`\n  Replay mode: `cornell -cd custom_cassette_dir\n\nOptions:\n  -h, --host TEXT                 Set listen ip address\n  -p, --port INTEGER\n  -ff, --forward_uri TEXT         Must be provided in case of recording mode\n  - , --record-once / --record-all\n                                  Record each scenario only once, ignore the\n                                  rest\n\n  -r, --record                    Start server in record mode\n  -fp, --fixed-path               Fixed cassettes path. If enabled, Cornell\n                                  will support only one server for recording\n\n  -cd, --cassettes-dir TEXT       Cassettes parent directory, If not\n                                  specified, Cornell parent dir will be used\n\n  -re, --record-errors BOOLEAN    If enabled, Cornell will record erroneous\n                                  responses\n  --help                          Show this message and exit.\n```\n\n## Demo - Full Example\n\n\nStart Cornell in record mode:\n\n```\ncornell -ff https://api.github.com/ --record -cd cassettes\n```\n\nThis will start the server in record-proxy mode on port `9000`, and will forward all requests to `https://api.github.com/`\n\n![Cornell demo](https://imgur.com/ky5NBPf.gif)\n\nWhen cornell is in record mode, it will forward all request to the specified forwarding URL, for example:\n\n```\nrequests.get(\"http://127.0.0.1:9000/github/repos/kevin1024/vcrpy/license\").json()\n```\nor\n```\nrequests.get(\"http://127.0.0.1:9000/github/repos/kevin1024/vcrpy/contents\").json()\n```\n\nor you can browse to the URL using your browser\n\n![Browser](https://imgur.com/GMgF6Cx.gif)\n\nCornell will forward the request to the specified URL and will record both the request and the response.\n\n\nThe yaml cassettes will be recorded to a dedicated directory (by default, `cassettes` in the root dir)\n\nFor example:\n\n![Cassette dir](https://imgur.com/cZExEpu.gif)\n\n\n__Note__\n\n    By default, `cassettes` directory will be created in cornell's root dir and will contain the cassette by destination hierarchy.\n    Use `-cd` to specify custom directory for your cassettes.\n    Mind that `-cd \u003ccustom_dir\u003e should match for both record and replay modes\n\nOnce all the necessary interactions were recorded, stop cornell server using *ctrl+c*.\nOnce stopped, all interactions will be mapped via an auto-generated `index.yaml` file.\n\n__Note__\n\n    In case the `index.yaml` is already present, it will be updated with new interactions. Otherwise, a new file will be created.\n\n__Note__\n\n    Cornell doesn't record interactions with an erroneous response, by default (i.e response with 404, will omitted). If you wish to enable this option, run cornell with --record-errors flag\n\nIn this specific example, we can see that the 2 requests are mapped to the saved cassettes:\n\n![Index file](https://imgur.com/IYjiJx6.gif)\n\n### Start cornell as docker container\n```bash\ndocker run hiredscorelabs/cornell:latest\n```\n\n### Build cornell as docker container\n\n```bash\ndocker build -t cornell .\ndocker run cornell --help\n```\n\nYou will probably need to import cassettes from a local directory from your computer. \nTo do that, use the following command to mount a local directory as a volume in the container.\n\n```bash\ndocker run  -v ~/cassettes:/var/cassettes cornell -cd /var/cassettes\n```\n\nIn some case, you want to use another port with cornell. If you need to do that, you should use\ndocker port mapping as in the following where cornell will listen on port `9020`.\n\n```bash\ndocker run -p 9020:9000 cornell\n```\n\n## Features\n\n### Request Matchers\n\nIn addition to the [vcrpy matchers](https://vcrpy.readthedocs.io/en/latest/configuration.html#request-matching), cornell provides the following custom request matchers:\n\n- [OData](https://www.odata.org/getting-started/basic-tutorial/) request query matcher\n- [SOAP](https://stoplight.io/api-types/soap-api/) request body matcher\n\n\n### Environment Variables\n\nSince Cornell is a testing server it's executed by default with `FLASK_ENV=local`.\nYou can modify this as described in [flask configuration](https://flask.palletsprojects.com/en/2.0.x/config/#configuration-handling)\n\n### Advanced Features\n\nCan be found in the [documentation](https://hiredscorelabs.github.io/cornell/docs/examples/)\n\n## Contributing\n\nYes please! contributions are more than welcome!\n\nPlease follow [PEP8](https://www.python.org/dev/peps/pep-0008/) and the [Python Naming Conventions](https://pep8.org/#prescriptive-naming-conventions)\n\nAdd tests when you're adding new functionality and make sure all the existing tests are happy and green :)\n\nTo set up development environment:\n```sh\n  python -m venv venv\n  source venv/bin/activate\n  make configure\n```\n\n\n## Running Tests\n\nTo run tests, run the following command\n\n```bash\n  python -m venv venv\n  source venv/bin/activate\n  make test\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhiredscorelabs%2Fcornell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhiredscorelabs%2Fcornell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhiredscorelabs%2Fcornell/lists"}