{"id":318695,"name":"bioenergy.org","description":"A site dedicated to creating FAIR datasets to share across bioenergy research centers and to the global research community.","url":"https://github.com/bioenergy-research-centers/bioenergy.org","last_synced_at":"2026-07-28T09:30:36.426Z","repository":{"id":279893144,"uuid":"679319243","full_name":"bioenergy-research-centers/bioenergy.org","owner":"bioenergy-research-centers","description":null,"archived":false,"fork":false,"pushed_at":"2026-07-23T15:23:50.000Z","size":8355,"stargazers_count":9,"open_issues_count":15,"forks_count":2,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-07-25T08:04:34.674Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://bioenergy.org/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bioenergy-research-centers.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","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}},"created_at":"2023-08-16T15:15:41.000Z","updated_at":"2026-07-23T15:24:44.000Z","dependencies_parsed_at":"2026-02-17T03:01:16.931Z","dependency_job_id":"42631728-c309-4198-b0b0-cb5de469daa8","html_url":"https://github.com/bioenergy-research-centers/bioenergy.org","commit_stats":null,"previous_names":["bioenergy-research-centers/bioenergy.org"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bioenergy-research-centers/bioenergy.org","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bioenergy-research-centers%2Fbioenergy.org","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bioenergy-research-centers%2Fbioenergy.org/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bioenergy-research-centers%2Fbioenergy.org/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bioenergy-research-centers%2Fbioenergy.org/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bioenergy-research-centers","download_url":"https://codeload.github.com/bioenergy-research-centers/bioenergy.org/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bioenergy-research-centers%2Fbioenergy.org/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35945273,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-27T02:00:06.776Z","response_time":101,"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":"bioenergy-research-centers","name":"bioenergy-research-centers","uuid":"142427124","kind":"organization","description":null,"email":null,"website":null,"location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/142427124?v=4","repositories_count":1,"last_synced_at":"2025-02-28T04:07:26.082Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/bioenergy-research-centers","funding_links":[],"total_stars":2,"followers":4,"following":0,"created_at":"2025-02-28T04:07:26.103Z","updated_at":"2025-02-28T04:07:26.103Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bioenergy-research-centers","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bioenergy-research-centers/repositories"},"packages":[],"commits":{"id":10358114,"full_name":"bioenergy-research-centers/bioenergy.org","default_branch":"main","total_commits":110,"total_committers":15,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":7.333333333333333,"dds":0.7727272727272727,"past_year_total_commits":43,"past_year_total_committers":8,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":5.375,"past_year_dds":0.4651162790697675,"last_synced_at":"2026-07-25T16:08:22.540Z","last_synced_commit":"c7d6cbc6fcde78a05112dc3b1d9f5aa1614acb38","created_at":"2025-06-16T00:02:46.269Z","updated_at":"2026-07-25T16:06:53.149Z","committers":[{"name":"Nick Thrower","email":"throwern@msu.edu","login":"throwern","count":25},{"name":"Valerie Autumn Skye","email":"12895168+valerie-autumn-skye","login":"valerie-autumn-skye","count":23},{"name":"Clint Cecil","email":"ccecil@wisc.edu","login":"thatRailsGuy","count":13},{"name":"Hector Plahar","email":"hplahar","login":"hplahar","count":11},{"name":"Chuck Parker","email":"ct-parker","login":"ct-parker","count":10},{"name":"Nathan Hillson","email":"njhillson@lbl.gov","login":"njhillson","count":9},{"name":"Harry Caufield","email":"j.harry.caufield@gmail.com","login":"caufieldjh","count":5},{"name":"ianderthal","email":"ianderthal","login":"ianderthal","count":3},{"name":"StantonMartin","email":"62398353+StantonMartin","login":"StantonMartin","count":3},{"name":"mkulawik","email":"121195+mkulawik","login":"mkulawik","count":2},{"name":"Mark A. Miller","email":"MAM@lbl.gov","login":"turbomam","count":2},{"name":"franflame","email":"81339239+franflame","login":"franflame","count":1},{"name":"Oliver Ruebel","email":"oruebel","login":"oruebel","count":1},{"name":"Leslie Stoecker","email":"lensor@illinois.edu","login":"lensor","count":1},{"name":"Dirk Norman (GLBRC)","email":"142447582+dnorman-glbrc","login":"dnorman-glbrc","count":1}],"past_year_committers":[{"name":"Valerie Autumn Skye","email":"12895168+valerie-autumn-skye","login":"valerie-autumn-skye","count":23},{"name":"Nick Thrower","email":"throwern@msu.edu","login":"throwern","count":10},{"name":"ianderthal","email":"ianderthal","login":"ianderthal","count":3},{"name":"Clinton Cecil","email":"ccecil@wisc.edu","login":"thatRailsGuy","count":2},{"name":"Charles Parker","email":"ct-parker","login":"ct-parker","count":2},{"name":"franflame","email":"81339239+franflame","login":"franflame","count":1},{"name":"StantonMartin","email":"62398353+StantonMartin","login":"StantonMartin","count":1},{"name":"Oliver Ruebel","email":"oruebel","login":"oruebel","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/bioenergy-research-centers%2Fbioenergy.org/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-07-27T00:00:18.956Z","repositories_count":6432018,"commits_count":882890737,"contributors_count":36848281,"owners_count":1244980,"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":"bioenergy-research-centers/bioenergy.org","html_url":"https://github.com/bioenergy-research-centers/bioenergy.org","last_synced_at":"2026-07-25T08:01:04.447Z","status":"active","issues_count":123,"pull_requests_count":89,"avg_time_to_close_issue":4374305.21686747,"avg_time_to_close_pull_request":933382.3243243244,"issues_closed_count":83,"pull_requests_closed_count":74,"pull_request_authors_count":10,"issue_authors_count":14,"avg_comments_per_issue":1.6991869918699187,"avg_comments_per_pull_request":1.0561797752808988,"merged_pull_requests_count":73,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":56,"past_year_pull_requests_count":39,"past_year_avg_time_to_close_issue":3352702.0857142857,"past_year_avg_time_to_close_pull_request":1135839.6153846155,"past_year_issues_closed_count":35,"past_year_pull_requests_closed_count":26,"past_year_pull_request_authors_count":6,"past_year_issue_authors_count":8,"past_year_avg_comments_per_issue":1.7857142857142858,"past_year_avg_comments_per_pull_request":1.5128205128205128,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":25,"created_at":"2025-06-16T00:02:49.852Z","updated_at":"2026-07-25T08:01:04.447Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/bioenergy-research-centers%2Fbioenergy.org","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/bioenergy-research-centers%2Fbioenergy.org/issues","issue_labels_count":{"enhancement":33,"bug":19,"help wanted":5,"question":3,"good first issue":2,"documentation":2,"invalid":1},"pull_request_labels_count":{"enhancement":29,"documentation":5,"bug":4},"issue_author_associations_count":{"CONTRIBUTOR":93,"MEMBER":27,"NONE":2,"COLLABORATOR":1},"pull_request_author_associations_count":{"CONTRIBUTOR":80,"MEMBER":8,"NONE":1},"issue_authors":{"valerie-autumn-skye":28,"caufieldjh":24,"throwern":22,"ct-parker":21,"hplahar":12,"dnorman-glbrc":3,"ianderthal":3,"thatRailsGuy":3,"StantonMartin":2,"njhillson":1,"cmungall":1,"mkulawik":1,"lensor":1,"franflame":1},"pull_request_authors":{"throwern":30,"valerie-autumn-skye":21,"hplahar":11,"ct-parker":10,"caufieldjh":6,"mkulawik":3,"ianderthal":3,"thatRailsGuy":2,"franflame":2,"oruebel":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-07-27T00:00:24.550Z","repositories_count":14848688,"issues_count":31372328,"pull_requests_count":102982804,"authors_count":11366193,"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":26,"bug":16,"documentation":2,"good first issue":2,"help wanted":2,"question":2},"past_year_pull_request_labels_count":{"enhancement":20,"bug":3,"documentation":3},"past_year_issue_author_associations_count":{"CONTRIBUTOR":41,"MEMBER":14,"NONE":1},"past_year_pull_request_author_associations_count":{"CONTRIBUTOR":36,"MEMBER":2,"NONE":1},"past_year_issue_authors":{"valerie-autumn-skye":28,"caufieldjh":11,"throwern":8,"ianderthal":3,"thatRailsGuy":3,"cmungall":1,"hplahar":1,"StantonMartin":1},"past_year_pull_request_authors":{"valerie-autumn-skye":21,"throwern":10,"ianderthal":3,"franflame":2,"thatRailsGuy":2,"oruebel":1},"maintainers":[{"login":"caufieldjh","count":30,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/caufieldjh"},{"login":"thatRailsGuy","count":5,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/thatRailsGuy"},{"login":"njhillson","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/njhillson"}],"active_maintainers":[{"login":"caufieldjh","count":11,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/caufieldjh"},{"login":"thatRailsGuy","count":5,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/thatRailsGuy"}]},"events":{"total":{"DeleteEvent":5,"PullRequestEvent":49,"ForkEvent":2,"IssuesEvent":68,"WatchEvent":3,"IssueCommentEvent":90,"PushEvent":86,"PublicEvent":1,"PullRequestReviewCommentEvent":7,"PullRequestReviewEvent":27,"CreateEvent":32},"last_year":{"DeleteEvent":2,"PullRequestEvent":19,"IssuesEvent":24,"IssueCommentEvent":26,"PushEvent":55,"PullRequestReviewCommentEvent":3,"PullRequestReviewEvent":12,"CreateEvent":16}},"keywords":[],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/qc.yaml","sha":null,"kind":"manifest","created_at":"2025-02-28T10:49:51.827Z","updated_at":"2025-02-28T10:49:51.827Z","repository_link":"https://github.com/bioenergy-research-centers/bioenergy.org/blob/main/.github/workflows/qc.yaml","dependencies":[{"id":22062833345,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3.0.2","direct":true,"kind":"composite","optional":false},{"id":22062833397,"package_name":"actions/setup-node","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"docker","filepath":"api/Dockerfile","sha":null,"kind":"manifest","created_at":"2025-02-28T10:49:52.288Z","updated_at":"2025-02-28T10:49:52.288Z","repository_link":"https://github.com/bioenergy-research-centers/bioenergy.org/blob/main/api/Dockerfile","dependencies":[{"id":22062833457,"package_name":"node","ecosystem":"docker","requirements":"20","direct":true,"kind":"build","optional":false}]},{"ecosystem":"docker","filepath":"client/Dockerfile","sha":null,"kind":"manifest","created_at":"2025-02-28T10:49:52.797Z","updated_at":"2025-02-28T10:49:52.797Z","repository_link":"https://github.com/bioenergy-research-centers/bioenergy.org/blob/main/client/Dockerfile","dependencies":[{"id":22062833557,"package_name":"node","ecosystem":"docker","requirements":"20","direct":true,"kind":"build","optional":false},{"id":22062833558,"package_name":"nginx","ecosystem":"docker","requirements":"stable-alpine","direct":true,"kind":"build","optional":false}]},{"ecosystem":"docker","filepath":"docker-compose.dev.yml","sha":null,"kind":"manifest","created_at":"2025-02-28T10:49:53.241Z","updated_at":"2025-02-28T10:49:53.241Z","repository_link":"https://github.com/bioenergy-research-centers/bioenergy.org/blob/main/docker-compose.dev.yml","dependencies":[]},{"ecosystem":"docker","filepath":"docker-compose.yml","sha":null,"kind":"manifest","created_at":"2025-02-28T10:49:53.332Z","updated_at":"2025-02-28T10:49:53.332Z","repository_link":"https://github.com/bioenergy-research-centers/bioenergy.org/blob/main/docker-compose.yml","dependencies":[]},{"ecosystem":"npm","filepath":"api/package.json","sha":null,"kind":"manifest","created_at":"2025-02-28T10:49:53.496Z","updated_at":"2025-02-28T10:49:53.496Z","repository_link":"https://github.com/bioenergy-research-centers/bioenergy.org/blob/main/api/package.json","dependencies":[{"id":22062833846,"package_name":"sanitize-html","ecosystem":"npm","requirements":"^2.14.0","direct":true,"kind":"runtime","optional":false},{"id":22062833847,"package_name":"sequelize","ecosystem":"npm","requirements":"^6.37.0","direct":true,"kind":"runtime","optional":false},{"id":22062833848,"package_name":"swagger-jsdoc","ecosystem":"npm","requirements":"^6.2.8","direct":true,"kind":"runtime","optional":false},{"id":22062833849,"package_name":"swagger-ui-express","ecosystem":"npm","requirements":"^5.0.0","direct":true,"kind":"runtime","optional":false},{"id":22062833930,"package_name":"sync-fetch","ecosystem":"npm","requirements":"^0.5.2","direct":true,"kind":"runtime","optional":false},{"id":22062833931,"package_name":"@faker-js/faker","ecosystem":"npm","requirements":"^8.4.1","direct":true,"kind":"development","optional":false},{"id":22062833706,"package_name":"@octokit/rest","ecosystem":"npm","requirements":"^21.1.0","direct":true,"kind":"runtime","optional":false},{"id":22062833707,"package_name":"ajv","ecosystem":"npm","requirements":"^8.17.1","direct":true,"kind":"runtime","optional":false},{"id":22062833708,"package_name":"ajv-formats","ecosystem":"npm","requirements":"^3.0.1","direct":true,"kind":"runtime","optional":false},{"id":22062833709,"package_name":"axios","ecosystem":"npm","requirements":"^1.7.7","direct":true,"kind":"runtime","optional":false},{"id":22062833710,"package_name":"body-parser","ecosystem":"npm","requirements":"^1.20.2","direct":true,"kind":"runtime","optional":false},{"id":22062833711,"package_name":"cors","ecosystem":"npm","requirements":"^2.8.5","direct":true,"kind":"runtime","optional":false},{"id":22062833712,"package_name":"dotenv","ecosystem":"npm","requirements":"^16.4.5","direct":true,"kind":"runtime","optional":false},{"id":22062833713,"package_name":"express","ecosystem":"npm","requirements":"^4.18.2","direct":true,"kind":"runtime","optional":false},{"id":22062833714,"package_name":"nodemon","ecosystem":"npm","requirements":"^3.1.7","direct":true,"kind":"runtime","optional":false},{"id":22062833715,"package_name":"pg","ecosystem":"npm","requirements":"^8.11.3","direct":true,"kind":"runtime","optional":false},{"id":22062833716,"package_name":"pg-hstore","ecosystem":"npm","requirements":"^2.3.4","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"npm","filepath":"client/package.json","sha":null,"kind":"manifest","created_at":"2025-02-28T10:49:54.613Z","updated_at":"2025-02-28T10:49:54.613Z","repository_link":"https://github.com/bioenergy-research-centers/bioenergy.org/blob/main/client/package.json","dependencies":[{"id":22062833978,"package_name":"@popperjs/core","ecosystem":"npm","requirements":"^2.11.8","direct":true,"kind":"runtime","optional":false},{"id":22062833979,"package_name":"axios","ecosystem":"npm","requirements":"^1.6.7","direct":true,"kind":"runtime","optional":false},{"id":22062833980,"package_name":"bootstrap","ecosystem":"npm","requirements":"^5.3.2","direct":true,"kind":"runtime","optional":false},{"id":22062834074,"package_name":"bootstrap-icons","ecosystem":"npm","requirements":"^1.11.3","direct":true,"kind":"runtime","optional":false},{"id":22062834075,"package_name":"dotenv","ecosystem":"npm","requirements":"^16.4.5","direct":true,"kind":"runtime","optional":false},{"id":22062834076,"package_name":"jquery","ecosystem":"npm","requirements":"^3.7.1","direct":true,"kind":"runtime","optional":false},{"id":22062834077,"package_name":"pinia","ecosystem":"npm","requirements":"^2.2.4","direct":true,"kind":"runtime","optional":false},{"id":22062834155,"package_name":"pinia-plugin-persistedstate","ecosystem":"npm","requirements":"^4.1.2","direct":true,"kind":"runtime","optional":false},{"id":22062834197,"package_name":"vue","ecosystem":"npm","requirements":"^3.4.15","direct":true,"kind":"runtime","optional":false},{"id":22062834245,"package_name":"vue-router","ecosystem":"npm","requirements":"^4.2.5","direct":true,"kind":"runtime","optional":false},{"id":22062834299,"package_name":"@rushstack/eslint-patch","ecosystem":"npm","requirements":"^1.3.3","direct":true,"kind":"development","optional":false},{"id":22062834428,"package_name":"@vitejs/plugin-vue","ecosystem":"npm","requirements":"^5.0.3","direct":true,"kind":"development","optional":false},{"id":22062834429,"package_name":"@vue/eslint-config-prettier","ecosystem":"npm","requirements":"^8.0.0","direct":true,"kind":"development","optional":false},{"id":22062834447,"package_name":"@vue/test-utils","ecosystem":"npm","requirements":"^2.4.4","direct":true,"kind":"development","optional":false},{"id":22062834448,"package_name":"cypress","ecosystem":"npm","requirements":"^13.6.3","direct":true,"kind":"development","optional":false},{"id":22062834449,"package_name":"eslint","ecosystem":"npm","requirements":"^8.49.0","direct":true,"kind":"development","optional":false},{"id":22062834450,"package_name":"eslint-plugin-cypress","ecosystem":"npm","requirements":"^2.15.1","direct":true,"kind":"development","optional":false},{"id":22062834476,"package_name":"eslint-plugin-vue","ecosystem":"npm","requirements":"^9.17.0","direct":true,"kind":"development","optional":false},{"id":22062834477,"package_name":"jsdom","ecosystem":"npm","requirements":"^24.0.0","direct":true,"kind":"development","optional":false},{"id":22062834478,"package_name":"prettier","ecosystem":"npm","requirements":"^3.0.3","direct":true,"kind":"development","optional":false},{"id":22062834479,"package_name":"start-server-and-test","ecosystem":"npm","requirements":"^2.0.3","direct":true,"kind":"development","optional":false},{"id":22062834480,"package_name":"vite","ecosystem":"npm","requirements":"^5.0.11","direct":true,"kind":"development","optional":false},{"id":22062834487,"package_name":"vitest","ecosystem":"npm","requirements":"^1.2.2","direct":true,"kind":"development","optional":false}]},{"ecosystem":"npm","filepath":"package.json","sha":null,"kind":"manifest","created_at":"2025-02-28T10:50:01.631Z","updated_at":"2025-02-28T10:50:01.631Z","repository_link":"https://github.com/bioenergy-research-centers/bioenergy.org/blob/main/package.json","dependencies":[{"id":22062834522,"package_name":"mvp","ecosystem":"npm","requirements":"file:api","direct":true,"kind":"runtime","optional":false}]}],"score":5.886104031450156,"created_at":"2025-06-16T00:02:00.704Z","updated_at":"2026-07-28T09:30:36.428Z","avatar_url":"https://github.com/bioenergy-research-centers.png","language":"JavaScript","category":"Renewable Energy","sub_category":"Bioenergy","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# [bioenergy.org](https://bioenergy.org/)\n\nA site dedicated to creating FAIR data products to share across bioenergy research centers (BRCs) and to the global research community.\n\n## Resources\n\n- [Github group](https://github.com/bioenergy-research-centers)\n- [Slack workspace](https://join.slack.com/t/cross-brc/shared_invite/zt-3axq9jgvp-GjNN9RlDPwLSDVXC9fZUkw)\n- [Contribution Guide](CONTRIBUTING.md)\n\n\n## Points of contact at each BRC\n\n- JBEI  = Hector Plahar (haplahar@lbl.gov)\n- GLBRC = Dirk Norman (dirk.norman@wisc.edu)\n- CABBI = Katie Bowman (krhodges@illinois.edu)\n- CBI = Stanton Martin (martins@ornl.gov)\n\n## Tech contacts\n\n- Hector Plahar\n- Nick Thrower\n- Clint Cecil\n\n## Development\n\nPrerequisites:\n\n- Docker\n- Docker Compose\n- Node.js (version in .nvmrc), recommend using a version manager like nvm or asdf\n- Postman is useful for testing the api.\n\nThe application is a monorepo with two main components. The client is a Vue.js application and the API is an Express application.\n\n### Running a postgres container\n\nThe following command will run a postgres container with the password `mysecretpassword` and expose the database on port 6432.\n\n`docker run --name postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 6432:5432 postgres`\n\n### Running the application\n\n- Copy the `.env.sample` file to `.env` and fill in the environment variables. These can also be set as environment variables on your system.\n- Docker Compose:\n  - To run the application in production mode, run `docker-compose up` in the root directory of the project. This will start the nginx server for the client, the express server for the API, and the Postgres database.\n  - To run the application in development mode, run `docker compose -f docker-compose.dev.yml up --build --watch`. This will start the client and API in development mode with hot reloading.\n  - You can run `docker-compose down` to stop the application and destroy the containers and volumes.\n  - Running `docker-compose up --build` will rebuild the containers and restart the application.\n\n### Testing\n\nTests use [Vitest](https://vitest.dev/) and run inside Docker containers. No database connection is required.\n\n```bash\n# Run API tests\ndocker compose -f docker-compose.dev.yml run --rm --no-deps api npx vitest run\n\n# Run client tests\ndocker compose -f docker-compose.dev.yml run --rm --no-deps client npx vitest run\n\n# Run a single test file\ndocker compose -f docker-compose.dev.yml run --rm --no-deps api npx vitest run tests/services/githubService.test.js\ndocker compose -f docker-compose.dev.yml run --rm --no-deps client npx vitest run src/__tests__/components/AuthorList.test.js\n\n# Watch mode\ndocker compose -f docker-compose.dev.yml run --rm --no-deps api npx vitest\ndocker compose -f docker-compose.dev.yml run --rm --no-deps client npx vitest\n```\n\nSome `stderr` output (e.g. \"Error during search\", \"Turnstile error\") is expected — these are `console.error` calls from the application code exercised by error-path tests.\n\n#### API tests\n\nAPI tests use [Supertest](https://github.com/ladislav-zezula/supertest) for route-level integration tests. Tests are organized under `api/tests/` mirroring the source structure:\n\n```text\napi/tests/\n├── helpers/          # Shared test utilities (Express app factory)\n├── models/           # Dataset model tests\n├── routes/           # Route integration tests (dataset, message, schema)\n├── services/         # Service unit tests (github, ICE, strategy manager)\n├── utils/            # Utility unit tests (categories, markdown, turnstile)\n└── setup.js          # Test environment variables\n```\n\n**Writing API tests:**\n\n- All tests are CommonJS (matching the API codebase).\n- Vitest globals (`describe`, `it`, `expect`, `vi`, `beforeEach`) are available without imports.\n- `vi.mock()` does not reliably intercept CJS `require()` calls. To mock a dependency, mutate the shared module object instead:\n  ```js\n  const myService = require(\"../../app/services/myService\");\n  myService.someMethod = vi.fn();\n  ```\n\n  This works because `require()` returns the same cached object to all consumers. For this reason, source modules should avoid destructuring at import time (use `mod.fn()` instead of `const { fn } = require(mod)`).\n- Route tests use Supertest with a lightweight Express app from `tests/helpers/createApp.js` (no Sequelize sync or Swagger setup).\n- Database calls are mocked by mutating `db.datasets.scope` and `db.sequelize.query` on the shared `require(\"../models\")` object.\n\n#### Client tests\n\nClient tests use [Vue Test Utils](https://test-utils.vuejs.org/) for component testing. Tests are organized under `client/src/__tests__/`:\n\n```text\nclient/src/__tests__/\n├── components/       # Component unit tests (AuthorList, Footer, FacetFilters, etc.)\n├── composables/      # Composable tests (useTurnstile)\n├── router/           # Route definition tests\n├── services/         # API service tests (Dataset, Message, Schema)\n├── store/            # Pinia store tests (searchStore)\n└── views/            # View tests (ContactView, versionComponentMap)\n```\n\n**Writing client tests:**\n\n- Tests are ESM (matching the client codebase). Import vitest functions explicitly: `import { describe, it, expect, vi } from 'vitest'`.\n- `vi.mock()` works for ESM imports. Mock HTTP calls by mocking `@/http-common`.\n- Mount components with `@vue/test-utils`. Stub child components and router as needed.\n\n#### Coverage\n\nRun tests with a coverage report:\n\n```bash\ndocker compose -f docker-compose.dev.yml run --rm --no-deps api npx vitest run --coverage\ndocker compose -f docker-compose.dev.yml run --rm --no-deps client npx vitest run --coverage\n```\n\nCoverage is enforced at 80% for statements, branches, functions, and lines (configured in `api/vitest.config.js` and `client/vitest.config.js`). The CI workflow runs coverage on every pull request and will fail if thresholds are not met.\n\n#### Troubleshooting: stale Docker images\n\nIf you see errors like `npx: not found` or unexpected behavior when running tests, you may have a stale Docker image cached from a previous build. This can happen when switching between dev and production Dockerfiles, since Docker Compose reuses an existing image if the tag already matches.\n\nTo fix this, remove the old image and rebuild:\n\n```bash\ndocker image rm bioenergyorg-client   # or bioenergyorg-api\ndocker compose -f docker-compose.dev.yml build --no-cache client\n```\n\n### Import BRC Data Feeds\n\n- run `docker compose run api node scripts/import_datafeeds.js` from the root folder of the project.\n- To redirect validation errors to a file, run `docker compose run api node scripts/import_datafeeds.js 2\u003e\u00261 \u003e import_datafeeds.txt`\n- Under Windows PowerShell, use the following version of the above command to get a clean output file: `cmd /c \"docker compose run api node scripts/import_datafeeds.js \u003e import_datafeeds_after.txt 2\u003e\u00261\"`\n- If you see warnings like `\"VITE_*\" variable is not set`, add that variable to your local `.env` file as an empty placeholder.\n\n### Resources Used to Build This Application\n\n- \u003chttps://expressjs.com/\u003e\n- \u003chttps://sequelize.org/\u003e\n  - \u003chttps://sequelize.org/docs/v6/core-concepts/model-querying-basics/#operators\u003e\n- \u003chttps://vuejs.org/\u003e\n  - \u003chttps://v2.vuejs.org/v2/cookbook\u003e\n\n## BRC Data End Points\n\n- CABBI: \u003chttps://cabbitools.igb.illinois.edu/brc/cabbi.json\u003e\n- CBI: \u003chttps://bioenergy-research-centers.github.io/brc_data_feeds/cbi.json\u003e\n- GLBRC: \u003chttps://fair-data.glbrc.org/glbrc.json\u003e\n- JBEI: \u003chttps://bioenergy.org/JBEI/jbei.json\u003e\n\n## Using Claude Code with the bioenergy.org MCP server.\n\nThis project repo automatically registers the MCP server in Claude Code via the `.mcp.json` file at the root of this repo.\n\nAlternatively, to tell Claude where the MCP server is:\n\n`claude mcp add --transport http bioenergy-datasets --scope project https://mcp.bioenergy.org`\n\nThen, in Claude Code, run `/mcp` and approve the server if prompted. You can check to confirm that Claude has registered the MCP with `claude mcp list`.\n\n## Validating Data\n\nA local data feed file can be validated against the schema currently supported by the API by posting the file to the validation endpoint (or `http://localhost:8080/api/validate` if testing against your dev environment). Alternatively, you can paste your data feed into the [Swagger API documentation](https://api.bioenergy.org/api-docs/#/Validation/post_api_validate), which will pretty-print the validation results.\n\n### Under Unix, macOS, Git Bash, or WSL (for Windows PowerShell use `curl.exe` instead of `curl`):\n\n`curl -X POST -H \"Content-Type: application/json\" --data-binary \"@jbei.json\" https://api.bioenergy.org/api/validate \u003e validation-results.json` \n\nThe endpoint uses the schema version declared in the posted feed. A schema version can also be forced with the `schema_version` query parameter:\n\n`curl -X POST -H \"Content-Type: application/json\" --data-binary \"@jbei.json\" \"https://api.bioenergy.org/api/validate?schema_version=0.1.13\"`\n\nThe response is JSON and includes:\n\n- the schema version used for validation\n- counts of valid, invalid, and duplicate records\n- detailed validation errors for invalid records\n- duplicate record details\n\n## Copyright Notice\nInterBRC Data Products Portal Copyright (c) 2025, The Regents of the University of California, through Lawrence Berkeley National Laboratory, and UT-Battelle LLC,  through Oak Ridge National Laboratory (both subject to receipt of any required approvals from the U.S. Dept. of Energy), University of Wisconsin - Madison, University of Illinois Urbana - Champaign, and Michigan State University. All rights reserved.\n\nIf you have questions about your rights to use or distribute this software,\nplease contact Berkeley Lab's Intellectual Property Office at\nIPO@lbl.gov.\n\nNOTICE.  This Software was developed under funding from the U.S. Department\nof Energy and the U.S. Government consequently retains certain rights.  As\nsuch, the U.S. Government has been granted for itself and others acting on\nits behalf a paid-up, nonexclusive, irrevocable, worldwide license in the\nSoftware to reproduce, distribute copies to the public, prepare derivative\nworks, and perform publicly and display publicly, and to permit others to do so.\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["ontology"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/318695","html_url":"https://ost.ecosyste.ms/projects/318695"}