{"id":146954,"name":"brightsky","description":"A JSON API for Germany's meteorological service as part of their Open Data program.","url":"https://github.com/jdemaeyer/brightsky","last_synced_at":"2026-04-23T06:03:39.363Z","repository":{"id":41505466,"uuid":"247023533","full_name":"jdemaeyer/brightsky","owner":"jdemaeyer","description":"JSON API for DWD's open weather data.","archived":false,"fork":false,"pushed_at":"2026-04-22T10:52:01.000Z","size":3066,"stargazers_count":393,"open_issues_count":32,"forks_count":22,"subscribers_count":15,"default_branch":"master","last_synced_at":"2026-04-22T12:32:45.271Z","etag":null,"topics":["api","dwd","open-data","weather"],"latest_commit_sha":null,"homepage":"https://brightsky.dev/","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/jdemaeyer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"jdemaeyer"}},"created_at":"2020-03-13T08:34:19.000Z","updated_at":"2026-04-22T10:52:06.000Z","dependencies_parsed_at":"2024-01-12T04:52:56.616Z","dependency_job_id":"56ebe13a-fb93-42a9-a8d5-10b7ec5efc94","html_url":"https://github.com/jdemaeyer/brightsky","commit_stats":{"total_commits":344,"total_committers":4,"mean_commits":86.0,"dds":0.008720930232558155,"last_synced_commit":"0da2c9ba05457ffe270b516a7812dc2663174045"},"previous_names":[],"tags_count":64,"template":false,"template_full_name":null,"purl":"pkg:github/jdemaeyer/brightsky","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jdemaeyer","download_url":"https://codeload.github.com/jdemaeyer/brightsky/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/sbom","scorecard":{"id":512415,"data":{"date":"2025-08-11","repo":{"name":"github.com/jdemaeyer/brightsky","commit":"79b17f026dfdbc29309261d4970c76c8bef06b5d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.6,"checks":[{"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":"Code-Review","score":0,"reason":"Found 0/22 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":"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":"Maintained","score":3,"reason":"0 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"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":"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":"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:27: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:75: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:80: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating python:3.13-slim to python:3.13-slim@sha256:2a928e11761872b12003515ea59b3c40bb5340e2e5ecc1108e043f92be7e473d","Warn: pipCommand not pinned by hash: Dockerfile:9","Warn: pipCommand not pinned by hash: Dockerfile:16","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:36","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:55","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:56","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned","Info:   0 out of   5 pipCommand dependencies pinned","Info:   0 out of   1 containerImage 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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/main.yml:40"],"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":"Vulnerabilities","score":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-2c2j-9gv5-cj73","Warn: Project is vulnerable to: GHSA-48p4-8xcf-vxj5","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: GHSA-8qf3-x8v5-2pj8"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 9 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"}}]},"last_synced_at":"2025-08-20T00:54:46.501Z","repository_id":41505466,"created_at":"2025-08-20T00:54:46.502Z","updated_at":"2025-08-20T00:54:46.502Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32168161,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-23T02:19:40.750Z","status":"ssl_error","status_checked_at":"2026-04-23T02:17:55.737Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"jdemaeyer","name":"Jakob de Maeyer ","uuid":"10531844","kind":"user","description":"Freelance Data and Product Engineer","email":"","website":"https://naboa.de","location":"Münster, Germany","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/10531844?u=70329c64212c69738144799f9892b6842bb5877e\u0026v=4","repositories_count":18,"last_synced_at":"2025-09-29T21:56:36.940Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/jdemaeyer","funding_links":["https://github.com/sponsors/jdemaeyer"],"total_stars":458,"followers":50,"following":8,"created_at":"2022-11-12T00:19:06.890Z","updated_at":"2025-09-29T21:56:36.940Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jdemaeyer","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jdemaeyer/repositories"},"packages":[{"id":2660835,"name":"brightsky","ecosystem":"pypi","description":"JSON API for DWD's open weather data.","homepage":"https://brightsky.dev/","licenses":"MIT","normalized_licenses":["MIT"],"repository_url":"https://github.com/jdemaeyer/brightsky","keywords_array":[],"namespace":null,"versions_count":58,"first_release_published_at":"2020-07-08T13:37:52.000Z","latest_release_published_at":"2025-04-30T10:39:42.000Z","latest_release_number":"2.2.6","last_synced_at":"2026-04-01T03:01:43.252Z","created_at":"2022-04-10T10:15:03.551Z","updated_at":"2026-04-01T03:01:43.252Z","registry_url":"https://pypi.org/project/brightsky/","install_command":"pip install brightsky --index-url https://pypi.org/simple","documentation_url":"https://brightsky.dev/docs/","metadata":{"funding":null,"documentation":"https://brightsky.dev/docs/","classifiers":["License :: OSI Approved :: MIT License","Operating System :: OS Independent","Programming Language :: Python :: 3"],"normalized_name":"brightsky"},"repo_metadata":{"id":41505466,"uuid":"247023533","full_name":"jdemaeyer/brightsky","owner":"jdemaeyer","description":"JSON API for DWD's open weather data.","archived":false,"fork":false,"pushed_at":"2025-10-22T09:23:23.000Z","size":3066,"stargazers_count":356,"open_issues_count":28,"forks_count":21,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-11-01T18:02:02.156Z","etag":null,"topics":["api","dwd","open-data","weather"],"latest_commit_sha":null,"homepage":"https://brightsky.dev/","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/jdemaeyer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"jdemaeyer"}},"created_at":"2020-03-13T08:34:19.000Z","updated_at":"2025-10-27T07:25:59.000Z","dependencies_parsed_at":"2024-01-12T04:52:56.616Z","dependency_job_id":"be6217e1-b5ca-44f1-9cfc-e07705627e6f","html_url":"https://github.com/jdemaeyer/brightsky","commit_stats":{"total_commits":344,"total_committers":4,"mean_commits":86.0,"dds":0.008720930232558155,"last_synced_commit":"0da2c9ba05457ffe270b516a7812dc2663174045"},"previous_names":[],"tags_count":62,"template":false,"template_full_name":null,"purl":"pkg:github/jdemaeyer/brightsky","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jdemaeyer","download_url":"https://codeload.github.com/jdemaeyer/brightsky/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/sbom","scorecard":{"id":512415,"data":{"date":"2025-08-11","repo":{"name":"github.com/jdemaeyer/brightsky","commit":"79b17f026dfdbc29309261d4970c76c8bef06b5d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.6,"checks":[{"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":"Code-Review","score":0,"reason":"Found 0/22 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":"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":"Maintained","score":3,"reason":"0 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"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":"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":"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:27: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:75: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yml:80: update your workflow using https://app.stepsecurity.io/secureworkflow/jdemaeyer/brightsky/main.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating python:3.13-slim to python:3.13-slim@sha256:2a928e11761872b12003515ea59b3c40bb5340e2e5ecc1108e043f92be7e473d","Warn: pipCommand not pinned by hash: Dockerfile:9","Warn: pipCommand not pinned by hash: Dockerfile:16","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:36","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:55","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:56","Info:   0 out of   5 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned","Info:   0 out of   5 pipCommand dependencies pinned","Info:   0 out of   1 containerImage 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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/main.yml:40"],"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":"Vulnerabilities","score":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-2c2j-9gv5-cj73","Warn: Project is vulnerable to: GHSA-48p4-8xcf-vxj5","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: GHSA-8qf3-x8v5-2pj8"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 9 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"}}]},"last_synced_at":"2025-08-20T00:54:46.501Z","repository_id":41505466,"created_at":"2025-08-20T00:54:46.502Z","updated_at":"2025-08-20T00:54:46.502Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":282513323,"owners_count":26681842,"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-11-03T02:00:05.676Z","response_time":108,"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":"jdemaeyer","name":"Jakob de Maeyer ","uuid":"10531844","kind":"user","description":"Freelance Data and Product Engineer","email":"","website":"https://naboa.de","location":"Münster, Germany","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/10531844?u=70329c64212c69738144799f9892b6842bb5877e\u0026v=4","repositories_count":18,"last_synced_at":"2025-09-29T21:56:36.940Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/jdemaeyer","funding_links":["https://github.com/sponsors/jdemaeyer"],"total_stars":458,"followers":50,"following":8,"created_at":"2022-11-12T00:19:06.890Z","updated_at":"2025-09-29T21:56:36.940Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jdemaeyer","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jdemaeyer/repositories"},"tags":[]},"repo_metadata_updated_at":"2025-11-09T22:07:14.752Z","dependent_packages_count":0,"downloads":1995,"downloads_period":"last-month","dependent_repos_count":1,"rankings":{"downloads":16.530044513912262,"dependent_repos_count":21.544734775075646,"dependent_packages_count":10.119285352930213,"stargazers_count":4.210796572939151,"forks_count":8.893448624060822,"docker_downloads_count":null,"average":12.259661967783618},"purl":"pkg:pypi/brightsky","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/pypi/brightsky","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/pypi/brightsky","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/pypi/brightsky/dependencies","status":null,"funding_links":["https://github.com/sponsors/jdemaeyer"],"critical":null,"issue_metadata":{"last_synced_at":"2025-10-27T18:00:55.304Z","issues_count":115,"pull_requests_count":15,"avg_time_to_close_issue":8291934.565217392,"avg_time_to_close_pull_request":809778.3076923077,"issues_closed_count":92,"pull_requests_closed_count":13,"pull_request_authors_count":5,"issue_authors_count":43,"avg_comments_per_issue":2.5652173913043477,"avg_comments_per_pull_request":0.8,"merged_pull_requests_count":6,"bot_issues_count":0,"bot_pull_requests_count":7,"past_year_issues_count":10,"past_year_pull_requests_count":3,"past_year_avg_time_to_close_issue":223834.0,"past_year_avg_time_to_close_pull_request":2025.5,"past_year_issues_closed_count":4,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":9,"past_year_avg_comments_per_issue":1.9,"past_year_avg_comments_per_pull_request":0.3333333333333333,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":2,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/issues","maintainers":[{"login":"jdemaeyer","count":61,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jdemaeyer"}],"active_maintainers":[{"login":"jdemaeyer","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jdemaeyer"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/brightsky/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/brightsky/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/brightsky/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/brightsky/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/brightsky/codemeta","maintainers":[{"uuid":"jdemaeyer","login":"jdemaeyer","name":null,"email":null,"url":null,"packages_count":2,"html_url":"https://pypi.org/user/jdemaeyer/","role":null,"created_at":"2023-02-23T18:12:31.732Z","updated_at":"2023-02-23T18:12:31.732Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/jdemaeyer/packages"}],"registry":{"name":"pypi.org","url":"https://pypi.org","ecosystem":"pypi","default":true,"packages_count":842519,"maintainers_count":359933,"namespaces_count":0,"keywords_count":271316,"github":"pypi","metadata":{"funded_packages_count":53172},"icon_url":"https://github.com/pypi.png","created_at":"2022-04-04T15:19:23.364Z","updated_at":"2026-04-09T05:08:03.587Z","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":545325,"full_name":"jdemaeyer/brightsky","default_branch":"master","total_commits":379,"total_committers":4,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":94.75,"dds":0.01055408970976257,"past_year_total_commits":9,"past_year_total_committers":2,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":4.5,"past_year_dds":0.11111111111111116,"last_synced_at":"2026-04-21T05:01:34.207Z","last_synced_commit":"491e9e985899d77fe8ae76e29d2b243f6c0488c3","created_at":"2023-03-09T04:24:01.124Z","updated_at":"2026-04-21T05:01:34.145Z","committers":[{"name":"Jakob de Maeyer","email":"jakobdm1@gmail.com","login":"jdemaeyer","count":375},{"name":"Gerald Pape","email":"gerald@giantswarm.io","login":"ubergesundheit","count":2},{"name":"xalopp","email":"xaver@loppenstedt.de","login":"xalopp","count":1},{"name":"Tobias","email":"tobias.laatsch@posteo.de","login":"tobi-laa","count":1}],"past_year_committers":[{"name":"Jakob de Maeyer","email":"jakobdm1@gmail.com","login":"jdemaeyer","count":8},{"name":"xalopp","email":"xaver@loppenstedt.de","login":"xalopp","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-23T00:00:09.178Z","repositories_count":6216810,"commits_count":899289986,"contributors_count":34909422,"owners_count":1144468,"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":"jdemaeyer/brightsky","html_url":"https://github.com/jdemaeyer/brightsky","last_synced_at":"2026-04-15T02:01:24.883Z","status":"active","issues_count":119,"pull_requests_count":17,"avg_time_to_close_issue":8117743.063829787,"avg_time_to_close_pull_request":809778.3076923077,"issues_closed_count":94,"pull_requests_closed_count":13,"pull_request_authors_count":7,"issue_authors_count":45,"avg_comments_per_issue":2.596638655462185,"avg_comments_per_pull_request":0.7058823529411765,"merged_pull_requests_count":6,"bot_issues_count":0,"bot_pull_requests_count":7,"past_year_issues_count":11,"past_year_pull_requests_count":3,"past_year_avg_time_to_close_issue":273779.5,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":4,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":3,"past_year_issue_authors_count":10,"past_year_avg_comments_per_issue":2.7272727272727275,"past_year_avg_comments_per_pull_request":0.3333333333333333,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2023-05-14T10:04:32.739Z","updated_at":"2026-04-15T02:01:24.883Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/jdemaeyer%2Fbrightsky/issues","issue_labels_count":{"documentation":4,"experimental":4,"enhancement":3,"data quality":2,"bug":2,"housekeeping":1},"pull_request_labels_count":{"dependencies":7},"issue_author_associations_count":{"NONE":60,"OWNER":56,"CONTRIBUTOR":3},"pull_request_author_associations_count":{"NONE":10,"OWNER":5,"CONTRIBUTOR":2},"issue_authors":{"jdemaeyer":56,"smilingchemist":5,"poetaster":4,"tawissus":3,"ubergesundheit":3,"MHz000":3,"mweinelt":3,"BlackScreen":3,"martinfricke":2,"ptoews":2,"chrbru":1,"HueppBr42":1,"MatthiasDod":1,"rfpaiva":1,"papjul":1,"gabowi":1,"bjoernh":1,"Leo32345":1,"oleid":1,"marcusandre":1,"firewiremb":1,"Poeschl":1,"PinguDEV-original":1,"miasbeck":1,"jwillmer":1,"kaerbr":1,"robinmetral":1,"timmkrause":1,"kajetanschuler":1,"AndiLeni":1,"AlexW987":1,"seb2010":1,"ff6347":1,"muskalowski":1,"kanpyo02":1,"MarcelCoding":1,"phlmn":1,"ialokim":1,"philippdzm":1,"antonanders":1,"elotex0":1,"bimsonberlin":1,"kwiat1990":1,"df1paw":1,"derniwi":1},"pull_request_authors":{"dependabot[bot]":7,"jdemaeyer":5,"AndiLeni":1,"xalopp":1,"tobi-laa":1,"ubergesundheit":1,"mundanevision20":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-19T00:00:13.985Z","repositories_count":14317333,"issues_count":34513143,"pull_requests_count":112945107,"authors_count":11238229,"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":10,"OWNER":1},"past_year_pull_request_author_associations_count":{"NONE":3},"past_year_issue_authors":{"smilingchemist":2,"AndiLeni":1,"bimsonberlin":1,"elotex0":1,"gabowi":1,"HueppBr42":1,"jdemaeyer":1,"oleid":1,"phlmn":1,"rfpaiva":1},"past_year_pull_request_authors":{"AndiLeni":1,"mundanevision20":1,"xalopp":1},"maintainers":[{"login":"jdemaeyer","count":61,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jdemaeyer"}],"active_maintainers":[{"login":"jdemaeyer","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jdemaeyer"}]},"events":{"total":{"DeleteEvent":1,"PullRequestEvent":3,"ForkEvent":3,"IssuesEvent":12,"WatchEvent":55,"IssueCommentEvent":36,"PushEvent":19,"PullRequestReviewCommentEvent":1,"PullRequestReviewEvent":3,"CreateEvent":7},"last_year":{"PullRequestEvent":1,"ForkEvent":3,"IssuesEvent":8,"WatchEvent":29,"IssueCommentEvent":27,"PushEvent":7,"PullRequestReviewCommentEvent":1,"PullRequestReviewEvent":3,"CreateEvent":1}},"keywords":["api","dwd","open-data","weather"],"dependencies":[{"ecosystem":"pypi","filepath":"requirements.txt","sha":null,"kind":"lockfile","created_at":"2022-07-29T18:39:47.635Z","updated_at":"2022-07-29T18:39:47.635Z","repository_link":"https://github.com/jdemaeyer/brightsky/blob/master/requirements.txt","dependencies":[{"id":511915901,"package_name":"astral","ecosystem":"pypi","requirements":"==2.2","direct":false,"kind":"runtime","optional":false},{"id":511915902,"package_name":"certifi","ecosystem":"pypi","requirements":"==2022.6.15","direct":false,"kind":"runtime","optional":false},{"id":511915903,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"==2.1.0","direct":false,"kind":"runtime","optional":false},{"id":511915904,"package_name":"click","ecosystem":"pypi","requirements":"==8.1.3","direct":false,"kind":"runtime","optional":false},{"id":511915905,"package_name":"coloredlogs","ecosystem":"pypi","requirements":"==15.0.1","direct":false,"kind":"runtime","optional":false},{"id":511915906,"package_name":"cssselect","ecosystem":"pypi","requirements":"==1.1.0","direct":false,"kind":"runtime","optional":false},{"id":511915907,"package_name":"falcon","ecosystem":"pypi","requirements":"==2.0.0","direct":false,"kind":"runtime","optional":false},{"id":511915908,"package_name":"falcon-cors","ecosystem":"pypi","requirements":"==1.1.7","direct":false,"kind":"runtime","optional":false},{"id":511915909,"package_name":"gunicorn","ecosystem":"pypi","requirements":"==20.1.0","direct":false,"kind":"runtime","optional":false},{"id":511915910,"package_name":"huey","ecosystem":"pypi","requirements":"==2.4.3","direct":false,"kind":"runtime","optional":false},{"id":511915911,"package_name":"humanfriendly","ecosystem":"pypi","requirements":"==10.0","direct":false,"kind":"runtime","optional":false},{"id":511915912,"package_name":"idna","ecosystem":"pypi","requirements":"==3.3","direct":false,"kind":"runtime","optional":false},{"id":511915913,"package_name":"lxml","ecosystem":"pypi","requirements":"==4.9.1","direct":false,"kind":"runtime","optional":false},{"id":511915914,"package_name":"parsel","ecosystem":"pypi","requirements":"==1.6.0","direct":false,"kind":"runtime","optional":false},{"id":511915915,"package_name":"psycopg2-binary","ecosystem":"pypi","requirements":"==2.9.3","direct":false,"kind":"runtime","optional":false},{"id":511915916,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"==2.8.2","direct":false,"kind":"runtime","optional":false},{"id":511915917,"package_name":"pytz","ecosystem":"pypi","requirements":"==2022.1","direct":false,"kind":"runtime","optional":false},{"id":511915918,"package_name":"redis","ecosystem":"pypi","requirements":"==3.5.3","direct":false,"kind":"runtime","optional":false},{"id":511915919,"package_name":"requests","ecosystem":"pypi","requirements":"==2.28.1","direct":false,"kind":"runtime","optional":false},{"id":511915920,"package_name":"sentry-sdk","ecosystem":"pypi","requirements":"==1.7.2","direct":false,"kind":"runtime","optional":false},{"id":511915921,"package_name":"six","ecosystem":"pypi","requirements":"==1.16.0","direct":false,"kind":"runtime","optional":false},{"id":511915922,"package_name":"urllib3","ecosystem":"pypi","requirements":"==1.26.10","direct":false,"kind":"runtime","optional":false},{"id":511915923,"package_name":"w3lib","ecosystem":"pypi","requirements":"==1.22.0","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"setup.py","sha":null,"kind":"manifest","created_at":"2022-07-29T18:39:47.695Z","updated_at":"2022-07-29T18:39:47.695Z","repository_link":"https://github.com/jdemaeyer/brightsky/blob/master/setup.py","dependencies":[{"id":511915998,"package_name":"astral","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":511915999,"package_name":"click","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":511916000,"package_name":"coloredlogs","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":511916001,"package_name":"falcon","ecosystem":"pypi","requirements":"==2.","direct":true,"kind":"runtime","optional":false},{"id":511916002,"package_name":"falcon-cors","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":511916003,"package_name":"gunicorn","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":511916004,"package_name":"huey","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":511916005,"package_name":"parsel","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":511916006,"package_name":"psycopg2-binary","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":511916007,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":511916008,"package_name":"redis","ecosystem":"pypi","requirements":"\u003c4","direct":true,"kind":"runtime","optional":false},{"id":511916009,"package_name":"requests","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":511916010,"package_name":"sentry-sdk","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/main.yml","sha":null,"kind":"manifest","created_at":"2023-01-31T06:15:57.174Z","updated_at":"2023-01-31T06:15:57.174Z","repository_link":"https://github.com/jdemaeyer/brightsky/blob/master/.github/workflows/main.yml","dependencies":[{"id":7265007148,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":7265007151,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false},{"id":7265007153,"package_name":"pypa/gh-action-pypi-publish","ecosystem":"actions","requirements":"release/v1","direct":true,"kind":"composite","optional":false},{"id":7265007154,"package_name":"docker/login-action","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":7265007156,"package_name":"docker/build-push-action","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":7265007158,"package_name":"postgres","ecosystem":"actions","requirements":"12","direct":true,"kind":"docker","optional":false}]},{"ecosystem":"docker","filepath":"Dockerfile","sha":null,"kind":"manifest","created_at":"2023-01-31T06:15:57.264Z","updated_at":"2023-01-31T06:15:57.264Z","repository_link":"https://github.com/jdemaeyer/brightsky/blob/master/Dockerfile","dependencies":[{"id":7265008542,"package_name":"python","ecosystem":"docker","requirements":"3.10-slim","direct":true,"kind":"build","optional":false}]},{"ecosystem":"docker","filepath":"docker-compose.yml","sha":null,"kind":"manifest","created_at":"2024-01-12T04:52:56.416Z","updated_at":"2024-01-12T04:52:56.416Z","repository_link":"https://github.com/jdemaeyer/brightsky/blob/master/docker-compose.yml","dependencies":[]},{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2024-01-12T04:52:56.589Z","updated_at":"2024-01-12T04:52:56.589Z","repository_link":"https://github.com/jdemaeyer/brightsky/blob/master/pyproject.toml","dependencies":[]}],"score":15.037784863460123,"created_at":"2023-12-05T11:20:45.992Z","updated_at":"2026-04-23T06:03:39.376Z","avatar_url":"https://github.com/jdemaeyer.png","language":"Python","category":"Atmosphere","sub_category":"Meteorological Observation and Forecast","monthly_downloads":1995,"total_dependent_repos":1,"total_dependent_packages":0,"readme":"\u003cimg src=\"docs/favicon.svg\" align=\"right\" style=\"height: 140px\"\u003e\n\n# Bright Sky\n\n[![API Status](https://img.shields.io/website?down_message=offline\u0026label=api\u0026up_message=online\u0026url=https%3A%2F%2Fapi.brightsky.dev%2F)](https://api.brightsky.dev/)\n[![Docs Status](https://img.shields.io/website?down_message=offline\u0026label=docs\u0026up_message=online\u0026url=https%3A%2F%2Fbrightsky.dev%2Fdocs%2F)](https://brightsky.dev/docs/)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/jdemaeyer/brightsky/main.yml)](https://github.com/jdemaeyer/brightsky/actions)\n[![PyPI Release](https://img.shields.io/pypi/v/brightsky)](https://pypi.org/project/brightsky/)\n[![Docker Hub Release](https://img.shields.io/docker/v/jdemaeyer/brightsky/latest?label=docker)](https://hub.docker.com/r/jdemaeyer/brightsky)\n\n### JSON API for DWD's open weather data.\n\nThe DWD ([Deutscher Wetterdienst](https://www.dwd.de/)), as Germany's\nmeteorological service, publishes a myriad of meteorological observations and\ncalculations as part of their [Open Data\nprogram](https://www.dwd.de/DE/leistungen/opendata/opendata.html).\n\n[**Bright Sky**](https://brightsky.dev/) is an open-source project aiming to\nmake some of the more popular data — in particular weather observations from\nthe DWD station network and weather forecasts from the MOSMIX model — available\nin a free, simple JSON API.\n\n\n### Looking for something specific?\n\n#### I just want to retrieve some weather data\n\nYou can use the free [public Bright Sky instance](https://brightsky.dev/)!\n\n#### I want to run my own instance of Bright Sky\n\nCheck out the [infrastructure\nrepo](https://github.com/jdemaeyer/brightsky-infrastructure/)!\n\n#### I want to parse DWD weather files from the command line or in Python\n\nThe parsing core for Bright Sky is maintained in a separate package named\n[`dwdparse`](https://github.com/jdemaeyer/dwdparse), which has no dependencies\noutside the standard library. If you find that's not quite serving your needs,\ncheck out [`wetterdienst`](https://github.com/earthobservations/wetterdienst).\n\n#### I want to contribute to Bright Sky's source code\n\nRead on. :)\n\n\n### On Bright Sky's versioning\n\nStarting from version 2.0, where we extracted the parsing core into a [separate\npackage](https://github.com/jdemaeyer/dwdparse), Bright Sky is **no longer\nintended to be used as a Python library**, but only as the service available at\n[`brightsky.dev`](https://brightsky.dev/).\n\nConsequentially, we adjust our version numbers from the _perspective of that\nservice and its users_ – i.e., we will increase the major version number only\nwhen we introduce backwards-incompatible (or otherwise very major) changes to\nthe actual JSON API interface, e.g. by changing URLs or parameters. This means\nthat **increases of the minor version number may introduce\nbackwards-incompatible changes to the internals of the `brightsky` package,\nincluding the database structure**. If you use `brightsky` as a Python library,\nplease version-pin to a minor version, e.g. by putting `brightsky==2.0.*` in\nyour `requirements.txt`.\n\n\n## Quickstart\n\n### Running a full-fledged API instance\n\n_Note: These instructions are aimed at running a Bright Sky instance for\ndevelopment and testing. Check out our [infrastructure\nrepository](https://github.com/jdemaeyer/brightsky-infrastructure/) if you want\nto set up a production-level API instance._\n\nJust run `docker-compose up` and you should be good to go. This will set up a\nPostgreSQL database (with persistent storage in `.data`), run a Redis server,\nand start the Bright Sky worker and webserver. The worker periodically polls\nthe DWD Open Data Server for updates, parses them, and stores them in the\ndatabase. The webserver will be listening to API requests on port 5000.\n\n\n## Architecture\n\n![Bright Sky's Architecture](docs/img/architecture.svg)\n\nBright Sky is a rather simple project consisting of four components:\n\n * The `brightsky` worker, which leverages the logic contained in the\n   `brightsky` Python package to retrieve weather records from the DWD server,\n   parse them, and store them in a database. It will periodically poll the DWD\n   servers for new data.\n\n * The `brightsky` webserver (API), which serves as gate to our database and\n   processes all queries for weather records coming from the outside world.\n\n * A PostgreSQL database consisting of two relevant tables:\n\n    * `sources` contains information on the locations for which we hold weather\n      records, and\n    * `weather` contains the history of actual meteorological measurements (or\n      forecasts) for these locations.\n\n   The database structure can be set up by running the `migrate` command, which\n   will simply apply all `.sql` files found in the `migrations` folder.\n\n * A Redis server, which is used as the backend of the worker's task queue.\n\nMost of the tasks performed by the worker and webserver can also be performed\nindependently. Run `docker-compose run --rm brightsky` to get a list of\navailable commands.\n\n\n## Hacking\n\nConstantly rebuilding the `brightsky` container while working on the code can\nbecome cumbersome, and the default setting of parsing records dating all the\nway back to 2010 will make your development database unnecessarily large. You\ncan set up a more lightweight development environment as follows:\n\n 1. Create a virtual environment and install our dependencies:\n    `python -m virtualenv .venv \u0026\u0026 source .venv/bin/activate \u0026\u0026 pip install -r\n    requirements.txt \u0026\u0026 pip install -e .`\n\n 2. Start a PostgreSQL container:\n    `docker-compose run --rm -p 5432:5432 postgres`\n\n 3. Start a Redis container:\n    `docker-compose run --rm -p 6379:6379 redis`\n\n 4. Point `brightsky` to your containers, and configure a tighter date\n    threshold for parsing DWD data, by adding the following `.env` file:\n    ```\n    BRIGHTSKY_DATABASE_URL=postgres://postgres:pgpass@localhost\n    BRIGHTSKY_BENCHMARK_DATABASE_URL=postgres://postgres:pgpass@localhost/benchmark\n    BRIGHTSKY_REDIS_URL=redis://localhost\n    BRIGHTSKY_MIN_DATE=2020-01-01\n    ```\n\nYou should now be able to directly run `brightsky` commands via `python -m\nbrightsky`, and changes to the source code should be effective immediately.\n\n\n### Tests\n\nLarge parts of our test suite run against a real Postgres database. By default,\nthese tests will be skipped. To enable them, make sure the\n`BRIGHTSKY_DATABASE_URL` environment variable is set when calling `pytest`,\ne.g. via:\n```\nBRIGHTSKY_DATABASE_URL=postgres://postgres:pgpass@localhost/brightsky_test pytest\n```\n\nBeware that adding this environment variable to your `.env` file will not work\nas that file is not read by `pytest`. The database will be **dropped and\nrecreated** on every test run, so don't use your normal Bright Sky database. ;)\n\n\n## Acknowledgements\n\nBright Sky's development is boosted by the priceless guidance and support of\nthe [Open Knowledge Foundation](https://www.okfn.de/)'s [Prototype\nFund](https://prototypefund.de/) program, and is generously funded by Germany's\n[Federal Ministry of Education and Research](https://www.bmbf.de/). Obvious as\nit may be, it should be mentioned that none of this would be possible without\nthe painstaking, never-ending effort of the [Deutscher\nWetterdienst](https://www.dwd.de/).\n\n\u003ca href=\"https://prototypefund.de/\"\u003e\u003cimg src=\"docs/img/pf.svg\" alt=\"Prototype Fund\" height=\"100\"\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\n\u003ca href=\"https://okfn.de/\"\u003e\u003cimg src=\"docs/img/okfde.svg\" alt=\"Open Knowledge Foundation Germany\" height=\"100\"\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\n\u003ca href=\"https://www.bmbf.de/\"\u003e\u003cimg src=\"docs/img/bmbf.svg\" alt=\"Bundesministerium für Bildung und Forschung\" height=\"100\"\u003e\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;\u0026nbsp;\n\u003ca href=\"https://www.dwd.de/\"\u003e\u003cimg src=\"docs/img/dwd.svg\" alt=\"Deutscher Wetterdienst\" height=\"100\"\u003e\u003c/a\u003e\n","funding_links":["https://github.com/sponsors/jdemaeyer"],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["deutscherwetterdienst","wetter"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/146954","html_url":"https://ost.ecosyste.ms/projects/146954"}