{"id":320968,"name":"Spruce","description":"Enrichment pipeline for CUR / FOCUS reports which adds energy and carbon data allowing to report and reduce the impact of the your cloud usage.","url":"https://github.com/digitalpebble/spruce","last_synced_at":"2026-04-15T11:01:50.752Z","repository":{"id":305160376,"uuid":"1021532509","full_name":"DigitalPebble/spruce","owner":"DigitalPebble","description":"SPRUCE is an open-source  enrichment platform for GreenOps which helps measure and reduce the environmental impact of cloud computing.","archived":false,"fork":false,"pushed_at":"2026-04-11T07:31:15.000Z","size":3473,"stargazers_count":20,"open_issues_count":13,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-12T02:36:30.536Z","etag":null,"topics":["apache-spark","aws","carbon-emissions","climate","cloud","greenops","greensoftware","open-source","sustainability"],"latest_commit_sha":null,"homepage":"http://opensourcegreenops.cloud/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DigitalPebble.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"DigitalPebble"}},"created_at":"2025-07-17T14:38:32.000Z","updated_at":"2026-04-11T07:31:21.000Z","dependencies_parsed_at":"2026-03-03T14:00:58.846Z","dependency_job_id":"9ca7243b-0eba-4559-82d2-6619211305d3","html_url":"https://github.com/DigitalPebble/spruce","commit_stats":null,"previous_names":["digitalpebble/spruce"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/DigitalPebble/spruce","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DigitalPebble%2Fspruce","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DigitalPebble%2Fspruce/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DigitalPebble%2Fspruce/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DigitalPebble%2Fspruce/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DigitalPebble","download_url":"https://codeload.github.com/DigitalPebble/spruce/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DigitalPebble%2Fspruce/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31747156,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-13T09:16:15.125Z","status":"ssl_error","status_checked_at":"2026-04-13T09:16:05.023Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":"DigitalPebble","name":"DigitalPebble Ltd","uuid":"1726647","kind":"organization","description":null,"email":"github@digitalpebble.com","website":"http://www.digitalpebble.com","location":"Bristol, UK","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/1726647?v=4","repositories_count":27,"last_synced_at":"2024-11-24T19:46:52.245Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/DigitalPebble","funding_links":[],"total_stars":1242,"followers":9,"following":0,"created_at":"2022-11-02T21:15:35.203Z","updated_at":"2024-11-24T19:46:52.246Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DigitalPebble","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DigitalPebble/repositories"},"packages":[],"commits":{"id":10593939,"full_name":"digitalpebble/spruce","default_branch":"main","total_commits":302,"total_committers":7,"total_bot_commits":22,"total_bot_committers":2,"mean_commits":43.142857142857146,"dds":0.2450331125827815,"past_year_total_commits":302,"past_year_total_committers":7,"past_year_total_bot_commits":22,"past_year_total_bot_committers":2,"past_year_mean_commits":43.142857142857146,"past_year_dds":0.2450331125827815,"last_synced_at":"2026-04-12T15:38:30.497Z","last_synced_commit":"05e25359d367fb71d90f8993325f91b6d274f321","created_at":"2025-07-19T00:07:57.325Z","updated_at":"2026-04-12T15:38:28.514Z","committers":[{"name":"Julien Nioche","email":"julien@digitalpebble.com","login":"jnioche","count":228},{"name":"Davide Polato","email":"davide.polato13@gmail.com","login":"davide954","count":42},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":19},{"name":"nikhiln64","email":"nikhiln64@gmail.com","login":"nikhiln64","count":6},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":3},{"name":"Julien","email":"julien.niochegreenpixie.com@Juliens-MacBook-Air.local","login":null,"count":3},{"name":"tejas-2232","email":"tejasbachhav98@gmail.com","login":"tejas-2232","count":1}],"past_year_committers":[{"name":"Julien Nioche","email":"julien@digitalpebble.com","login":"jnioche","count":228},{"name":"Davide Polato","email":"davide.polato13@gmail.com","login":"davide954","count":42},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":19},{"name":"nikhiln64","email":"nikhiln64@gmail.com","login":"nikhiln64","count":6},{"name":"copilot-swe-agent[bot]","email":"198982749+Copilot","login":"Copilot","count":3},{"name":"Julien","email":"julien.niochegreenpixie.com@Juliens-MacBook-Air.local","login":null,"count":3},{"name":"tejas-2232","email":"tejasbachhav98@gmail.com","login":"tejas-2232","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalpebble%2Fspruce/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-13T00:00:06.408Z","repositories_count":6212798,"commits_count":903936313,"contributors_count":34941705,"owners_count":1143998,"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":"digitalpebble/spruce","html_url":"https://github.com/digitalpebble/spruce","last_synced_at":"2026-04-13T10:00:50.648Z","status":"active","issues_count":55,"pull_requests_count":47,"avg_time_to_close_issue":1746972.25,"avg_time_to_close_pull_request":124957.78048780488,"issues_closed_count":28,"pull_requests_closed_count":41,"pull_request_authors_count":6,"issue_authors_count":2,"avg_comments_per_issue":1.1090909090909091,"avg_comments_per_pull_request":1.3829787234042552,"merged_pull_requests_count":41,"bot_issues_count":0,"bot_pull_requests_count":10,"past_year_issues_count":55,"past_year_pull_requests_count":47,"past_year_avg_time_to_close_issue":1746972.25,"past_year_avg_time_to_close_pull_request":124957.78048780488,"past_year_issues_closed_count":28,"past_year_pull_requests_closed_count":41,"past_year_pull_request_authors_count":6,"past_year_issue_authors_count":2,"past_year_avg_comments_per_issue":1.1090909090909091,"past_year_avg_comments_per_pull_request":1.3829787234042552,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":10,"past_year_merged_pull_requests_count":41,"created_at":"2025-07-19T00:07:57.867Z","updated_at":"2026-04-13T10:00:50.648Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalpebble%2Fspruce","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitalpebble%2Fspruce/issues","issue_labels_count":{"enhancement":23,"help wanted":8,"good first issue":6,"documentation":5,"dependencies":2,"bug":2,"docker":1},"pull_request_labels_count":{"enhancement":23,"dependencies":12,"java":6,"documentation":6,"github_actions":4,"bug":1},"issue_author_associations_count":{"MEMBER":54,"NONE":1},"pull_request_author_associations_count":{"MEMBER":30,"CONTRIBUTOR":14,"NONE":2,"COLLABORATOR":1},"issue_authors":{"jnioche":54,"adamwirth":1},"pull_request_authors":{"jnioche":30,"dependabot[bot]":10,"davide954":3,"nikhiln64":2,"de9uch1":1,"dpol1":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-15T00:00:09.535Z","repositories_count":14272301,"issues_count":34636193,"pull_requests_count":113308077,"authors_count":11235049,"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":{"enhancement":23,"help wanted":8,"good first issue":6,"documentation":5,"bug":2,"dependencies":2,"docker":1},"past_year_pull_request_labels_count":{"enhancement":23,"dependencies":12,"documentation":6,"java":6,"github_actions":4,"bug":1},"past_year_issue_author_associations_count":{"MEMBER":54,"NONE":1},"past_year_pull_request_author_associations_count":{"MEMBER":30,"CONTRIBUTOR":14,"NONE":2,"COLLABORATOR":1},"past_year_issue_authors":{"jnioche":54,"adamwirth":1},"past_year_pull_request_authors":{"jnioche":30,"dependabot[bot]":10,"davide954":3,"nikhiln64":2,"de9uch1":1,"dpol1":1},"maintainers":[{"login":"jnioche","count":84,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jnioche"},{"login":"de9uch1","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/de9uch1"}],"active_maintainers":[{"login":"jnioche","count":84,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jnioche"},{"login":"de9uch1","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/de9uch1"}]},"events":{"total":{"ReleaseEvent":2,"DeleteEvent":46,"PullRequestEvent":105,"ForkEvent":1,"DiscussionEvent":1,"IssuesEvent":63,"WatchEvent":6,"IssueCommentEvent":47,"PublicEvent":1,"PushEvent":91,"PullRequestReviewCommentEvent":21,"PullRequestReviewEvent":17,"GollumEvent":6,"CreateEvent":42},"last_year":{"ReleaseEvent":2,"DeleteEvent":46,"PullRequestEvent":105,"ForkEvent":1,"DiscussionEvent":1,"IssuesEvent":63,"WatchEvent":6,"IssueCommentEvent":47,"PublicEvent":1,"PushEvent":91,"PullRequestReviewCommentEvent":21,"PullRequestReviewEvent":17,"GollumEvent":6,"CreateEvent":42}},"keywords":["apache-spark","aws","carbon-emissions","climate","cloud","greenops","greensoftware","open-source","sustainability"],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/docker.yml","sha":null,"kind":"manifest","created_at":"2026-03-03T14:00:57.327Z","updated_at":"2026-03-03T14:00:57.327Z","repository_link":"https://github.com/DigitalPebble/spruce/blob/main/.github/workflows/docker.yml","dependencies":[{"id":25830047014,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25830047015,"package_name":"docker/login-action","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":25830047016,"package_name":"docker/setup-qemu-action","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":25830047037,"package_name":"docker/setup-buildx-action","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":25830047038,"package_name":"docker/metadata-action","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false},{"id":25830047039,"package_name":"docker/build-push-action","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25830047040,"package_name":"actions/attest-build-provenance","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/documentation.yml","sha":null,"kind":"manifest","created_at":"2026-03-03T14:00:57.726Z","updated_at":"2026-03-03T14:00:57.726Z","repository_link":"https://github.com/DigitalPebble/spruce/blob/main/.github/workflows/documentation.yml","dependencies":[{"id":25830047041,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v6","direct":true,"kind":"composite","optional":false},{"id":25830047042,"package_name":"actions/configure-pages","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false},{"id":25830047043,"package_name":"actions/upload-pages-artifact","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25830047044,"package_name":"actions/deploy-pages","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"requirements-report.txt","sha":null,"kind":"manifest","created_at":"2026-03-03T14:00:58.416Z","updated_at":"2026-03-03T14:00:58.416Z","repository_link":"https://github.com/DigitalPebble/spruce/blob/main/requirements-report.txt","dependencies":[{"id":25830047075,"package_name":"duckdb","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25830047107,"package_name":"markdown","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25830047108,"package_name":"weasyprint","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/maven.yml","sha":null,"kind":"manifest","created_at":"2025-07-18T17:52:18.442Z","updated_at":"2025-07-18T17:52:18.442Z","repository_link":"https://github.com/DigitalPebble/spruce/blob/main/.github/workflows/maven.yml","dependencies":[{"id":24199908414,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":24199908415,"package_name":"actions/setup-java","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":24199908416,"package_name":"advanced-security/maven-dependency-submission-action","ecosystem":"actions","requirements":"571e99aab1055c2e71a1e2309b9691de18d6b7d6","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"docker","filepath":"Dockerfile","sha":null,"kind":"manifest","created_at":"2025-07-18T17:52:18.530Z","updated_at":"2025-07-18T17:52:18.530Z","repository_link":"https://github.com/DigitalPebble/spruce/blob/main/Dockerfile","dependencies":[{"id":24199908417,"package_name":"maven","ecosystem":"docker","requirements":"3.9.9-eclipse-temurin-21","direct":true,"kind":"build","optional":false},{"id":24199908418,"package_name":"apache/spark","ecosystem":"docker","requirements":"4.0.0-java21","direct":true,"kind":"build","optional":false}]},{"ecosystem":"maven","filepath":"pom.xml","sha":null,"kind":"manifest","created_at":"2025-07-18T17:52:18.756Z","updated_at":"2025-07-18T17:52:18.756Z","repository_link":"https://github.com/DigitalPebble/spruce/blob/main/pom.xml","dependencies":[{"id":24199908440,"package_name":"org.apache.spark:spark-sql_2.13","ecosystem":"maven","requirements":"4.0.0","direct":true,"kind":"provided","optional":false},{"id":24199908441,"package_name":"org.junit.jupiter:junit-jupiter-api","ecosystem":"maven","requirements":"5.13.1","direct":true,"kind":"test","optional":false},{"id":24199908442,"package_name":"org.junit.jupiter:junit-jupiter-engine","ecosystem":"maven","requirements":"5.13.1","direct":true,"kind":"test","optional":false}]}],"score":5.442417710521793,"created_at":"2025-07-19T00:07:39.749Z","updated_at":"2026-04-15T11:01:50.753Z","avatar_url":"https://github.com/DigitalPebble.png","language":"Java","category":"Consumption","sub_category":"Computation and Communication","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"\u003cp align=\"center\" width=\"100%\"\u003e\n  \u003cimg src=\"logo.png\" alt=\"Spruce\" width=\"512\"/\u003e\n\u003c/p\u003e\n\n# SPRUCE\n\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n![Build Status](https://github.com/apache/stormcrawler/actions/workflows/maven.yml/badge.svg)\n\n**SPRUCE** helps estimate the environmental impact of your cloud usage. By leveraging open source models and data, it enriches\nusage reports generated by cloud providers and allows you to build reports and visualisations. Having the GreenOps and FinOps data in the same \nplace makes it easier to expose your costs and impacts side by side.\n\nPlease note that SPRUCE handles only CUR reports from AWS and not all their services are covered. However, most of the cost from a typical usage already gets estimates.\n\n**SPRUCE** uses [Apache Spark®](https://spark.apache.org/) to read and write the usage reports (typically in Parquet format) in a scalable way and, thanks to its modular approach, \nsplits the enrichment of the data into configurable stages.\n\nA typical sequence of stages would be:\n- estimation of embodied emissions from the hardware\n- estimation of energy used\n- application of PUE and other overheads\n- application of carbon intensity factors\n\nHave a look at the [methodology section](https://opensourcegreenops.cloud/methodology.html) of our documentation for more details.\n\n## Documentation \n\nThe documentation is at https://opensourcegreenops.cloud/. If you can't wait to try SPRUCE, have a look at the [tutorial for Docker](https://opensourcegreenops.cloud/tutorial/with-docker.html).\n\n## License\nLicensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0\n\n## Contributing\nWe welcome contributions to the project, see [CONTRIBUTING.md](CONTRIBUTING.md) for instructions on how to do so. Contributions are not only about code: by testing the project on your data, talking about it or asking questions, you will be contributing too!\n\n## Support\nDo you need help with SPRUCE? Want some bespoke work, training or a workshop? We at [DigitalPebble](https://digitalpebble.com/), provide consulting services for SPRUCE. \nSend us an email at _spruce@digitalpebble.com_!\n\n","funding_links":["https://github.com/sponsors/DigitalPebble"],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/320968","html_url":"https://ost.ecosyste.ms/projects/320968"}