{"id":359088,"name":"Volca","description":"An open-source toolkit for inspecting and working with life-cycle inventory databases through CLI, desktop, API/server, Python, and MCP interfaces.","url":"https://github.com/ccomb/volca","last_synced_at":"2026-07-18T12:01:19.920Z","repository":{"id":324007380,"uuid":"1095309995","full_name":"ccomb/volca","owner":"ccomb","description":"Open-source toolkit for inspecting and working with life-cycle inventory databases, with CLI, desktop, API/server, Python, and MCP interfaces.","archived":false,"fork":false,"pushed_at":"2026-07-11T11:29:10.000Z","size":10139,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-12T09:04:30.881Z","etag":null,"topics":["api","desktop-app","environmental-data","haskell","lca","lci","lcia","life-cycle-assessment","mcp","open-source","python","sustainability"],"latest_commit_sha":null,"homepage":"https://volca.run","language":"Haskell","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/ccomb.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-11-12T22:02:17.000Z","updated_at":"2026-07-11T11:16:32.000Z","dependencies_parsed_at":"2026-06-27T02:00:40.075Z","dependency_job_id":null,"html_url":"https://github.com/ccomb/volca","commit_stats":null,"previous_names":["ccomb/fplca","ccomb/volca"],"tags_count":35,"template":false,"template_full_name":null,"purl":"pkg:github/ccomb/volca","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ccomb","download_url":"https://codeload.github.com/ccomb/volca/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35541271,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-16T02:00:06.687Z","response_time":83,"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":"ccomb","name":"Christophe Combelles","uuid":"283404","kind":"user","description":"#Python #Elm #Haskell #Cloud #Linux #Dev #DevOps #Data #ERP","email":"","website":"https://anybox.fr","location":"France | Türkiye","twitter":"ccomb","company":"Anybox, Prelab","icon_url":"https://avatars.githubusercontent.com/u/283404?v=4","repositories_count":2,"last_synced_at":"2023-05-03T15:23:31.937Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/ccomb","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2023-05-03T15:23:31.984Z","updated_at":"2023-05-03T15:23:31.984Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ccomb","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ccomb/repositories"},"packages":[{"id":14139631,"name":"pyvolca","ecosystem":"pypi","description":"Python client for VoLCA — Life Cycle Assessment engine","homepage":null,"licenses":"Apache-2.0","normalized_licenses":["Apache-2.0"],"repository_url":"https://github.com/ccomb/volca","keywords_array":[],"namespace":null,"versions_count":13,"first_release_published_at":"2026-03-25T15:36:13.000Z","latest_release_published_at":"2026-07-15T22:18:58.000Z","latest_release_number":"0.8.2","last_synced_at":"2026-07-16T14:40:12.330Z","created_at":"2026-03-28T01:08:10.951Z","updated_at":"2026-07-16T21:16:02.484Z","registry_url":"https://pypi.org/project/pyvolca/","install_command":"pip install pyvolca --index-url https://pypi.org/simple","documentation_url":"https://volca.run/docs/guides/pyvolca/","metadata":{"funding":null,"documentation":"https://volca.run/docs/guides/pyvolca/","classifiers":["Development Status :: 3 - Alpha","Topic :: Scientific/Engineering"],"normalized_name":"pyvolca","project_status":null},"repo_metadata":{"id":324007380,"uuid":"1095309995","full_name":"ccomb/volca","owner":"ccomb","description":"Open-source toolkit for inspecting and working with life-cycle inventory databases, with CLI, desktop, API/server, Python, and MCP interfaces.","archived":false,"fork":false,"pushed_at":"2026-07-04T23:05:44.000Z","size":9569,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-05T00:12:43.794Z","etag":null,"topics":["api","desktop-app","environmental-data","haskell","lca","lci","lcia","life-cycle-assessment","mcp","open-source","python","sustainability"],"latest_commit_sha":null,"homepage":"https://volca.run","language":"Haskell","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/ccomb.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-11-12T22:02:17.000Z","updated_at":"2026-07-04T23:05:46.000Z","dependencies_parsed_at":"2026-06-27T02:00:40.075Z","dependency_job_id":null,"html_url":"https://github.com/ccomb/volca","commit_stats":null,"previous_names":["ccomb/fplca","ccomb/volca"],"tags_count":35,"template":false,"template_full_name":null,"purl":"pkg:github/ccomb/volca","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ccomb","download_url":"https://codeload.github.com/ccomb/volca/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35144845,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-05T02:00:06.290Z","response_time":100,"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":"ccomb","name":"Christophe Combelles","uuid":"283404","kind":"user","description":"#Python #Elm #Haskell #Cloud #Linux #Dev #DevOps #Data #ERP","email":"","website":"https://anybox.fr","location":"France | Türkiye","twitter":"ccomb","company":"Anybox, Prelab","icon_url":"https://avatars.githubusercontent.com/u/283404?v=4","repositories_count":2,"last_synced_at":"2023-05-03T15:23:31.937Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/ccomb","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2023-05-03T15:23:31.984Z","updated_at":"2023-05-03T15:23:31.984Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ccomb","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ccomb/repositories"},"tags":[]},"repo_metadata_updated_at":"2026-07-16T21:16:02.464Z","dependent_packages_count":0,"downloads":846,"downloads_period":"last-month","dependent_repos_count":0,"rankings":{"downloads":19.06195729128217,"dependent_repos_count":42.72297796567054,"dependent_packages_count":7.555025256501883,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":23.11332017115153},"purl":"pkg:pypi/pyvolca","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/pypi/pyvolca","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/pypi/pyvolca","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/pypi/pyvolca/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2026-06-29T03:00:24.175Z","issues_count":0,"pull_requests_count":21,"avg_time_to_close_issue":null,"avg_time_to_close_pull_request":195264.0,"issues_closed_count":0,"pull_requests_closed_count":21,"pull_request_authors_count":1,"issue_authors_count":0,"avg_comments_per_issue":null,"avg_comments_per_pull_request":0.0,"merged_pull_requests_count":21,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":0,"past_year_pull_requests_count":21,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":195264.0,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":21,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":21,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/issues","maintainers":[{"login":"ccomb","count":21,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ccomb"}],"active_maintainers":[{"login":"ccomb","count":21,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ccomb"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pyvolca/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pyvolca/version_numbers","latest_version_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pyvolca/latest_version","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pyvolca/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pyvolca/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/pyvolca/codemeta","maintainers":[{"uuid":"ccomb","login":"ccomb","name":null,"email":null,"url":null,"packages_count":235,"html_url":"https://pypi.org/user/ccomb/","role":"Owner","created_at":"2026-03-28T01:27:44.362Z","updated_at":"2026-03-28T01:27:44.362Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/ccomb/packages"}],"registry":{"name":"pypi.org","url":"https://pypi.org","ecosystem":"pypi","default":true,"packages_count":910626,"maintainers_count":390666,"namespaces_count":0,"keywords_count":289179,"github":"pypi","metadata":{"funded_packages_count":54301},"icon_url":"https://github.com/pypi.png","created_at":"2022-04-04T15:19:23.364Z","updated_at":"2026-06-10T05:13:28.296Z","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":11816659,"full_name":"ccomb/volca","default_branch":"master","total_commits":981,"total_committers":2,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":490.5,"dds":0.02854230377166156,"past_year_total_commits":980,"past_year_total_committers":2,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":490.0,"past_year_dds":0.02857142857142858,"last_synced_at":"2026-07-16T11:01:17.799Z","last_synced_commit":"2d4f57e9f10b7d57ffcdd8e12077f5e599255580","created_at":"2026-06-22T22:36:06.721Z","updated_at":"2026-07-16T11:01:13.857Z","committers":[{"name":"Christophe Combelles","email":"ccomb@free.fr","login":"ccomb","count":953},{"name":"ccomb","email":"ccomb@volca","login":null,"count":28}],"past_year_committers":[{"name":"Christophe Combelles","email":"ccomb@free.fr","login":"ccomb","count":952},{"name":"ccomb","email":"ccomb@volca","login":null,"count":28}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-07-18T00:00:16.552Z","repositories_count":6372642,"commits_count":865138454,"contributors_count":35752202,"owners_count":1221826,"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":"ccomb/volca","html_url":"https://github.com/ccomb/volca","last_synced_at":"2026-07-16T01:01:03.887Z","status":null,"issues_count":0,"pull_requests_count":66,"avg_time_to_close_issue":null,"avg_time_to_close_pull_request":74317.2,"issues_closed_count":0,"pull_requests_closed_count":65,"pull_request_authors_count":1,"issue_authors_count":0,"avg_comments_per_issue":null,"avg_comments_per_pull_request":0.0,"merged_pull_requests_count":65,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":0,"past_year_pull_requests_count":66,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":74317.2,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":65,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":65,"created_at":"2026-04-27T09:00:14.932Z","updated_at":"2026-07-16T01:01:03.887Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/ccomb%2Fvolca/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{},"pull_request_author_associations_count":{"OWNER":66},"issue_authors":{},"pull_request_authors":{"ccomb":66},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-07-16T00:00:20.511Z","repositories_count":14861458,"issues_count":32335402,"pull_requests_count":106259612,"authors_count":11347724,"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":{},"past_year_pull_request_author_associations_count":{"OWNER":66},"past_year_issue_authors":{},"past_year_pull_request_authors":{"ccomb":66},"maintainers":[{"login":"ccomb","count":66,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ccomb"}],"active_maintainers":[{"login":"ccomb","count":66,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ccomb"}]},"events":{"total":{"DeleteEvent":80,"PullRequestEvent":21,"PushEvent":272,"CreateEvent":87},"last_year":{"DeleteEvent":80,"PullRequestEvent":21,"PushEvent":272,"CreateEvent":87}},"keywords":["api","desktop-app","environmental-data","haskell","lca","lci","lcia","life-cycle-assessment","mcp","open-source","python","sustainability"],"dependencies":[{"ecosystem":"hackage","filepath":"mumps-hs/mumps-hs.cabal","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:34.754Z","updated_at":"2026-06-27T02:00:34.754Z","repository_link":"https://github.com/ccomb/volca/blob/main/mumps-hs/mumps-hs.cabal","dependencies":[{"id":25877750872,"package_name":"base","ecosystem":"hackage","requirements":"\u003e=4.14 \u0026\u0026 \u003c5","direct":true,"kind":"runtime","optional":false},{"id":25877750876,"package_name":"vector","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"pyvolca/pyproject.toml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:40.007Z","updated_at":"2026-06-27T02:00:40.007Z","repository_link":"https://github.com/ccomb/volca/blob/main/pyvolca/pyproject.toml","dependencies":[{"id":25877751134,"package_name":"requests","ecosystem":"pypi","requirements":"\u003e=2.28","direct":true,"kind":"runtime","optional":false},{"id":25877751135,"package_name":"platformdirs","ecosystem":"pypi","requirements":"\u003e=4.0","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/_build-matrix.yml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:32.797Z","updated_at":"2026-06-27T02:00:32.797Z","repository_link":"https://github.com/ccomb/volca/blob/main/.github/workflows/_build-matrix.yml","dependencies":[{"id":25877750810,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750811,"package_name":"laverdet/alpine-arm64","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false},{"id":25877750817,"package_name":"./.github/actions/setup-haskell-env","ecosystem":"actions","requirements":"*","direct":true,"kind":"composite","optional":false},{"id":25877750820,"package_name":"actions/cache/restore","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750821,"package_name":"actions/cache/save","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750833,"package_name":"actions/upload-artifact","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/pyvolca.yml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:34.403Z","updated_at":"2026-06-27T02:00:34.403Z","repository_link":"https://github.com/ccomb/volca/blob/main/.github/workflows/pyvolca.yml","dependencies":[{"id":25877750860,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750861,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/build.yml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:33.817Z","updated_at":"2026-06-27T02:00:33.817Z","repository_link":"https://github.com/ccomb/volca/blob/main/.github/workflows/build.yml","dependencies":[]},{"ecosystem":"actions","filepath":".github/workflows/prebuild-cabal-store.yml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:34.093Z","updated_at":"2026-06-27T02:00:34.093Z","repository_link":"https://github.com/ccomb/volca/blob/main/.github/workflows/prebuild-cabal-store.yml","dependencies":[{"id":25877750842,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750843,"package_name":"laverdet/alpine-arm64","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false},{"id":25877750844,"package_name":"./.github/actions/setup-haskell-env","ecosystem":"actions","requirements":"*","direct":true,"kind":"composite","optional":false},{"id":25877750845,"package_name":"actions/upload-artifact","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750846,"package_name":"./.github/actions/publish-prebuilt-release","ecosystem":"actions","requirements":"*","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/prebuild-mumps.yml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:34.192Z","updated_at":"2026-06-27T02:00:34.192Z","repository_link":"https://github.com/ccomb/volca/blob/main/.github/workflows/prebuild-mumps.yml","dependencies":[{"id":25877750848,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750849,"package_name":"laverdet/alpine-arm64","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false},{"id":25877750850,"package_name":"./.github/actions/setup-haskell-env","ecosystem":"actions","requirements":"*","direct":true,"kind":"composite","optional":false},{"id":25877750851,"package_name":"actions/upload-artifact","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750852,"package_name":"./.github/actions/publish-prebuilt-release","ecosystem":"actions","requirements":"*","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/release.yml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:34.460Z","updated_at":"2026-06-27T02:00:34.460Z","repository_link":"https://github.com/ccomb/volca/blob/main/.github/workflows/release.yml","dependencies":[{"id":25877750862,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750863,"package_name":"actions/download-artifact","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"hackage","filepath":"volca.cabal","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:34.910Z","updated_at":"2026-06-27T02:00:34.910Z","repository_link":"https://github.com/ccomb/volca/blob/main/volca.cabal","dependencies":[{"id":25877750977,"package_name":"stm","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750979,"package_name":"async","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750980,"package_name":"conduit","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750981,"package_name":"xml-types","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750985,"package_name":"servant-server","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750990,"package_name":"servant","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750991,"package_name":"servant-multipart","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750886,"package_name":"base","ecosystem":"hackage","requirements":"\u003e=4.14 \u0026\u0026 \u003c5","direct":true,"kind":"runtime","optional":false},{"id":25877750887,"package_name":"optparse-applicative","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750891,"package_name":"text","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750892,"package_name":"containers","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750902,"package_name":"xeno","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750906,"package_name":"zip-archive","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750909,"package_name":"filepath","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750935,"package_name":"directory","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750946,"package_name":"mtl","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750954,"package_name":"exceptions","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750955,"package_name":"bytestring","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750968,"package_name":"deepseq","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750974,"package_name":"parallel","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750992,"package_name":"servant-openapi3","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750993,"package_name":"openapi3","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877750994,"package_name":"insert-ordered-containers","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751001,"package_name":"lens","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751007,"package_name":"warp","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751009,"package_name":"aeson","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751010,"package_name":"aeson-pretty","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751015,"package_name":"scientific","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751018,"package_name":"attoparsec","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751019,"package_name":"wai","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751020,"package_name":"wai-cors","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751021,"package_name":"wai-app-static","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751022,"package_name":"store","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751024,"package_name":"zstd","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751025,"package_name":"time","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751026,"package_name":"hashable","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751027,"package_name":"uuid","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751028,"package_name":"http-types","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751029,"package_name":"network-uri","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751032,"package_name":"streaming-commons","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751033,"package_name":"vector","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751034,"package_name":"random","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751035,"package_name":"mumps-hs","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751038,"package_name":"base64-bytestring","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751041,"package_name":"toml-reader","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751042,"package_name":"filelock","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751047,"package_name":"temporary","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751048,"package_name":"process","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751049,"package_name":"cassava","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751050,"package_name":"http-client","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751051,"package_name":"haskeline","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751059,"package_name":"megaparsec","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751063,"package_name":"unicode-transforms","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751064,"package_name":"transformers","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751066,"package_name":"volca","ecosystem":"hackage","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":25877751067,"package_name":"wai-extra","ecosystem":"hackage","requirements":"\u003e=3.1.1","direct":true,"kind":"runtime","optional":false},{"id":25877751074,"package_name":"base","ecosystem":"hackage","requirements":"\u003e=4.14 \u0026\u0026 \u003c5","direct":true,"kind":"test","optional":false},{"id":25877751075,"package_name":"volca","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751076,"package_name":"hspec","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751078,"package_name":"text","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751079,"package_name":"containers","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751080,"package_name":"vector","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751081,"package_name":"bytestring","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751082,"package_name":"zip-archive","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751083,"package_name":"temporary","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751084,"package_name":"time","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751085,"package_name":"aeson","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751086,"package_name":"stm","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751087,"package_name":"http-client","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751088,"package_name":"http-types","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751089,"package_name":"process","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751090,"package_name":"uuid","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751091,"package_name":"filepath","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751092,"package_name":"directory","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751093,"package_name":"async","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751094,"package_name":"warp","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751095,"package_name":"wai","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751096,"package_name":"servant-server","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751097,"package_name":"servant","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751098,"package_name":"network-uri","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751099,"package_name":"base64-bytestring","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751100,"package_name":"optparse-applicative","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751101,"package_name":"QuickCheck","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751103,"package_name":"network","ecosystem":"hackage","requirements":"*","direct":true,"kind":"test","optional":false},{"id":25877751104,"package_name":"hspec-discover","ecosystem":"hackage","requirements":"*","direct":true,"kind":"build","optional":false},{"id":25877751110,"package_name":"base","ecosystem":"hackage","requirements":"\u003e=4.14 \u0026\u0026 \u003c5","direct":true,"kind":"benchmark","optional":false},{"id":25877751111,"package_name":"volca","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751112,"package_name":"aeson","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751113,"package_name":"aeson-pretty","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751114,"package_name":"async","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751115,"package_name":"bytestring","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751116,"package_name":"containers","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751117,"package_name":"criterion","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751118,"package_name":"criterion-measurement","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751122,"package_name":"deepseq","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751123,"package_name":"directory","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751124,"package_name":"filepath","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751125,"package_name":"process","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751126,"package_name":"random","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751127,"package_name":"text","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751128,"package_name":"time","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751129,"package_name":"uuid","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false},{"id":25877751130,"package_name":"vector","ecosystem":"hackage","requirements":"*","direct":true,"kind":"benchmark","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/pyvolca-release.yml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:34.304Z","updated_at":"2026-06-27T02:00:34.304Z","repository_link":"https://github.com/ccomb/volca/blob/main/.github/workflows/pyvolca-release.yml","dependencies":[{"id":25877750854,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750855,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false},{"id":25877750856,"package_name":"actions/upload-artifact","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750857,"package_name":"actions/download-artifact","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750858,"package_name":"pypa/gh-action-pypi-publish","ecosystem":"actions","requirements":"release/v1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/format.yml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:33.861Z","updated_at":"2026-06-27T02:00:33.861Z","repository_link":"https://github.com/ccomb/volca/blob/main/.github/workflows/format.yml","dependencies":[{"id":25877750840,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750841,"package_name":"haskell-actions/run-fourmolu","ecosystem":"actions","requirements":"v12","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"docker","filepath":"docker/Dockerfile","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:34.544Z","updated_at":"2026-06-27T02:00:34.544Z","repository_link":"https://github.com/ccomb/volca/blob/main/docker/Dockerfile","dependencies":[{"id":25877750865,"package_name":"alpine","ecosystem":"docker","requirements":"${ALPINE_VERSION}","direct":true,"kind":"build","optional":false}]},{"ecosystem":"actions","filepath":".github/actions/publish-prebuilt-release/action.yml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:32.418Z","updated_at":"2026-06-27T02:00:32.418Z","repository_link":"https://github.com/ccomb/volca/blob/main/.github/actions/publish-prebuilt-release/action.yml","dependencies":[{"id":25877750795,"package_name":"actions/download-artifact","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/actions/setup-haskell-env/action.yml","sha":null,"kind":"manifest","created_at":"2026-06-27T02:00:32.511Z","updated_at":"2026-06-27T02:00:32.511Z","repository_link":"https://github.com/ccomb/volca/blob/main/.github/actions/setup-haskell-env/action.yml","dependencies":[{"id":25877750798,"package_name":"msys2/setup-msys2","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":25877750804,"package_name":"actions/cache","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25877750805,"package_name":"actions/cache/restore","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]}],"score":8.821142236331891,"created_at":"2026-06-22T22:36:07.032Z","updated_at":"2026-07-18T12:01:19.930Z","avatar_url":"https://github.com/ccomb.png","language":"Haskell","category":"Industrial Ecology","sub_category":"Life Cycle Assessment","monthly_downloads":846,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# VoLCA\n\n**VoLCA** is a Life Cycle Assessment engine that turns LCA databases into inspectable, queryable answers — fast.\n\nIt loads EcoSpold2, EcoSpold1, SimaPro CSV, ILCD process, and Brightway Excel databases, builds supply chain dependency trees, computes life cycle inventories using sparse matrix algebra, and applies characterization methods for impact assessment. Everything runs in-memory against your own data.\n\n## What It Does\n\n- **Browse** activities and flows across multiple databases\n- **Explore** supply chain trees, force-directed dependency graphs, downstream consumers, shortest-path routing, and supply chain analysis by sector classification\n- **Compute** life cycle inventories (LCI) and impact scores (LCIA) — single method or whole collection — with per-flow and per-activity contribution breakdowns\n- **What-if substitutions** — swap an upstream activity (or a cross-database supplier) and recompute inventory and impacts in a single call\n- **Normalize and weight** LCIA results with Raw / Normalized / Weighted view toggle; compute a single-score in Pt when normalization-weighting data is available\n- **Map** method characterization factors to database flows with a 4-step cascade (UUID → CAS → name → synonym) and coverage statistics\n- **Link** databases across nomenclatures (e.g., a sector database referencing Agribalyse)\n- **Upload** databases and method collections via the API, without touching config files\n\n---\n\n## Key Features\n\n- **Multiple database formats**: EcoSpold2 (.spold), EcoSpold1 (.xml), SimaPro CSV, ILCD process datasets, Brightway Excel (.xlsx)\n- **Archive support**: Load databases directly from .zip, .7z, .gz, or .xz archives — no manual extraction\n- **Cross-database linking**: Resolve supplier references across databases, with configurable dependencies and topological load ordering. EcoSpold2 inputs link to a loaded background by exact `activityLinkId` identity (so a partial import resolves against its matching release), falling back to attribute matching — flagged as approximate — when the background is a different release\n- **Cross-DB what-if substitutions**: Swap an upstream activity at any depth — including suppliers in dependency databases — and recompute inventory and impacts through one endpoint\n- **LCIA method collections**: Load ILCD method packages (ZIP or directory), SimaPro method CSV exports, or tabular CSV from config\n- **Normalization and weighting**: Batch LCIA computes normalized and weighted scores per category and a single aggregated score (Pt) when NW data is present in the method collection\n- **Contribution analysis**: Per-flow and per-activity contributions to any LCIA score, ranked by share\n- **Flow mapping engine**: 4-step matching cascade (UUID → CAS → name → synonym) with per-strategy coverage statistics\n- **Activity classifications**: ISIC, CPC, and category fields parsed from EcoSpold1/2 and ILCD, with named TOML presets for common filter bundles\n- **Per-exchange comments**: Free-text exchange comments extracted from EcoSpold1/2, SimaPro, and ILCD and surfaced in API responses\n- **Fuzzy search**: Trigram-based typo and stem tolerance on activity and supply-chain name filters\n- **Auto-extracted synonyms**: Synonym pairs extracted automatically from loaded databases and method packages, available for toggling and download\n- **Reference data management**: Flow synonyms, compartment mappings, and unit definitions can be configured in TOML, uploaded via the API, or toggled independently\n- **Fast cache**: Per-database cache co-located with the source path, with automatic schema-based invalidation; large databases (26k activities) load in ~47s cold, ~3.4s cached\n- **Optional access control**: Single-code login with cookie-based session\n\n---\n\n## Performance\n\nAll figures measured on Ecoinvent 3.12 (26 533 activities) on a 4-core machine.\n\n| Phase | Cold start | Hot start |\n|---|---|---|\n| Startup (read all 26 533 EcoSpold files from disk) | ~50 s | — |\n| Hot startup — load from cache | — | ~3.7 s |\n| First computation after startup (inventory, impact score)¹ | ~90 ms | ~8.5 s |\n| Next computations (inventory, impact score) | ~85 ms | ~85 ms |\n| Batch of 200 computations | ~19 s total (10/sec) | ~19 s total (10/sec) |\n| Computation of a modified process (upstream process substitution) | ~120 ms | ~110 ms |\n\n¹ The matrix factorisation is deferred to the first computation and cached for the lifetime of the server. All subsequent requests reuse it.\n\n---\n\n## Getting Started\n\n### Web Server\n\n```bash\n./build.sh\n\n# Start the server\nvolca --config volca.toml server --port 8080\n# Open http://localhost:8080\n```\n\n### Command Line\n\nThe CLI is a lightweight HTTP client that connects to a running server (~0.2s per command). Start the server once, then query it freely:\n\n```bash\n# Start server (loads databases into memory once)\nvolca --config volca.toml server --port 8080\n\n# In another terminal — all commands talk to the server via HTTP\nvolca --config volca.toml activities --name \"electricity\" --geo \"FR\"\nvolca --config volca.toml --db agribalyse inventory \"12345678-...\"\nvolca --config volca.toml --db agribalyse impacts \"12345678-...\" --method METHOD_UUID\n```\n\n### Interactive REPL\n\n```bash\n# Launch REPL (auto-starts the server if not running)\nvolca --config volca.toml repl\n\n# Inside the REPL:\n# volca\u003e activities --name \"wheat\"\n# volca\u003e use agribalyse\n# volca[agribalyse]\u003e inventory UUID\n# volca[agribalyse]\u003e :format table\n# volca[agribalyse]\u003e impacts UUID --method METHOD_UUID\n# volca[agribalyse]\u003e :help\n# volca[agribalyse]\u003e :quit\n```\n\n---\n\n## Configuration\n\nA TOML config file enables multi-database setups, method collections, and reference data:\n\n```toml\n[server]\nport = 8080\nhost = \"127.0.0.1\"\npassword = \"mysecret\"          # optional — omit to disable auth\n\n[[databases]]\nname = \"agribalyse-3.2\"\ndisplayName = \"Agribalyse 3.2\"\npath = \"DBs/AGB32_final.CSV\"\ndescription = \"SimaPro CSV\"\nload = true\n\n[[databases]]\nname = \"my-sector-db\"\ndisplayName = \"Sector DB\"\npath = \"DBs/sector.CSV\"\ndepends = [\"agribalyse-3.2\"]   # loads agribalyse first, then links\nload = true\n\n[[methods]]\nname = \"EF-3.1\"\npath = \"DBs/EF-v3.1.zip\"      # ILCD method package (ZIP or directory)\n\n# SimaPro method CSV exports and tabular CSV are also accepted:\n# path = \"DBs/EF3.1_methods.csv\"\n\n[[flow-synonyms]]\nname = \"Default flow synonyms\"\npath = \"data/flows.csv\"        # CSV with two columns: name1,name2\nactive = true\n\n[[compartment-mappings]]\nname = \"Default compartment mapping\"\npath = \"data/compartments.csv\"\nactive = true\n\n[[units]]\nname = \"Default units\"\npath = \"data/units.csv\"\nactive = true\n```\n\nThe `depends` field ensures dependency databases load first and their flows are available for cross-database linking. Setting `load = true` on a database transitively loads all its dependencies.\n\nA database's dependency set is **pinned**: it is seeded automatically when the database is first staged (the minimal set of supplier databases needed to resolve its links), and from then on it is authoritative. A plain `relink` re-resolves links *within* the pinned set only — it never silently adds another loaded database. Edit the pin explicitly with `add-dependency` / `remove-dependency`, then `finalize`; the new set is written to the matrix cache and reused on every later open. This is how you restrict a consumer (e.g. an inventory built against a single Agribalyse version) to exactly the supplier databases it should depend on, even while other versions stay loaded for other consumers. (The one exception is a *mapping* relink — `relink` with a `depDb` and an alias CSV — which pins that chosen dependency in-memory if it isn't already, so a `copy → delete → relink` pipeline composes in one pass; links to the other pinned dependencies are preserved, not dropped.)\n\n---\n\n## REST API\n\nAll per-database resources are scoped under `/api/v1/db/{dbName}/`. POST variants of the analysis endpoints accept a `SubstitutionRequest` body for what-if scenarios:\n\n```\n# Activity inspection\nGET    /api/v1/db/{dbName}/activity/{processId}                          Activity details\nGET    /api/v1/db/{dbName}/activity/{processId}/flows                    Exchanges as flow summaries\nGET    /api/v1/db/{dbName}/activity/{processId}/inputs                   Input exchanges\nGET    /api/v1/db/{dbName}/activity/{processId}/outputs                  Output exchanges\nGET    /api/v1/db/{dbName}/activity/{processId}/reference-product        Reference product detail\n\n# Supply chain\nGET    /api/v1/db/{dbName}/activity/{processId}/tree                     Supply chain tree\nGET    /api/v1/db/{dbName}/activity/{processId}/graph?cutoff=            Force-directed graph\nGET    /api/v1/db/{dbName}/activity/{processId}/supply-chain             Flat supply-chain table (filters, sort, paging)\nPOST   /api/v1/db/{dbName}/activity/{processId}/supply-chain             Same, with substitutions applied\nGET    /api/v1/db/{dbName}/activity/{processId}/consumers                Downstream activities consuming this one\nGET    /api/v1/db/{dbName}/activity/{processId}/path-to?target=          Shortest supply-chain path to a target activity\nGET    /api/v1/db/{dbName}/activity/{processId}/aggregate                SQL-style group/filter on exchanges, supply chain, or biosphere\nGET    /api/v1/db/{dbName}/activity/{processId}/analyze/{analyzerName}   Run a registered plugin analyzer\n\n# Inventory and impacts\nGET    /api/v1/db/{dbName}/activity/{processId}/inventory                Life cycle inventory (LCI)\nPOST   /api/v1/db/{dbName}/activity/{processId}/inventory                LCI with substitutions\nGET    /api/v1/db/{dbName}/activity/{processId}/impacts/{collection}     Batch LCIA across a method collection (NW + single-score when available)\nPOST   /api/v1/db/{dbName}/activity/{processId}/impacts/{collection}     Batch LCIA with substitutions\nGET    /api/v1/db/{dbName}/activity/{processId}/impacts/{collection}/{methodId}   LCIA score for one method (with top-flows)\nPOST   /api/v1/db/{dbName}/activity/{processId}/impacts/{collection}/{methodId}   Same, with substitutions\nGET    /api/v1/db/{dbName}/activity/{processId}/contributing-flows/{collection}/{methodId}        Top biosphere flows by score share\nGET    /api/v1/db/{dbName}/activity/{processId}/contributing-activities/{collection}/{methodId}   Top upstream activities by score share\nPOST   /api/v1/db/{dbName}/impacts/{collection}                          Batch-impacts for many activities (multi-RHS solve)\n\n# Search and reference data\nGET    /api/v1/db/{dbName}/activities?name=\u0026geo=\u0026product=\u0026preset=\u0026classification=\u0026sort=  Search activities\nGET    /api/v1/db/{dbName}/flows?q=\u0026lang=                                Search flows\nGET    /api/v1/db/{dbName}/flow/{flowId}                                 Flow details\nGET    /api/v1/db/{dbName}/flow/{flowId}/activities                      Activities using a flow\nGET    /api/v1/db/{dbName}/classifications                               Classification systems available in this DB\nGET    /api/v1/db/{dbName}/method/{methodId}/mapping                     Mapping coverage stats\nGET    /api/v1/db/{dbName}/method/{methodId}/flow-mapping                Per-flow mapping detail\nGET    /api/v1/db/{dbName}/method/{methodId}/characterization?flow=      Characterization factors for one DB flow\n\n# Database management\nGET    /api/v1/db                                                        List databases (status + dependencies)\nPOST   /api/v1/db/upload                                                 Upload a database archive\nPOST   /api/v1/db/{dbName}/load                                          Load a configured database\nPOST   /api/v1/db/{dbName}/unload                                        Unload (keep config, free memory)\nPOST   /api/v1/db/{dbName}/relink                                        Re-resolve cross-DB links (optional JSON body: depDb + mappingCsv for an alias relink)\nPOST   /api/v1/db/{dbName}/finalize                                      Finalize cross-DB linking\nDELETE /api/v1/db/{dbName}                                               Delete a database\nGET    /api/v1/db/{dbName}/setup                                         Setup info (path, dependencies)\nPOST   /api/v1/db/{dbName}/add-dependency/{depName}                      Add a dep\nPOST   /api/v1/db/{dbName}/remove-dependency/{depName}                   Remove a dep\nPOST   /api/v1/db/{dbName}/set-data-path                                 Repoint the source path\n\n# Methods and method collections\nGET    /api/v1/methods                                                   List individual methods (flattened)\nGET    /api/v1/method/{methodId}                                         Method details\nGET    /api/v1/method/{methodId}/factors                                 Characterization factors\nGET    /api/v1/method-collections                                        List method collections\nPOST   /api/v1/method-collections/{name}/load                            Load a method collection\nPOST   /api/v1/method-collections/{name}/unload                          Unload a method collection\nPOST   /api/v1/method-collections/upload                                 Upload a method package\nDELETE /api/v1/method-collections/{name}                                 Delete a method collection\n\n# Reference data (synonyms / compartments / units share the same shape)\nGET    /api/v1/{flow-synonyms|compartment-mappings|units}                List\nPOST   /api/v1/{flow-synonyms|compartment-mappings|units}/{name}/load    Activate\nPOST   /api/v1/{flow-synonyms|compartment-mappings|units}/{name}/unload  Deactivate\nPOST   /api/v1/{flow-synonyms|compartment-mappings|units}/upload         Upload\nDELETE /api/v1/{flow-synonyms|compartment-mappings|units}/{name}         Delete\nGET    /api/v1/flow-synonyms/{name}/groups                               Browse synonym groups\nGET    /api/v1/flow-synonyms/{name}/download                             Download synonym CSV\n\n# Server\nGET    /api/v1/classification-presets                                    Named classification filter bundles (from TOML)\nGET    /api/v1/version                                                   Server version\nGET    /api/v1/stats                                                     Runtime stats (memory)\nGET    /api/v1/hosting                                                   Hosting config (managed instances)\nGET    /api/v1/logs?since=                                               Server logs\nPOST   /api/v1/auth                                                      Login (returns session cookie)\n```\n\nPer-exchange data on inventory and impact responses includes `exComment` — the free-text comment (`generalComment` / `\u003ccomment\u003e`) attached to each exchange in the source dataset, when present.\n\nThe `impacts/{collection}` response includes per-category `normalizedScore` and `weightedScore` fields (when normalization-weighting data is present in the method collection), plus a `singleScore` sum in Pt.\n\n### OpenAPI spec\n\nThe full OpenAPI 3.0 specification is served at runtime:\n\n- **`GET /api/v1/openapi.json`** — machine-readable spec (for code generation, tooling)\n- **`GET /api/v1/docs`** — Swagger UI (interactive browser)\n\nUse these to build your own frontend, generate a typed client, or explore the API interactively.\n\n---\n\n## MCP Server\n\nVoLCA exposes an [MCP (Model Context Protocol)](https://modelcontextprotocol.io/) endpoint at `POST /mcp`, making LCA data queryable by AI assistants (Claude, Cursor, etc.) natively.\n\nConfigure it in your MCP client:\n\n```json\n{\n  \"mcpServers\": {\n    \"volca\": {\n      \"url\": \"http://localhost:8080/mcp\"\n    }\n  }\n}\n```\n\nAvailable tools (auto-derived from a single resource registry shared with the REST API and OpenAPI spec, so the three surfaces never drift):\n\n| Tool | Description |\n|------|-------------|\n| `list_databases` | List loaded databases (with dependencies) |\n| `list_presets` | List named classification filter presets |\n| `list_geographies` | List geographies present in a database |\n| `list_classifications` | List classification systems and values for a database |\n| `list_methods` | List loaded impact assessment methods |\n| `search_activities` | Search by name, geography, product, classification, or preset |\n| `search_flows` | Search biosphere flows |\n| `get_activity` | Activity details and exchanges (with comments) |\n| `aggregate` | SQL-style group/filter on exchanges, supply chain, or biosphere |\n| `get_supply_chain` | Flat upstream activity list with quantities and filters |\n| `get_consumers` | Downstream activities that consume a given activity |\n| `get_path_to` | Shortest supply-chain path from one activity to another |\n| `get_inventory` | LCI biosphere flows (top N by quantity) |\n| `get_impacts` | LCIA score for an activity and method (accepts substitutions) |\n| `score_activity` | Full LCIA panel + every configured scoring set for one activity (replaces N×get_impacts calls) |\n| `score_activities` | Same shape as score_activity, batched over N activities in one multi-RHS solve |\n| `list_scoring_sets` | List formula-based scoring sets configured on every loaded method collection |\n| `get_contributing_flows` | Top biosphere flows contributing to an LCIA score |\n| `get_contributing_activities` | Top upstream activities contributing to an LCIA score |\n| `get_flow_mapping` | CF-to-flow mapping coverage for a method |\n| `get_characterization` | Characterization factors for a flow under a method |\n\nAuthentication uses the same password as the REST API.\n\n---\n\n## CLI Commands\n\n### Global Options\n\n| Option | Description |\n|--------|-------------|\n| `--config FILE` | TOML config file for multi-database setup |\n| `--url URL` | Server URL (default: from config; or set `VOLCA_URL`) |\n| `--password PWD` | Server password (or set `VOLCA_PASSWORD`) |\n| `--db NAME` | Database name to query |\n| `--format FORMAT` | Output format: `pretty` (default), `json`, `table`, `csv` |\n| `--jsonpath PATH` | Field to extract for CSV output (e.g., `srResults`) |\n| `--no-cache` | Disable caching (for development) |\n\n### Modes of Operation\n\n```bash\n# Start server (loads databases — run once)\nvolca --config volca.toml server --port 8080\n\n# Single HTTP command (connects to running server, ~0.2s)\nvolca --config volca.toml [--db NAME] COMMAND [OPTIONS]\n\n# Interactive REPL (auto-starts server if not running)\nvolca --config volca.toml repl\n```\n\n### Search\n\n```bash\nvolca activities --name \"electricity\" --geo \"DE\" --limit 10\nvolca activities --product \"steel\" --limit 10 --offset 20\nvolca flows --query \"carbon dioxide\" --limit 5\n```\n\n### Analysis\n\n```bash\n# Activity details\nvolca activity \"12345678-...\"\n\n# Life cycle inventory\nvolca inventory \"12345678-...\"\n\n# Impact assessment (--method takes a method UUID, not a file path)\nvolca impacts \"12345678-...\" --method METHOD_UUID\n\n# Matrix export (Ecoinvent universal format — runs locally, not via HTTP)\nvolca export-matrices ./output_dir\n```\n\nThe `tree`, `supply-chain`, `consumers`, `path-to`, `aggregate`, and contribution\nendpoints are reachable via the REST API and MCP. Use `curl` or the OpenAPI spec\nat `/api/v1/docs` to drive them while the CLI focuses on the most common\ncommands.\n\n### Flow Mapping Diagnostics\n\n```bash\n# Summary: how well does a method match a database?\nvolca --db agribalyse mapping METHOD_UUID\n\n# See every mapped CF with its match strategy (uuid/cas/name/synonym)\nvolca --db agribalyse mapping METHOD_UUID --matched\n\n# List CFs that found no DB flow\nvolca --db agribalyse mapping METHOD_UUID --unmatched\n\n# List DB biosphere flows with no CF\nvolca --db agribalyse mapping METHOD_UUID --uncharacterized\n\n# Machine-readable output\nvolca --db agribalyse mapping METHOD_UUID --matched --format json\n```\n\n### Database and Method Management\n\n```bash\n# List, upload, delete databases\nvolca database                                  # list (default)\nvolca database upload mydb.7z --name \"My DB\"    # upload\nvolca database delete my-db                     # delete\n\n# List, upload, delete method collections\nvolca method                                    # list (default)\nvolca method upload EF-3.1.zip --name \"EF 3.1\"  # upload\nvolca method delete ef-31                        # delete\n```\n\n---\n\n## API and CLI Feature Matrix\n\n| Feature | REST API | CLI |\n|---------|----------|-----|\n| **Search** | | |\n| Search activities | `GET /db/{db}/activities?name=\u0026geo=\u0026product=\u0026preset=\u0026classification=` | `activities --name --geo --product` |\n| Search flows | `GET /db/{db}/flows?q=\u0026lang=` | `flows --query --lang` |\n| Classifications | `GET /db/{db}/classifications` | — |\n| Classification presets | `GET /classification-presets` | — |\n| **Analysis** | | |\n| Activity details | `GET /db/{db}/activity/{id}` | `activity ID` |\n| Supply chain tree | `GET /db/{db}/activity/{id}/tree` | — |\n| Supply chain (flat) | `GET\\|POST /db/{db}/activity/{id}/supply-chain` | — |\n| Supply chain graph | `GET /db/{db}/activity/{id}/graph?cutoff=` | — |\n| Downstream consumers | `GET /db/{db}/activity/{id}/consumers` | — |\n| Path to target | `GET /db/{db}/activity/{id}/path-to?target=` | — |\n| Aggregate | `GET /db/{db}/activity/{id}/aggregate` | — |\n| Life cycle inventory | `GET\\|POST /db/{db}/activity/{id}/inventory` | `inventory ID` |\n| LCIA batch (collection) | `GET\\|POST /db/{db}/activity/{id}/impacts/{collection}` | — |\n| LCIA single method | `GET\\|POST /db/{db}/activity/{id}/impacts/{collection}/{methodId}` | `impacts ID --method METHOD_UUID` |\n| LCIA batch over many activities | `POST /db/{db}/impacts/{collection}` | — |\n| Contributing flows | `GET /db/{db}/activity/{id}/contributing-flows/{collection}/{methodId}` | — |\n| Contributing activities | `GET /db/{db}/activity/{id}/contributing-activities/{collection}/{methodId}` | — |\n| Flow details | `GET /db/{db}/flow/{flowId}` | `flow FLOW_ID` |\n| Flow activities | `GET /db/{db}/flow/{flowId}/activities` | `flow FLOW_ID activities` |\n| **Flow Mapping** | | |\n| Mapping coverage | `GET /db/{db}/method/{id}/mapping` | `flow-mapping METHOD_UUID` |\n| Per-flow mapping | `GET /db/{db}/method/{id}/flow-mapping` | `flow-mapping METHOD_UUID --matched` |\n| Characterization for flow | `GET /db/{db}/method/{id}/characterization?flow=` | — |\n| Unmatched CFs | included in mapping response | `flow-mapping METHOD_UUID --unmatched` |\n| Uncharacterized flows | — | `flow-mapping METHOD_UUID --uncharacterized` |\n| **Database Management** | | |\n| List databases | `GET /db` | `database` |\n| Upload database | `POST /db/upload` | `database upload FILE --name NAME` |\n| Load / unload | `POST /db/{name}/(load\\|unload)` | — (use config `load = true`) |\n| Relink / finalize | `POST /db/{name}/(relink\\|finalize)` | — |\n| Setup / dependencies | `GET /db/{name}/setup`, `POST .../{add,remove}-dependency/{dep}`, `POST .../set-data-path` | — |\n| Delete database | `DELETE /db/{name}` | `database delete NAME` |\n| **Method Management** | | |\n| List methods | `GET /methods` | `methods` |\n| Method details | `GET /method/{id}` | — |\n| Method factors | `GET /method/{id}/factors` | — |\n| List collections | `GET /method-collections` | `method` |\n| Upload collection | `POST /method-collections/upload` | `method upload FILE --name NAME` |\n| Load / unload collection | `POST /method-collections/{name}/(load\\|unload)` | — |\n| Delete collection | `DELETE /method-collections/{name}` | `method delete NAME` |\n| **Reference Data** | | |\n| Flow synonyms | `GET /flow-synonyms` (+ load/unload/upload/delete/groups/download) | `synonyms` |\n| Compartment mappings | `GET /compartment-mappings` (+ load/unload/upload/delete) | `compartment-mappings` |\n| Units | `GET /units` (+ load/unload/upload/delete) | `units` |\n| **Plugins** | | |\n| List plugins | — | `plugin list` |\n| Run analyzer | `GET /db/{db}/activity/{id}/analyze/{name}` | — |\n| **Matrix Export** | | |\n| Universal format | — | `export-matrices DIR` (local only) |\n| Debug matrices | — | `debug-matrices ID --output FILE` (local only) |\n| **Server** | | |\n| Version / stats / hosting / logs | `GET /version`, `/stats`, `/hosting`, `/logs?since=` | — |\n| Stop server | — | `stop` |\n| REPL | — | `repl` |\n| Login | `POST /auth` | — |\n\nAll API routes are prefixed with `/api/v1/`. A dash (—) means the feature is only available in one interface.\n\n---\n\n\n## Building\n\n### Linux\n\nInstall dependencies, then build. MUMPS is built from source by `build-mumps.sh` if no system package is found:\n\n```bash\n# Debian/Ubuntu\nsudo apt install build-essential gfortran python3 curl zlib1g-dev libblas-dev liblapack-dev upx-ucl\n\n# Fedora\nsudo dnf install gcc gcc-c++ gcc-gfortran make python3 curl zlib-devel blas-devel lapack-devel\n\n# Arch Linux\nsudo pacman -S base-devel gcc-fortran python curl zlib blas lapack\n```\n\nInstall the [Haskell toolchain via GHCup](https://www.haskell.org/ghcup/), then:\n\n```bash\n./build.sh              # Build\n./build.sh --test       # Build and run tests\n```\n\n`build.sh` also accepts:\n\n- `--clean` / `--all` — discard `dist-newstyle/` before building\n- `--coverage` — run tests with coverage and emit an HTML report\n- `--static` — produce a statically-linked binary (Linux only)\n- `--no-optimize` — skip `strip` and UPX. Use this when downstream\n  tooling needs to rewrite the binary's dynamic load commands\n  (`dylibbundler`, `install_name_tool` for the macOS `.app`).\n\n### macOS (Apple Silicon)\n\nTested on macOS 13 Ventura and later, arm64 only. The build pins\n`MACOSX_DEPLOYMENT_TARGET=13.0` so binaries produced on a recent macOS still\nload on Ventura.\n\n```bash\n# Xcode Command Line Tools (provides clang, ld64, the macOS SDK)\nxcode-select --install\n\n# Homebrew\n/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"\neval \"$(/opt/homebrew/bin/brew shellenv)\"\n\n# Native deps. gcc brings gfortran + libgfortran/libquadmath; openblas\n# provides BLAS/LAPACK (Accelerate.framework's LAPACK ABI does not match\n# what MUMPS emits). dylibbundler is needed only for the Tauri desktop bundle.\nbrew install ghcup gcc openblas python3 curl node rust elm upx\n\n# Haskell toolchain\nghcup install ghc 9.12.4 --set\nghcup install cabal latest\nsource ~/.ghcup/env\n\n./build.sh              # Build (sources MUMPS 5.8.1, ~3 min one-time)\n./build.sh --test       # Build and run tests\n```\n\nMUMPS sources are pinned via `MUMPS_VERSION` in `versions.env` and built\ninto `deps/mumps/` (cached across runs).\n\n### Windows (MSYS2)\n\n1. Install [MSYS2](https://www.msys2.org/) and open the \"MSYS2 UCRT64\" terminal\n2. Install dependencies:\n   ```bash\n   pacman -S \\\n     mingw-w64-ucrt-x86_64-gcc \\\n     mingw-w64-ucrt-x86_64-gcc-fortran \\\n     mingw-w64-ucrt-x86_64-openblas \\\n     mingw-w64-ucrt-x86_64-cmake \\\n     mingw-w64-ucrt-x86_64-make \\\n     mingw-w64-ucrt-x86_64-python \\\n     mingw-w64-ucrt-x86_64-upx \\\n     make python git curl tar\n   ```\n3. Install [GHCup](https://www.haskell.org/ghcup/) for the compiler toolchain\n4. Run:\n   ```bash\n   ./build.sh            # Same script as Linux/macOS — builds MUMPS from source\n   ```\n\n### Docker\n\n```bash\ndocker build -f docker/Dockerfile -t volca .\ndocker run -p 8080:8080 -v /path/to/data:/data volca\n```\n\n---\n\n## Testing\n\n```bash\n./build.sh --test\n\n# Or manually\ncabal test --test-show-details=streaming\n```\n\nTests cover matrix construction (sign convention), inventory calculation (golden values), parsers (EcoSpold1/2, ILCD, SimaPro, Brightway Excel, classification fields), and matrix export format compliance.\n\n---\n\n## License \u0026 third-party software\n\nVoLCA is licensed under the **Apache License 2.0** — see [LICENSE](LICENSE).\n\nThird-party components bundled with or linked into VoLCA are inventoried in\n[NOTICE](NOTICE) and [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md). The\nnotable ones are MUMPS 5.8.1 (CeCILL-C), BLAS/LAPACK (BSD-3), and a number of\nHaskell libraries (predominantly BSD-3 and MIT).\n\nA running engine also exposes the same inventory as JSON at\n`/api/v1/licenses` so any client can render it.\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/359088","html_url":"https://ost.ecosyste.ms/projects/359088"}