{"id":28526996,"url":"https://github.com/gchq/bailo","last_synced_at":"2026-02-05T13:01:39.732Z","repository":{"id":37086887,"uuid":"336277921","full_name":"gchq/Bailo","owner":"gchq","description":"Managing the lifecycle of machine learning to support scalability, impact, collaboration, compliance and sharing.","archived":false,"fork":false,"pushed_at":"2026-02-04T17:14:36.000Z","size":179212,"stargazers_count":92,"open_issues_count":29,"forks_count":18,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-02-05T00:25:55.134Z","etag":null,"topics":["ml","mlops","nodejs"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/gchq.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-02-05T13:21:21.000Z","updated_at":"2026-02-03T14:08:11.000Z","dependencies_parsed_at":"2024-11-05T11:21:25.063Z","dependency_job_id":"095cd18b-6669-4c12-a463-dc0cad7b513b","html_url":"https://github.com/gchq/Bailo","commit_stats":{"total_commits":1411,"total_committers":18,"mean_commits":78.38888888888889,"dds":0.7108433734939759,"last_synced_commit":"f74f1d9fa7d4fbfa805ab3fefa3d723c945eb1e7"},"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"purl":"pkg:github/gchq/Bailo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gchq%2FBailo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gchq%2FBailo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gchq%2FBailo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gchq%2FBailo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gchq","download_url":"https://codeload.github.com/gchq/Bailo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gchq%2FBailo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29122355,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-05T10:47:47.471Z","status":"ssl_error","status_checked_at":"2026-02-05T10:45:08.119Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ml","mlops","nodejs"],"created_at":"2025-06-09T12:11:37.945Z","updated_at":"2026-02-05T13:01:39.725Z","avatar_url":"https://github.com/gchq.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Contributors][contributors-shield]][contributors-url] [![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url] [![Issues][issues-shield]][issues-url]\n[![License][license-shield]][license-url] [![Contributor Covenant][code-of-conduct-shield]][code-of-conduct-url]\n\n\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/gchq/Bailo\"\u003e\n    \u003ch1\u003e\n      \u003c!-- TODO: Fix #gh-dark-mode-only --\u003e\n      \u003cimg src=\"frontend/public/logo-vertical-dark-transparent.png\" alt=\"Logo\" width=\"170\"\u003e\n    \u003c/h1\u003e\n  \u003c/a\u003e\n\n  \u003cp align=\"center\"\u003e\n    Making it easy to compliantly manage the machine learning lifecycle\n    \u003cbr /\u003e\n    \u003ca href=\"https://gchq.github.io/Bailo/docs\"\u003e\u003cstrong\u003eExplore the docs »\u003c/strong\u003e\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/gchq/Bailo/issues\"\u003eReport a Bug\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/gchq/Bailo/issues\"\u003eRequest a Feature\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n\n## About The Project\n\n[![Product Screen Shot][product-screenshot]](https://github.com/gchq/Bailo)\n\nBailo helps you manage the lifecycle of machine learning to support scalability, impact, collaboration, compliance and\nsharing.\n\n\u003cbr /\u003e\n\n\u003c!-- GETTING STARTED --\u003e\n\n## Getting Started\n\n### Running Locally with Docker\n\n#### Requirements\n\n- Node v24\n- Docker / Docker Compose\n\n#### Development Build\n\nTo run in development mode (modified files on your host machine will be reloaded into the running application):\n\n```bash\ngit clone https://github.com/gchq/Bailo.git \u0026\u0026 cd Bailo\nnpm install\nnpm run certs\n\n# This builds all the Bailo images, rerun it when you update dependencies.\ndocker compose build --parallel\n\n# Then run the development instance of Bailo.\ndocker compose up -d\n\n```\n\nOn first run, it may take a while (up to 30 seconds) to start up. It needs to build several hundred TypeScript modules.\nThese are cached however, so future starts only require a few seconds. You should access the site via\n[localhost:8080](http://localhost:8080).\n\nThe registry requires a JWKS file for the token authentication with the backend application. For development, a JWKS\nfile is generated by running `npm run certs`. For production, the script `generateJWKS.ts` can be used to generate a\nJWKS file for the public key referenced in the backend application configuration.\n\nTo stop the running services:\n\n```bash\ndocker compose down\n```\n\n#### Production Build\n\nThe above `docker compose` commands can, alternatively, be run with `-f compose.prod.yml` to have a more static version\nof the application running which mimics a production environment. Volumes are not dynamically mounted, the build time is\nslower as the frontend is pre-compiled, and environment variables \u0026 users are more production ready. This build is also\nmore reliable for our cypress tests:\n\n```bash\n# Build and run the productionised instance of Bailo.\ndocker compose -f compose.yaml -f compose.prod.yaml --env-file  prod.env up --force-recreate --build  -d\n\n# Stop the service and destroy the volumes\ndocker compose -f compose.yaml -f compose.prod.yaml down -v\n```\n\nThe above `docker compose` approaches are preferred, however we also provide a monolithic `Dockerfile.standalone`. To\nrun in standalone mode, not development mode (http://localhost:8080). Not for production use:\n\n```bash\ndocker build -t \"bailo:standalone\" -f ./Dockerfile.standalone .\ndocker run --name bailo -p 8080:8080 -d bailo:standalone\n```\n\n### Kubernetes Deployment\n\nWe recommend using our [helm charts](https://github.com/gchq/Bailo/blob/main/infrastructure/helm/README.md) to deploy\nBailo to Kubernetes.\n\nWe expect the administrator to provide their own forms of authentication. By default all users authenticate as 'user'.\n\n### Testing a New Deployment\n\nYou can test out your new deployment using the example models which can be found in `frontend/cypress/fixtures`\n[`minimal_binary.zip`](frontend/cypress/fixtures/minimal_binary.zip) and\n[`minimal_code.zip`](frontend/cypress/fixtures/minimal_code.zip). There are also example forms in the `scripts` folder\n[`minimal_model_schema.json`](backend/src/scripts/example_schemas/minimal_model_schema.json),\n[`minimal_data_card_schema.json`](backend/src/scripts/example_schemas/minimal_data_card_schema.json) and\n[`minimal_access_request_schema.json`](backend/src/scripts/example_schemas/minimal_access_request_schema.json).\n\n\u003cbr /\u003e\n\n## Logical Project Flow (Overview)\n\n![bailo diagram](frontend/public/mm-diagram.png)\n\n### Components\n\n|                 |                                                                                                                                                                                              |\n| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| NGINX           | [![nginx][NGINX]](https://nginx.org/)                                                                                                                                                        |\n| UI              | [![TypeScript][Typescript]](https://www.typescriptlang.org/) [![Next.js][Next.js]](https://nextjs.org/) [![React][React]](https://react.dev/) [![Cypress][Cypress]](https://www.cypress.io/) |\n| API             | [![TypeScript][Typescript]](https://www.typescriptlang.org/) [![Next.js][Next.js]](https://nextjs.org/) [![Express.js][Express]](https://expressjs.com/) [![Vitest][Vitest]](#)              |\n| Docker Registry | [![Docker][Docker]](https://www.docker.com/)                                                                                                                                                 |\n| Mongo           | [![MongoDB][Mongo]](https://www.mongodb.com/)                                                                                                                                                |\n| S3              | [![MinIO][Minio]](https://www.min.io/)                                                                                                                                                       |\n\n1. A user accesses a URL. We use [NextJS routing](https://nextjs.org/docs/routing/introduction) to point it to a file in\n   `frontend/pages`. `[xxx].tsx` files accept any route, `xxx.tsx` files allow only that specific route.\n2. Data is loaded using [SWR](https://swr.vercel.app/). Data loaders are stored in `frontend/actions`. Each one exposes\n   variables to specify if it is loading, errored, data, etc.\n3. Requests to the backend get routed through [express](https://expressjs.com/) within `backend/src/routes.ts`. Each\n   route is an array with all items being middleware except the last, which is the handler (`[...middleware, handler]`).\n4. Routes interact with the database via `mongoose`, which stores models in `backend/src/models`.\n\n\u003cbr /\u003e\n\n## Known Issues\n\n- _Issue: Sometimes Docker struggles when you add a new dependency._ \u003cbr /\u003e Fix: Run `docker compose down --rmi all`\n  followed by `docker compose up --build`.\n\n- _Issue: Sometimes SWR fails to install its own binary and the project will refuse to start up (development only)_\n  \u003cbr /\u003e Fix: Run `npm uninstall next \u0026\u0026 npm install next`. Some users report still having issues. If so, run:\n  `rm -rf node_modules \u0026\u0026 rm -rf package-lock.json \u0026\u0026 npm cache clean -f \u0026\u0026 npm i`.\n\n- _Issue: Unable to authenticate to the Docker registry / compile binaries._ \u003cbr /\u003e Fix: Make sure that your\n  authentication proxy is setup to allow the 'Authorisation' header. Make sure that your application is able to access\n  the Docker registry internally as it will not provide user authentication.\n\n- _Issue: `npm run build` fails in the `frontend` directory with `Error: EACCES: permission denied .`_ \u003cbr /\u003e Fix: Run\n  `sudo rm -rf .next` in the `frontend` directory. This typically happens because `docker compose` has modified the\n  mounted volume owner.\n\n\u003cbr /\u003e\n\n## Usage\n\nSee [our user documentation](https://gchq.github.io/Bailo/docs)\n\n\u003cbr /\u003e\n\n\u003c!-- CONTRIBUTING --\u003e\n\n## Contributing\n\nIf you'd like to make a contribution then the details for doing all of that are in\n[CONTRIBUTING.md](https://github.com/gchq/Bailo/blob/main/CONTRIBUTING.md).\n\n\u003cbr /\u003e\n\n\u003c!-- LICENSE --\u003e\n\n## License\n\nBailo is released under the Apache 2.0 Licence and is covered by Crown Copyright. See [LICENSE.txt][license-url] for\nmore information.\n\n\u003cbr /\u003e\n\n\u003c!-- ACKNOWLEDGMENTS --\u003e\n\n## Acknowledgments\n\n- [Othneils's README Template](https://github.com/othneildrew/Best-README-Template)\n- [Stroom's Code Contribution Guidelines](https://github.com/gchq/stroom/blob/master/CONTRIBUTING.md)\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n\n[contributors-shield]: https://img.shields.io/github/contributors/gchq/bailo.svg?style=for-the-badge\n[contributors-url]: https://github.com/gchq/Bailo/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/gchq/bailo.svg?style=for-the-badge\n[forks-url]: https://github.com/gchq/Bailo/network/members\n[stars-shield]: https://img.shields.io/github/stars/gchq/bailo.svg?style=for-the-badge\n[stars-url]: https://github.com/gchq/Bailo/stargazers\n[issues-shield]: https://img.shields.io/github/issues/gchq/bailo.svg?style=for-the-badge\n[issues-url]: https://github.com/gchq/Bailo/issues\n[license-shield]: https://img.shields.io/github/license/gchq/bailo.svg?style=for-the-badge\n[license-url]: https://github.com/gchq/Bailo/blob/main/LICENSE.txt\n[code-of-conduct-shield]: https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg?style=for-the-badge\n[code-of-conduct-url]: https://github.com/gchq/Bailo/blob/main/CODE_OF_CONDUCT.md\n[product-screenshot]: frontend/public/images/bailo-marketplace.png\n[Next.js]: https://img.shields.io/badge/Next.js-black?logo=next.js\u0026logoColor=white\n[React]: https://img.shields.io/badge/React-%2320232a.svg?logo=react\u0026logoColor=%2361DAFB\n[Express]: https://img.shields.io/badge/Express.js-%23404d59.svg?logo=express\u0026logoColor=%2361DAFB\n[Docker]: https://img.shields.io/badge/Docker-2496ED?logo=docker\u0026logoColor=fff\n[Mongo]: https://img.shields.io/badge/MongoDB-%234ea94b.svg?logo=mongodb\u0026logoColor=white\n[Minio]: https://img.shields.io/badge/MinIO-C72E49?logo=minio\u0026logoColor=fff\n[NGINX]: https://img.shields.io/badge/nginx-009639?logo=nginx\u0026logoColor=fff\n[Vitest]: https://img.shields.io/badge/Vitest-6E9F18?logo=vitest\u0026logoColor=fff\n[Typescript]: https://img.shields.io/badge/TypeScript-3178C6?logo=typescript\u0026logoColor=fff\n[Cypress]: https://img.shields.io/badge/Cypress-69D3A7?logo=cypress\u0026logoColor=fff\n[MUI]: https://img.shields.io/badge/Material%20UI-007FFF?style=for-the-badge\u0026logo=mui\u0026logoColor=white\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgchq%2Fbailo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgchq%2Fbailo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgchq%2Fbailo/lists"}