{"id":19763,"name":"pvtrace","description":"Optical ray tracing for luminescent materials and spectral converter photovoltaic devices.","url":"https://github.com/danieljfarrell/pvtrace","last_synced_at":"2026-08-16T18:30:17.347Z","repository":{"id":1283374,"uuid":"1222962","full_name":"danieljfarrell/pvtrace","owner":"danieljfarrell","description":"Optical ray tracing for luminescent materials and spectral converter photovoltaic devices","archived":false,"fork":false,"pushed_at":"2026-07-07T21:50:21.000Z","size":15404,"stargazers_count":108,"open_issues_count":6,"forks_count":96,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-08-13T18:51:59.361Z","etag":null,"topics":["energy","optics","photovoltaics","python","raytracing"],"latest_commit_sha":null,"homepage":"","language":"Python","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/danieljfarrell.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","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,"claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2011-01-05T14:28:41.000Z","updated_at":"2026-08-13T13:53:00.000Z","dependencies_parsed_at":"2026-08-13T17:28:18.744Z","dependency_job_id":null,"html_url":"https://github.com/danieljfarrell/pvtrace","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/danieljfarrell/pvtrace","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danieljfarrell","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/sbom","scorecard":{"id":319921,"data":{"date":"2025-08-11","repo":{"name":"github.com/danieljfarrell/pvtrace","commit":"1f89db30f9f2e3d61a2bd9f5ab1a1742f897ad87"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/30 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":"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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/pythonpackage.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":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":"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/pythonpackage.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/danieljfarrell/pvtrace/pythonpackage.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pythonpackage.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/danieljfarrell/pvtrace/pythonpackage.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction 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":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt: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":"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":-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":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 1 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":2,"reason":"8 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2020-73"],"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-18T01:07:28.942Z","repository_id":1283374,"created_at":"2025-08-18T01:07:28.942Z","updated_at":"2025-08-18T01:07:28.942Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36621835,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-13T02:00:06.325Z","response_time":111,"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"}},"owner":{"login":"danieljfarrell","name":"Daniel","uuid":"112847","kind":"user","description":"","email":"","website":"http://daniel.farrell.name","location":"Cambridge, UK","twitter":null,"company":"Exciton Labs Ltd.","icon_url":"https://avatars.githubusercontent.com/u/112847?u=df47db83f7ca73fd2d50602c29d5a4901e59483f\u0026v=4","repositories_count":71,"last_synced_at":"2024-06-11T15:42:24.584Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/danieljfarrell","funding_links":[],"total_stars":234,"followers":47,"following":25,"created_at":"2022-11-02T19:29:21.523Z","updated_at":"2024-06-11T15:42:31.866Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danieljfarrell","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danieljfarrell/repositories"},"packages":[{"id":11729437,"name":"github.com/danieljfarrell/pvtrace","ecosystem":"go","description":null,"homepage":null,"licenses":"other","normalized_licenses":["Other"],"repository_url":"https://github.com/danieljfarrell/pvtrace","keywords_array":[],"namespace":null,"versions_count":8,"first_release_published_at":"2013-04-20T01:07:22.000Z","latest_release_published_at":"2020-03-02T15:16:52.000Z","latest_release_number":"v2.1.2+incompatible","last_synced_at":"2026-08-15T18:02:04.578Z","created_at":"2025-06-04T10:54:48.935Z","updated_at":"2026-08-15T18:02:04.578Z","registry_url":"https://pkg.go.dev/github.com/danieljfarrell/pvtrace","install_command":"go get github.com/danieljfarrell/pvtrace","documentation_url":"https://pkg.go.dev/github.com/danieljfarrell/pvtrace#section-documentation","metadata":{},"repo_metadata":{"id":1283374,"uuid":"1222962","full_name":"danieljfarrell/pvtrace","owner":"danieljfarrell","description":"Optical ray tracing for luminescent materials and spectral converter photovoltaic devices","archived":false,"fork":false,"pushed_at":"2026-07-07T21:50:21.000Z","size":15404,"stargazers_count":108,"open_issues_count":6,"forks_count":96,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-08-13T18:51:59.361Z","etag":null,"topics":["energy","optics","photovoltaics","python","raytracing"],"latest_commit_sha":null,"homepage":"","language":"Python","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/danieljfarrell.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","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,"claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2011-01-05T14:28:41.000Z","updated_at":"2026-08-13T13:53:00.000Z","dependencies_parsed_at":"2026-08-13T17:28:18.744Z","dependency_job_id":null,"html_url":"https://github.com/danieljfarrell/pvtrace","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/danieljfarrell/pvtrace","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danieljfarrell","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/sbom","scorecard":{"id":319921,"data":{"date":"2025-08-11","repo":{"name":"github.com/danieljfarrell/pvtrace","commit":"1f89db30f9f2e3d61a2bd9f5ab1a1742f897ad87"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/30 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":"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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/pythonpackage.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":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":"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/pythonpackage.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/danieljfarrell/pvtrace/pythonpackage.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pythonpackage.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/danieljfarrell/pvtrace/pythonpackage.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction 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":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt: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":"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":-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":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 1 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":2,"reason":"8 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2020-73"],"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-18T01:07:28.942Z","repository_id":1283374,"created_at":"2025-08-18T01:07:28.942Z","updated_at":"2025-08-18T01:07:28.942Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36621835,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-13T02:00:06.325Z","response_time":111,"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"},"owner_record":{"login":"danieljfarrell","name":"Daniel","uuid":"112847","kind":"user","description":"","email":"","website":"http://daniel.farrell.name","location":"Cambridge, UK","twitter":null,"company":"Exciton Labs Ltd.","icon_url":"https://avatars.githubusercontent.com/u/112847?u=df47db83f7ca73fd2d50602c29d5a4901e59483f\u0026v=4","repositories_count":71,"last_synced_at":"2024-06-11T15:42:24.584Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/danieljfarrell","funding_links":[],"total_stars":234,"followers":47,"following":25,"created_at":"2022-11-02T19:29:21.523Z","updated_at":"2024-06-11T15:42:31.866Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danieljfarrell","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danieljfarrell/repositories"},"tags":[{"name":"2.1.6","sha":"b4b99905fae0f8b16358ca4e229379b6566f6020","kind":"tag","published_at":"2020-11-18T22:54:23.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/2.1.6","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/2.1.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@2.1.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.6/manifests"},{"name":"2.1.5","sha":"de41ef02d4fe579466c715f7419ea94a1b3e0b5c","kind":"tag","published_at":"2020-09-03T17:39:26.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/2.1.5","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/2.1.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@2.1.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.5/manifests"},{"name":"2.1.4","sha":"0f8b112de37a9ad2b6eb0e65aaee4ee1dfe05ffa","kind":"tag","published_at":"2020-09-02T19:18:42.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/2.1.4","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/2.1.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@2.1.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.4/manifests"},{"name":"2.1.3","sha":"e170067893427057150dc2d5aab1b7a6eb6a54b2","kind":"tag","published_at":"2020-08-26T16:50:15.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/2.1.3","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/2.1.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@2.1.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.3/manifests"},{"name":"v2.1.2","sha":"a032cb7d98547c73eba993f036e09380b7ce3060","kind":"commit","published_at":"2020-03-02T15:16:52.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.1.2","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.1.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.1.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.2/manifests"},{"name":"pvtrace-2.1.2","sha":"7af310c5d15d5defa280f2dbef57bd3249b6b45f","kind":"commit","published_at":"2020-03-02T15:11:58.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/pvtrace-2.1.2","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/pvtrace-2.1.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@pvtrace-2.1.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/pvtrace-2.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/pvtrace-2.1.2/manifests"},{"name":"v2.1.1","sha":"5dc18c79c2ecd152a1894a76358f016c3eac9c43","kind":"commit","published_at":"2020-03-02T12:23:20.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.1.1","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.1/manifests"},{"name":"v2.1.0","sha":"435c85eb6109c2d4b98a469ec52f939e107d0657","kind":"commit","published_at":"2020-03-02T01:26:12.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.1.0","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.0/manifests"},{"name":"v2.0.4","sha":"85f93ffe050a12e874017a112170f4d84e141988","kind":"commit","published_at":"2019-06-29T09:56:06.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.0.4","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.0.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.0.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.4/manifests"},{"name":"v2.0.3","sha":"2819b26904f8afa5754a375063149e996ab83bbc","kind":"commit","published_at":"2019-05-27T12:14:36.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.0.3","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.0.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.3/manifests"},{"name":"v2.0.2","sha":"1fad41747929c021819cf7618534bb6f8a33103c","kind":"commit","published_at":"2019-04-22T08:50:34.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.0.2","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.0.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.2/manifests"},{"name":"v2.0.1","sha":"08e11e5574efab24423df757428709744244571d","kind":"commit","published_at":"2019-04-18T18:43:47.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.0.1","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.0.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.1/manifests"},{"name":"v1.4","sha":"080cdad9556ef7c84f6363d51d8502d205d1937b","kind":"commit","published_at":"2019-03-05T20:52:52.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v1.4","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v1.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v1.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.4/manifests"},{"name":"v1.3.1","sha":"056070029c708c3c41871901f3c6a28221272f48","kind":"commit","published_at":"2013-04-20T01:07:22.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v1.3.1","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v1.3.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v1.3.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.3.1/manifests"},{"name":"v1.3","sha":"189929acb9c869be6efe7c34997926c3936948f5","kind":"commit","published_at":"2011-10-20T14:10:43.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v1.3","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v1.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v1.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.3/manifests"},{"name":"v1.2","sha":"a56144b70f6f1963911a7e074a57cd38da1b88c8","kind":"commit","published_at":"2011-10-14T13:01:49.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v1.2","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v1.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v1.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.2/manifests"},{"name":"v1.1","sha":"897180a3a7e57f551c4b3a4ac5c7f4380dbed185","kind":"commit","published_at":"2011-03-16T22:21:59.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v1.1","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v1.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.1/manifests"}]},"repo_metadata_updated_at":"2026-08-13T21:35:07.687Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":5.764254255794306,"dependent_packages_count":5.401293307900869,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":5.582773781847587},"purl":"pkg:golang/github.com/danieljfarrell/pvtrace","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/danieljfarrell/pvtrace","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/danieljfarrell/pvtrace","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/danieljfarrell/pvtrace/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2026-08-06T03:20:06.761Z","issues_count":33,"pull_requests_count":27,"avg_time_to_close_issue":23759703.51851852,"avg_time_to_close_pull_request":17677823.888888888,"issues_closed_count":27,"pull_requests_closed_count":27,"pull_request_authors_count":7,"issue_authors_count":12,"avg_comments_per_issue":3.9393939393939394,"avg_comments_per_pull_request":2.4074074074074074,"merged_pull_requests_count":11,"bot_issues_count":0,"bot_pull_requests_count":5,"past_year_issues_count":1,"past_year_pull_requests_count":2,"past_year_avg_time_to_close_issue":21596393.0,"past_year_avg_time_to_close_pull_request":19468920.5,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":5.0,"past_year_avg_comments_per_pull_request":1.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/issues","maintainers":[{"login":"danieljfarrell","count":22,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/danieljfarrell"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdanieljfarrell%2Fpvtrace/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdanieljfarrell%2Fpvtrace/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdanieljfarrell%2Fpvtrace/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdanieljfarrell%2Fpvtrace/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdanieljfarrell%2Fpvtrace/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fdanieljfarrell%2Fpvtrace/codemeta","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":2278573,"maintainers_count":0,"namespaces_count":838896,"keywords_count":123856,"github":"golang","metadata":{"funded_packages_count":66681,"sync_missing_packages_cursor":{"timestamp":"2026-08-16T00:01:10.066524Z","path":"github.com/stripe/stripe-ruby","version":"v19.5.1-0.20260811230136-fcedaaae31d3+incompatible"},"rate_limit":1},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2026-08-16T05:01:13.361Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}},{"id":2863741,"name":"pvtrace","ecosystem":"pypi","description":"Optical ray tracing for luminescent materials and spectral converter photovoltaic devices.","homepage":"https://github.com/danieljfarrell/pvtrace","licenses":"BSD License","normalized_licenses":["BSD-3-Clause"],"repository_url":"https://github.com/danieljfarrell/pvtrace","keywords_array":["optics","raytracing","photovoltaics","energy"],"namespace":null,"versions_count":11,"first_release_published_at":"2019-04-18T18:45:41.000Z","latest_release_published_at":"2020-11-18T23:07:02.000Z","latest_release_number":"2.1.6","last_synced_at":"2026-08-15T18:00:24.581Z","created_at":"2022-04-10T12:08:56.194Z","updated_at":"2026-08-15T18:00:28.195Z","registry_url":"https://pypi.org/project/pvtrace/","install_command":"pip install pvtrace --index-url https://pypi.org/simple","documentation_url":"https://pvtrace.readthedocs.io/","metadata":{"funding":null,"documentation":null,"classifiers":["Development Status :: 4 - Beta","Intended Audience :: Developers","Intended Audience :: Science/Research","License :: OSI Approved :: BSD License","Programming Language :: Python :: 3.7","Topic :: Scientific/Engineering :: Chemistry","Topic :: Scientific/Engineering :: Physics","Topic :: Scientific/Engineering :: Visualization"],"normalized_name":"pvtrace","project_status":null},"repo_metadata":{"id":1283374,"uuid":"1222962","full_name":"danieljfarrell/pvtrace","owner":"danieljfarrell","description":"Optical ray tracing for luminescent materials and spectral converter photovoltaic devices","archived":false,"fork":false,"pushed_at":"2026-07-07T21:50:21.000Z","size":15404,"stargazers_count":108,"open_issues_count":6,"forks_count":96,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-08-13T18:51:59.361Z","etag":null,"topics":["energy","optics","photovoltaics","python","raytracing"],"latest_commit_sha":null,"homepage":"","language":"Python","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/danieljfarrell.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","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,"claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2011-01-05T14:28:41.000Z","updated_at":"2026-08-13T13:53:00.000Z","dependencies_parsed_at":"2026-08-13T17:28:18.744Z","dependency_job_id":null,"html_url":"https://github.com/danieljfarrell/pvtrace","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/danieljfarrell/pvtrace","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danieljfarrell","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/sbom","scorecard":{"id":319921,"data":{"date":"2025-08-11","repo":{"name":"github.com/danieljfarrell/pvtrace","commit":"1f89db30f9f2e3d61a2bd9f5ab1a1742f897ad87"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/30 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":"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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/pythonpackage.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":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":"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/pythonpackage.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/danieljfarrell/pvtrace/pythonpackage.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pythonpackage.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/danieljfarrell/pvtrace/pythonpackage.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction 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":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt: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":"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":-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":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 1 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":2,"reason":"8 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2020-73"],"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-18T01:07:28.942Z","repository_id":1283374,"created_at":"2025-08-18T01:07:28.942Z","updated_at":"2025-08-18T01:07:28.942Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36621835,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-13T02:00:06.325Z","response_time":111,"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"},"owner_record":{"login":"danieljfarrell","name":"Daniel","uuid":"112847","kind":"user","description":"","email":"","website":"http://daniel.farrell.name","location":"Cambridge, UK","twitter":null,"company":"Exciton Labs Ltd.","icon_url":"https://avatars.githubusercontent.com/u/112847?u=df47db83f7ca73fd2d50602c29d5a4901e59483f\u0026v=4","repositories_count":71,"last_synced_at":"2024-06-11T15:42:24.584Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/danieljfarrell","funding_links":[],"total_stars":234,"followers":47,"following":25,"created_at":"2022-11-02T19:29:21.523Z","updated_at":"2024-06-11T15:42:31.866Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danieljfarrell","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danieljfarrell/repositories"},"tags":[{"name":"2.1.6","sha":"b4b99905fae0f8b16358ca4e229379b6566f6020","kind":"tag","published_at":"2020-11-18T22:54:23.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/2.1.6","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/2.1.6","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@2.1.6","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.6/manifests"},{"name":"2.1.5","sha":"de41ef02d4fe579466c715f7419ea94a1b3e0b5c","kind":"tag","published_at":"2020-09-03T17:39:26.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/2.1.5","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/2.1.5","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@2.1.5","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.5/manifests"},{"name":"2.1.4","sha":"0f8b112de37a9ad2b6eb0e65aaee4ee1dfe05ffa","kind":"tag","published_at":"2020-09-02T19:18:42.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/2.1.4","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/2.1.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@2.1.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.4/manifests"},{"name":"2.1.3","sha":"e170067893427057150dc2d5aab1b7a6eb6a54b2","kind":"tag","published_at":"2020-08-26T16:50:15.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/2.1.3","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/2.1.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@2.1.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/2.1.3/manifests"},{"name":"v2.1.2","sha":"a032cb7d98547c73eba993f036e09380b7ce3060","kind":"commit","published_at":"2020-03-02T15:16:52.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.1.2","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.1.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.1.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.2/manifests"},{"name":"pvtrace-2.1.2","sha":"7af310c5d15d5defa280f2dbef57bd3249b6b45f","kind":"commit","published_at":"2020-03-02T15:11:58.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/pvtrace-2.1.2","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/pvtrace-2.1.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@pvtrace-2.1.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/pvtrace-2.1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/pvtrace-2.1.2/manifests"},{"name":"v2.1.1","sha":"5dc18c79c2ecd152a1894a76358f016c3eac9c43","kind":"commit","published_at":"2020-03-02T12:23:20.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.1.1","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.1.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.1/manifests"},{"name":"v2.1.0","sha":"435c85eb6109c2d4b98a469ec52f939e107d0657","kind":"commit","published_at":"2020-03-02T01:26:12.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.1.0","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.1.0","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.1.0/manifests"},{"name":"v2.0.4","sha":"85f93ffe050a12e874017a112170f4d84e141988","kind":"commit","published_at":"2019-06-29T09:56:06.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.0.4","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.0.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.0.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.4/manifests"},{"name":"v2.0.3","sha":"2819b26904f8afa5754a375063149e996ab83bbc","kind":"commit","published_at":"2019-05-27T12:14:36.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.0.3","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.0.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.0.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.3/manifests"},{"name":"v2.0.2","sha":"1fad41747929c021819cf7618534bb6f8a33103c","kind":"commit","published_at":"2019-04-22T08:50:34.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.0.2","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.0.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.0.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.2/manifests"},{"name":"v2.0.1","sha":"08e11e5574efab24423df757428709744244571d","kind":"commit","published_at":"2019-04-18T18:43:47.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v2.0.1","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v2.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v2.0.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v2.0.1/manifests"},{"name":"v1.4","sha":"080cdad9556ef7c84f6363d51d8502d205d1937b","kind":"commit","published_at":"2019-03-05T20:52:52.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v1.4","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v1.4","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v1.4","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.4","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.4/manifests"},{"name":"v1.3.1","sha":"056070029c708c3c41871901f3c6a28221272f48","kind":"commit","published_at":"2013-04-20T01:07:22.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v1.3.1","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v1.3.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v1.3.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.3.1/manifests"},{"name":"v1.3","sha":"189929acb9c869be6efe7c34997926c3936948f5","kind":"commit","published_at":"2011-10-20T14:10:43.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v1.3","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v1.3","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v1.3","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.3","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.3/manifests"},{"name":"v1.2","sha":"a56144b70f6f1963911a7e074a57cd38da1b88c8","kind":"commit","published_at":"2011-10-14T13:01:49.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v1.2","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v1.2","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v1.2","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.2/manifests"},{"name":"v1.1","sha":"897180a3a7e57f551c4b3a4ac5c7f4380dbed185","kind":"commit","published_at":"2011-03-16T22:21:59.000Z","download_url":"https://codeload.github.com/danieljfarrell/pvtrace/tar.gz/v1.1","html_url":"https://github.com/danieljfarrell/pvtrace/releases/tag/v1.1","dependencies_parsed_at":null,"dependency_job_id":null,"purl":"pkg:github/danieljfarrell/pvtrace@v1.1","tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/tags/v1.1/manifests"}]},"repo_metadata_updated_at":"2026-08-15T18:00:28.195Z","dependent_packages_count":0,"downloads":44,"downloads_period":"last-month","dependent_repos_count":1,"rankings":{"downloads":48.514134230281066,"dependent_repos_count":22.23250655214879,"dependent_packages_count":7.373338280337238,"stargazers_count":7.457168068570572,"forks_count":4.668312913165432,"docker_downloads_count":null,"average":18.049092008900622},"purl":"pkg:pypi/pvtrace","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/pypi/pvtrace","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/pypi/pvtrace","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/pypi/pvtrace/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2026-08-06T03:20:06.761Z","issues_count":33,"pull_requests_count":27,"avg_time_to_close_issue":23759703.51851852,"avg_time_to_close_pull_request":17677823.888888888,"issues_closed_count":27,"pull_requests_closed_count":27,"pull_request_authors_count":7,"issue_authors_count":12,"avg_comments_per_issue":3.9393939393939394,"avg_comments_per_pull_request":2.4074074074074074,"merged_pull_requests_count":11,"bot_issues_count":0,"bot_pull_requests_count":5,"past_year_issues_count":1,"past_year_pull_requests_count":2,"past_year_avg_time_to_close_issue":21596393.0,"past_year_avg_time_to_close_pull_request":19468920.5,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":5.0,"past_year_avg_comments_per_pull_request":1.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/issues","maintainers":[{"login":"danieljfarrell","count":22,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/danieljfarrell"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pvtrace/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pvtrace/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pvtrace/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pvtrace/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pvtrace/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pvtrace/codemeta","maintainers":[{"uuid":"danieljfarrell","login":"danieljfarrell","name":null,"email":null,"url":null,"packages_count":1,"html_url":"https://pypi.org/user/danieljfarrell/","role":null,"created_at":"2023-02-25T02:28:46.995Z","updated_at":"2023-02-25T02:28:46.995Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/danieljfarrell/packages"}],"registry":{"name":"pypi.org","url":"https://pypi.org","ecosystem":"pypi","default":true,"packages_count":928730,"maintainers_count":398737,"namespaces_count":0,"keywords_count":310873,"github":"pypi","metadata":{"funded_packages_count":57928,"rate_limit":2},"icon_url":"https://github.com/pypi.png","created_at":"2022-04-04T15:19:23.364Z","updated_at":"2026-08-16T05:04:53.199Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/namespaces"}}],"commits":{"id":634350,"full_name":"danieljfarrell/pvtrace","default_branch":"master","total_commits":263,"total_committers":8,"total_bot_commits":1,"total_bot_committers":1,"mean_commits":32.875,"dds":0.041825095057034245,"past_year_total_commits":26,"past_year_total_committers":1,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":26.0,"past_year_dds":0.0,"last_synced_at":"2026-08-15T18:00:41.406Z","last_synced_commit":"788d5fffb13ec479a533e29fa4f0e04b7f293f77","created_at":"2023-03-09T08:31:51.536Z","updated_at":"2026-08-15T18:00:41.146Z","committers":[{"name":"danieljfarrell","email":"daniel.james.farrell@gmail.com","login":"danieljfarrell","count":252},{"name":"Daniel Farrell","email":"daniel.farrell@teraview.com","login":null,"count":3},{"name":"achatten","email":"a.chatten@imperial.ac.uk","login":"achatten","count":2},{"name":"LukasHD","email":"user@server.fake","login":"jsibbiso","count":2},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":1},{"name":"dcambie","email":"dario.cambie@mpikg.mpg.de","login":"dcambie","count":1},{"name":"Dario Cambié","email":"d.cambie@tue.nl","login":null,"count":1},{"name":"Daniel J Farrell","email":"daniel.farrell@imperial.ac.uk","login":null,"count":1}],"past_year_committers":[{"name":"danieljfarrell","email":"dan@excitonlabs.com","login":"danieljfarrell","count":26}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-08-16T00:00:07.202Z","repositories_count":6678515,"commits_count":956616636,"contributors_count":40511777,"owners_count":1342939,"committers_count":3317579,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"danieljfarrell/pvtrace","html_url":"https://github.com/danieljfarrell/pvtrace","last_synced_at":"2026-08-06T03:20:06.761Z","status":"error","issues_count":33,"pull_requests_count":27,"avg_time_to_close_issue":23759703.51851852,"avg_time_to_close_pull_request":17677823.888888888,"issues_closed_count":27,"pull_requests_closed_count":27,"pull_request_authors_count":7,"issue_authors_count":12,"avg_comments_per_issue":3.9393939393939394,"avg_comments_per_pull_request":2.4074074074074074,"merged_pull_requests_count":11,"bot_issues_count":0,"bot_pull_requests_count":5,"past_year_issues_count":1,"past_year_pull_requests_count":2,"past_year_avg_time_to_close_issue":21596393.0,"past_year_avg_time_to_close_pull_request":19468920.5,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":5.0,"past_year_avg_comments_per_pull_request":1.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2023-05-09T10:35:08.683Z","updated_at":"2026-08-06T03:20:06.761Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/danieljfarrell%2Fpvtrace/issues","issue_labels_count":{"to-do":7,"pvtrace2.0":4,"help-wanted":2,"pvtrace-2.3":2,"pvtrace-2.2":2,"pvtrace1.4":1},"pull_request_labels_count":{"dependencies":5},"issue_author_associations_count":{"OWNER":19,"NONE":14},"pull_request_author_associations_count":{"CONTRIBUTOR":20,"NONE":4,"OWNER":3},"issue_authors":{"danieljfarrell":19,"jaydeshpande":3,"Qudzu":2,"chrisspen":1,"keithbriggs":1,"tommyflynn13":1,"nro-bot":1,"mamintatarin":1,"peter-spencer":1,"settwi":1,"Simon030":1,"carlotapereira":1},"pull_request_authors":{"dcambie":13,"dependabot[bot]":5,"danieljfarrell":3,"mamintatarin":2,"achatten":2,"lukasHD":1,"jv307":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-08-10T00:00:23.081Z","repositories_count":14797036,"issues_count":28508309,"pull_requests_count":94110849,"authors_count":11427600,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":1},"past_year_pull_request_author_associations_count":{"NONE":2},"past_year_issue_authors":{"mamintatarin":1},"past_year_pull_request_authors":{"mamintatarin":2},"maintainers":[{"login":"danieljfarrell","count":22,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/danieljfarrell"}],"active_maintainers":[]},"events":{"total":{"PullRequestEvent":1,"ForkEvent":2,"WatchEvent":7,"IssueCommentEvent":1,"PushEvent":1},"last_year":{"PullRequestEvent":1,"WatchEvent":2,"IssueCommentEvent":1,"PushEvent":1}},"keywords":["energy","optics","photovoltaics","python","raytracing"],"dependencies":[{"ecosystem":"pypi","filepath":"requirements.txt","sha":null,"kind":"manifest","created_at":"2022-07-16T23:30:57.961Z","updated_at":"2022-07-16T23:30:57.961Z","repository_link":"https://github.com/danieljfarrell/pvtrace/blob/master/requirements.txt","dependencies":[{"id":239688455,"package_name":"anytree","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":239688456,"package_name":"meshcat","ecosystem":"pypi","requirements":"\u003e=0.0.16","direct":true,"kind":"runtime","optional":false},{"id":239688457,"package_name":"numpy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":239688458,"package_name":"pandas","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":239688459,"package_name":"trimesh","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"requirements_dev.txt","sha":null,"kind":"manifest","created_at":"2022-07-16T23:30:58.127Z","updated_at":"2022-07-16T23:30:58.127Z","repository_link":"https://github.com/danieljfarrell/pvtrace/blob/master/requirements_dev.txt","dependencies":[{"id":239688773,"package_name":"anytree","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":239688774,"package_name":"meshcat","ecosystem":"pypi","requirements":"\u003e=0.0.16","direct":true,"kind":"runtime","optional":false},{"id":239688775,"package_name":"numpy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":239688776,"package_name":"trimesh","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":239688777,"package_name":"jupyter","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":239688778,"package_name":"matplotlib","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":239688779,"package_name":"pandas","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":239688780,"package_name":"pytest","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"setup.py","sha":null,"kind":"manifest","created_at":"2022-07-16T23:30:58.237Z","updated_at":"2022-07-16T23:30:58.237Z","repository_link":"https://github.com/danieljfarrell/pvtrace/blob/master/setup.py","dependencies":[{"id":239690736,"package_name":"numpy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/pythonpackage.yml","sha":null,"kind":"manifest","created_at":"2026-08-13T17:28:18.608Z","updated_at":"2026-08-13T17:28:18.608Z","repository_link":"https://github.com/danieljfarrell/pvtrace/blob/master/.github/workflows/pythonpackage.yml","dependencies":[{"id":26096161283,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":26096161284,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false}]}],"score":10.644281386563426,"created_at":"2023-09-11T14:52:06.961Z","updated_at":"2026-08-16T18:30:17.362Z","avatar_url":"https://github.com/danieljfarrell.png","language":"Python","category":"Renewable Energy","sub_category":"Photovoltaics and Solar Energy","monthly_downloads":44,"total_dependent_repos":1,"total_dependent_packages":0,"readme":"[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.592982.svg)](https://doi.org/10.5281/zenodo.592982)\n\n![](https://raw.githubusercontent.com/danieljfarrell/pvtrace/master/mkdocs/docs/static/logo.png)\n\n\u003e Optical ray tracing for luminescent materials and spectral converter photovoltaic devices\n\n# Ray-tracing luminescent solar concentrators\n\n*pvtrace* is a statistical photon path tracer written in Python. Rays are followed through a 3D scene and their interactions with objects are recorded to build up statistical information about energy flow.\n\nThis is useful in photovoltaics and non-imaging optics where the goal is to design systems which efficiently transport light to target locations. \n\nOne of its key features is the ability to simulate re-absorption in luminescent materials. For example, like in devices like Luminescent Solar Concentrators (LSCs).\n\nA basic LSC can be simulated and visualised in five lines of code,\n\n```python\nfrom pvtrace import *\nlsc = LSC((5.0, 5.0, 1.0))  # size in cm\nlsc.show()                  # open visualiser\nlsc.simulate(100)           # emit 100 rays\nlsc.report()                # print report\n```\n\nThis script will render the ray-tracing in real time.\n\nFor much larger simulations pvtrace now ships a **compiled ray-tracing engine** which traces the same physics in native, multi-threaded code — hundreds of times faster — and **pvtrace studio**, a browser app for building scenes and exploring results. See [Fast ray tracing](#fast-ray-tracing) and [pvtrace studio](#pvtrace-studio) below.\n\npvtrace has been validate against three other luminescent concentrator codes. For full details see [Validation.ipynb](https://github.com/danieljfarrell/pvtrace/blob/master/examples/Validation.ipynb) notebook\n\n![](https://raw.githubusercontent.com/danieljfarrell/pvtrace/master/examples/Validation.png)\n\n# Install\n\n*pvtrace* needs Python 3.10 or later.\n\n## Using pyenv (MacOS, Linux)\n\nCreate a clean virtual environment using [pyenv](https://github.com/pyenv/pyenv) and install from PyPI,\n\n    pyenv install 3.12.4\n    pyenv virtualenv 3.12.4 pvtrace-env\n    pyenv activate pvtrace-env\n    pip install pvtrace\n\n## Using conda (Windows, Linux, MacOS)\n\n    conda create --name pvtrace-env python=3.12\n    conda activate pvtrace-env\n    pip install pvtrace\n\nThis gives you the photon path tracer, the Python API and the `pvtrace-cli` command line tool. To go faster, or to use the studio app, read on.\n\n## The fast engine\n\nThe compiled engine is built from source because it needs a C compiler. On MacOS install OpenMP first,\n\n    brew install libomp\n\nThen clone the repository, install the build dependencies and build the kernel,\n\n    git clone https://github.com/danieljfarrell/pvtrace.git\n    cd pvtrace\n    pip install -e \".[engine]\"\n    python -m pvtrace.engine.build\n\nCheck that it worked,\n\n    python -c \"import pvtrace.engine as e; print(e.is_available())\"\n\n## pvtrace studio\n\nStudio is the browser app for building scenes and exploring results. It needs the fast engine (above) plus a few extra packages,\n\n    pip install -e \".[studio]\"\n\n# Run the example script and notebooks\n\nDownload the [hello_world.py](https://raw.githubusercontent.com/danieljfarrell/pvtrace/master/examples/hello_world.py) example script either manually or using `curl`,\n\n    # Download example script\n    curl https://raw.githubusercontent.com/danieljfarrell/pvtrace/master/examples/hello_world.py \u003e hello_world.py\n\nNow active your python environment! \n\nIf you installed using **pyenv** do the following,\n\n    pyenv local pvtrace-env\n\nIf you are using **conda** to this,\n\n    conda activate pvtrace-env\n\nNow start the meshcat server with the command,\n\n    meshcat-server\n\nThis will print information like,\n\n    zmq_url=tcp://127.0.0.1:6000\n    web_url=http://127.0.0.1:7000/static/\n\nOpen a new terminal window and again activate your pvtrace-env.\n\nOpen `hello_world.py` and make sure the line below has `zmq_url` of your meshcat-server,\n\n    # Change zmq_url here to be the address of your meshcat-server!\n    renderer = MeshcatRenderer(\n        zmq_url=\"tcp://127.0.0.1:6000\", wireframe=True, open_browser=True\n    )   \n\nYou can now run pvtrace scripts! Run this following command,\n\n    python hello_world.py\n\nAlso take a look at the online Jupyter notebook tutorial series which provide an overview of pvtrace and examples,\n\n 1. [Quick Start.ipynb](https://github.com/danieljfarrell/pvtrace/blob/master/examples/001%20Quick%20Start.ipynb), an interactive ray-tracing tutorial (download an run locally)\n 2. [Materials.ipynb](https://github.com/danieljfarrell/pvtrace/blob/master/examples/002%20Materials.ipynb), include physical properties with materials\n 3. [Lights.ipynb](https://github.com/danieljfarrell/pvtrace/blob/master/examples/003%20Lights.ipynb), place photon sources in the scene and customise their properties\n 4. [Nodes.ipynb](https://github.com/danieljfarrell/pvtrace/blob/master/examples/004%20Nodes.ipynb) translate and rotate scene objects with nodes\n 5. [Geometry.ipynb](https://github.com/danieljfarrell/pvtrace/blob/master/examples/005%20Geometry.ipynb) define the shapes of objects in your scene\n 6. [Coatings.ipynb](https://github.com/danieljfarrell/pvtrace/blob/master/examples/006%20Coatings.ipynb) introduce custom reflections with coatings\n\nDownload and run these notebooks locally for a more interactive experience, but first install jupyter,\n\n    pip install jupyter\n\nor with conda,\n\n    conda install jupyter\n\nThen launch the jupyter notebook,\n\n    jupyter notebook\n\n# Fast ray tracing\n\nThe original photon tracer follows one ray at a time in Python. The compiled engine traces the same physics — the same absorption, emission and Fresnel events — in native code across all of your CPU cores. For scenes built from boxes, spheres and cylinders it is hundreds of times faster.\n\n```python\nimport time\nimport functools\nimport numpy as np\nfrom pvtrace import *\nfrom pvtrace.algorithm import photon_tracer\nimport pvtrace.engine as engine\n\n# A glass sphere floating in air\nworld = Node(name=\"world\", geometry=Sphere(radius=10.0, material=Material(refractive_index=1.0)))\nsphere = Node(name=\"sphere\", geometry=Sphere(radius=1.0, material=Material(refractive_index=1.5)), parent=world)\nsphere.location = (0, 0, 2)\nlight = Node(name=\"light\", light=Light(direction=functools.partial(cone, np.pi / 8)), parent=world)\nscene = Scene(world)\n\n# The photon path tracer: one ray at a time in Python\ntic = time.time()\nfor ray in scene.emit(1000):\n    photon_tracer.follow(scene, ray)\nprint(f\"python tracer: {1000 / (time.time() - tic):\u003e10,.0f} rays/s\")\n\n# The compiled engine: the same scene, traced in native code\nresult = engine.simulate(scene, 1_000_000)\nprint(f\"engine:        {1_000_000 / result.elapsed:\u003e10,.0f} rays/s\")\n```\n\nOn a laptop this prints something like,\n\n    python tracer:      1,800 rays/s\n    engine:           460,000 rays/s\n\nabout 250 times faster, and larger scenes reach millions of rays per second (see `benchmarks/benchmark_engine.py`).\n\nRather than storing every ray, the engine tallies statistics on the surfaces and volumes you care about using *recorders*,\n\n```python\nfrom pvtrace.engine import Recorder, Histogram\n\n# Record the spectrum of rays leaving the scene\nworld.recorders = [\n    Recorder(\"escaped\", event=\"exit\", histograms=[Histogram(\"wavelength\", 400, 800, 40)])\n]\nresult = engine.simulate(scene, 1_000_000)\nescaped = result.recorders[\"escaped\"]\nprint(escaped.rays, \"rays escaped, mean wavelength\", round(escaped.mean(\"wavelength\"), 1), \"nm\")\n```\n\nThe compiled engine understands the subset of pvtrace that the scene description language can express: box, sphere and cylinder shapes, Fresnel and null surfaces, and absorber, scatterer, luminophore and reactor components. Scenes that use meshes or custom Python surfaces fall back to the photon path tracer automatically.\n\n# Command line interface\n\nScenes can be described in a YAML file and traced without writing any Python. Save this as `scene.yml`,\n\n```yaml\nversion: \"1.0\"\nnodes:\n  world:\n    sphere:\n      radius: 10.0\n      material:\n        refractive-index: 1.0\n  ball-lens:\n    location: [0, 0, 2]\n    sphere:\n      radius: 1.0\n      material:\n        refractive-index: 1.5\n  green-laser:\n    light:\n      wavelength: 555\n      mask:\n        direction:\n          cone:\n            half-angle: 22.5\n```\n\nTrace it and query the results,\n\n    # Trace the scene; results are written to scene.sqlite3\n    pvtrace-cli simulate scene.yml\n\n    # How many rays entered the lens?\n    pvtrace-cli count entering ball-lens scene.sqlite3\n\n    # The spectrum and time-of-flight of those rays\n    pvtrace-cli spectrum entering ball-lens scene.sqlite3\n    pvtrace-cli time entering ball-lens scene.sqlite3\n\nResults are stored in a standard SQLite database, so you can also open them with any SQLite tool.\n\n# pvtrace studio\n\nStudio is a local web app for building scenes, running simulations and exploring the results as live spectra, angular distributions and heatmaps painted directly onto the geometry. Install the studio and engine dependencies (see [Install](#install)), then point it at a scene,\n\n    pvtrace-cli studio examples/studio_lsc.yml\n\nThis opens a browser with a 3D view of the scene, an editable inspector and the scene document side by side. Press **Run** and the recorders fill in real time. Tick **real time** and drag an object to watch the results update as you move it.\n\n# Features\n\n## Ray optics simulations\n\n*pvtrace* supports 3D ray optics simulations shapes,\n\n* box\n* sphere\n* cylinder\n* mesh\n\nThe optical properties of each shape can be customised,\n\n* refractive index\n* absorption coefficient\n* scattering coefficient\n* emission lineshape\n* quantum yield\n* surface reflection\n* surface scattering\n\n![](https://raw.githubusercontent.com/danieljfarrell/pvtrace/master/mkdocs/docs/static/ball-lens.png)\n\n## High and low-level API\n\n*pvtrace* has a high-level API for handling common problems with LSCs and a low-level API where objects can be positioned in a 3D scene and optical properties customised.\n\nFor example, a script using the low-level API to ray trace this glass sphere is below,\n\n```python\nimport time\nimport sys\nimport functools\nimport numpy as np\nfrom pvtrace import *\n\n# World node contains all objects\nworld = Node(\n    name=\"world (air)\",\n    geometry=Sphere(\n        radius=10.0,\n        material=Material(refractive_index=1.0),\n    )\n)\n\n# The glass sphere\nsphere = Node(\n    name=\"sphere (glass)\",\n    geometry=Sphere(\n        radius=1.0,\n        material=Material(refractive_index=1.5),\n    ),\n    parent=world\n)\nsphere.location = (0, 0, 2)\n\n# The source of rays\nlight = Node(\n    name=\"Light (555nm)\",\n    light=Light(direction=functools.partial(cone, np.pi/8)),\n    parent=world\n)\n\n# Render and ray-trace\nrenderer = MeshcatRenderer(wireframe=True, open_browser=True)\nscene = Scene(world)\nrenderer.render(scene)\nfor ray in scene.emit(100):\n    steps = photon_tracer.follow(scene, ray)\n    path, events = zip(*steps)\n    renderer.add_ray_path(path)\n    time.sleep(0.1)\n\n# Wait for Ctrl-C to terminate the script; keep the window open\nprint(\"Ctrl-C to close\")\nwhile True:\n    try:\n        time.sleep(.3)\n    except KeyboardInterrupt:\n        sys.exit()\n```\n\n## Scene Graph\n\n*pvtrace* is designed in layers each with as limited scope as possible.\n\n\u003cdl\u003e\n  \u003cdt\u003eScene\u003c/dt\u003e\n  \u003cdd\u003eGraph data structure of node and the thing that is ray-traced.\u003c/dd\u003e\n  \n  \u003cdt\u003eNode\u003c/dt\u003e\n  \u003cdd\u003eProvides a coordinate system, can be nested inside one another, perform arbitrary rotation and translation transformations.\u003c/dd\u003e\n  \n  \u003cdt\u003eGeometry\u003c/dt\u003e\n  \u003cdd\u003eAttached to nodes to define different shapes (Sphere, Box, Cylinder, Mesh) and handles all ray intersections.\u003c/dd\u003e\n  \n  \u003cdt\u003eMaterial\u003c/dt\u003e\n  \u003cdd\u003eAttached to geometry objects to assign physical properties to shapes such as refractive index.\u003c/dd\u003e\n  \n  \u003cdt\u003eSurface\u003c/dt\u003e\n  \u003cdd\u003eHandles details of interaction between material surfaces and a customisation point for simulation of wavelength selective coatings.\u003c/dd\u003e\n  \n  \u003cdt\u003eComponents\u003c/dt\u003e\n  \u003cdd\u003eSpecifies optical properties of the geometries volume, absorption coefficient, scattering coefficient, quantum yield, emission spectrum.\u003c/dd\u003e\n  \n  \u003cdt\u003eRay-tracing engine\u003c/dt\u003e\n  \u003cdd\u003eThe algorithm which spawns rays, computes intersections, samples probabilities and traverses the rays through the scene.\u003c/dd\u003e\n\u003c/dl\u003e\n\n## Ray-tracing engines\n\n*pvtrace* has two ray-tracing engines. The **photon path tracer** is physically accurate down to individual absorption and emission events, and handles any geometry including meshes and custom surfaces, but follows rays one at a time in Python so it is slow. The **compiled engine** traces the same physics in native, multi-threaded code for the subset of scenes the description language can express, and is hundreds of times faster. See [Fast ray tracing](#fast-ray-tracing).\n\n# Documentation\n\nInteractive Jupyter notebooks are in [examples directory](https://github.com/danieljfarrell/pvtrace/tree/master/examples), download and take a look, although they can be viewed online.\n\n# Contributing\n\nPlease use the github [issue](https://github.com/danieljfarrell/pvtrace/issues) tracker for bug fixes, suggestions, or support questions.\n\nIf you are considering contributing to pvtrace, first fork the project. This will make it easier to include your contributions using pull requests.\n\n## Creating a development environment\n\n1. First create a new development environment using [MacOS instructions](#macos-using-pyenv) or [Linux and Windows instructions](#linux-and-windows-using-conda), but do not install pvtrace using pip! You will need to clone your own copy of the source code in the following steps.\n2. Use the GitHub fork button to make your own fork of the project. This will make it easy to include your changes in pvtrace using a pull request.\n3. Follow the steps below to clone and install the development dependencies\n\n```bash\n# Pull from your fork\ngit clone https://github.com/\u003cyour username\u003e/pvtrace.git\n\n# Get development dependencies\npip install -r pvtrace/requirements_dev.txt \n\n# Add local `pvtrace` directory to known packages\npip install -e pvtrace\n\n# Run units tests\npytest pvtrace/tests\n\n# Run an example\npython pvtrace/examples/hello_world.py\n```\n\nYou should now be able to edit the source code and simply run scripts directly without the need to reinstall anything.\n\n## Unit tests\n\nPlease add or modify an existing unit tests in the `pvtrace/tests` directory if you are adding new code. This will make it much easier to include your changes in the project.\n\n## Pull requests\n\nPull requests will be considered. Please make contact before doing a lot of work, to make sure that the changes will definitely be included in the main project.\n\n# Questions\n\nYou can get in contact with me directly at dan@excitonlabs.com or raise an issue on the issue tracker.\n\n# Dependencies\n\nInstalled automatically with `pip install pvtrace`,\n\n* python \u003e= 3.10\n* numpy\n* pandas\n* trimesh[easy]\n* meshcat \u003e= 0.1.1\n* anytree\n* typer, pyyaml, jsonschema, scipy, termplotlib (for the `pvtrace-cli` command line tool)\n\nThe fast engine additionally needs `cython` and a C compiler (`pip install \"pvtrace[engine]\"`), and studio needs `fastapi`, `uvicorn`, `websockets` and `ruamel.yaml` (`pip install \"pvtrace[studio]\"`).\n","funding_links":[],"readme_doi_urls":["https://doi.org/10.5281/zenodo.592982"],"works":{"https://doi.org/10.5281/zenodo.592982":null},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["optimize","archiving","measur","transforms","generic","compose","observation","conversion","projection","animals"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/19763","html_url":"https://ost.ecosyste.ms/projects/19763"}