{"id":22082939,"url":"https://github.com/bandada-infra/bandada","last_synced_at":"2025-05-16T08:04:39.232Z","repository":{"id":43767883,"uuid":"495912089","full_name":"bandada-infra/bandada","owner":"bandada-infra","description":"A system for managing privacy-preserving groups.","archived":false,"fork":false,"pushed_at":"2025-04-04T12:44:25.000Z","size":50848,"stargazers_count":75,"open_issues_count":55,"forks_count":71,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-05-01T15:44:50.292Z","etag":null,"topics":["anonymity-sets","groups","merkle-tree","zero-knowledge"],"latest_commit_sha":null,"homepage":"https://bandada.pse.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bandada-infra.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-05-24T16:53:05.000Z","updated_at":"2025-04-29T02:35:21.000Z","dependencies_parsed_at":"2023-10-02T22:22:12.300Z","dependency_job_id":"b126dc61-e499-4f4d-bf59-260f4996eed6","html_url":"https://github.com/bandada-infra/bandada","commit_stats":{"total_commits":1019,"total_committers":39,"mean_commits":"26.128205128205128","dds":0.6280667320902846,"last_synced_commit":"89b67ae601628368945a80c0900014f2660ed840"},"previous_names":["privacy-scaling-explorations/zk-groups","bandada-infra/bandada","privacy-scaling-explorations/bandada"],"tags_count":41,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bandada-infra%2Fbandada","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bandada-infra%2Fbandada/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bandada-infra%2Fbandada/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bandada-infra%2Fbandada/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bandada-infra","download_url":"https://codeload.github.com/bandada-infra/bandada/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253748094,"owners_count":21957863,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["anonymity-sets","groups","merkle-tree","zero-knowledge"],"created_at":"2024-12-01T00:08:25.259Z","updated_at":"2025-05-16T08:04:34.223Z","avatar_url":"https://github.com/bandada-infra.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ch1 align=\"center\"\u003e\n      Bandada\n    \u003c/h1\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/bandada-infra\" target=\"_blank\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/project-Bandada-blue.svg?style=flat-square\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/bandada-infra/bandada/blob/main/LICENSE\"\u003e\n        \u003cimg alt=\"Github license\" src=\"https://img.shields.io/github/license/bandada-infra/bandada.svg?style=flat-square\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/bandada-infra/bandada/actions?query=workflow%3Atest\"\u003e\n        \u003cimg alt=\"GitHub Workflow test\" src=\"https://img.shields.io/github/actions/workflow/status/bandada-infra/bandada/test.yml?branch=main\u0026label=test\u0026style=flat-square\u0026logo=github\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/bandada-infra/bandada/actions?query=workflow%3Astyle\"\u003e\n        \u003cimg alt=\"GitHub Workflow style\" src=\"https://img.shields.io/github/actions/workflow/status/bandada-infra/bandada/style.yml?branch=main\u0026label=style\u0026style=flat-square\u0026logo=github\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://coveralls.io/github/bandada-infra/bandada\"\u003e\n        \u003cimg alt=\"Coveralls\" src=\"https://img.shields.io/coveralls/github/bandada-infra/bandada?label=coverage (ts)\u0026style=flat-square\u0026logo=coveralls\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://eslint.org/\"\u003e\n        \u003cimg alt=\"Linter eslint\" src=\"https://img.shields.io/badge/linter-eslint-8080f2?style=flat-square\u0026logo=eslint\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://prettier.io/\"\u003e\n        \u003cimg alt=\"Code style prettier\" src=\"https://img.shields.io/badge/code%20style-prettier-f8bc45?style=flat-square\u0026logo=prettier\"\u003e\n    \u003c/a\u003e\n\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n    \u003ch4\u003e\n        \u003ca href=\"/CONTRIBUTING.md\"\u003e\n            👥 Contributing\n        \u003c/a\u003e\n        \u003cspan\u003e\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u003c/span\u003e\n        \u003ca href=\"/CODE_OF_CONDUCT.md\"\u003e\n            🤝 Code of conduct\n        \u003c/a\u003e\n        \u003cspan\u003e\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u003c/span\u003e\n        \u003ca href=\"https://github.com/bandada-infra/bandada/contribute\"\u003e\n            🔎 Issues\n        \u003c/a\u003e\n        \u003cspan\u003e\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u003c/span\u003e\n        \u003ca href=\"https://discord.gg/sF5CT5rzrR\"\u003e\n            🗣️ Chat \u0026amp; Support\n        \u003c/a\u003e\n    \u003c/h4\u003e\n\u003c/div\u003e\n\n| Bandada is a public good plug-and-play infrastructure that empowers anyone to create and manage privacy-preserving groups of anonymous individuals, without necessitating prior expertise. |\n| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n\nBandada comprises a versatile back-end, two user-friendly front-ends (the [**dashboard**](/apps/dashboard) to manage groups and members and a [**demo**](/apps/client) application to allow end-users to join the groups), Ethereum [**smart contracts**](/apps/contracts) for proof verification, and a collection of [**JavaScript libraries**](/libs/) for seamless integration. From the Bandada dashboard, you can effortlessly create two types of groups: **manual** and **credential** groups. In manual groups, you can add members directly or generate invite links while, in credential groups, members must demonstrate their credentials for access. Bandada provides developers with JavaScript libraries, including [`@bandada/api-sdk`](/libs/api-sdk/) to make it easier to work with the APIs. Furthermore, it provides preconfigured credential validators and allows for additional functionality through the [`@bandada/credentials`](/libs/credentials/) library. This feature allows for manual or automated management of both off-chain and on-chain groups by specifying eligibility criteria. It can be used for a variety of applications, such as organizing private organizational members, grouping contributors of a particular GitHub repository, or uniting holders of a specific NFT, among others.\n\nPlease see the latest [documentation](https://pse-team.notion.site/Bandada-82d0d9d3c6b64b7bb2a09d4c7647c083) to learn more about Bandada.\n\n## ⚙️ Applications\n\n-   API: [/apps/api](/apps/api)\n-   Dashboard: [/apps/dashboard](/apps/dashboard)\n-   Demo: [/apps/client](/apps/client)\n-   Contracts: [/apps/contracts](/apps/contracts)\n\n## 📦 Libraries\n\n\u003ctable\u003e\n    \u003cth\u003ePackage\u003c/th\u003e\n    \u003cth\u003eVersion\u003c/th\u003e\n    \u003cth\u003eDownloads\u003c/th\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                \u003ca href=\"/libs/hardhat\"\u003e\n                    @bandada/hardhat\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003c!-- NPM version --\u003e\n                \u003ca href=\"https://npmjs.org/package/@bandada/hardhat\"\u003e\n                    \u003cimg src=\"https://img.shields.io/npm/v/@bandada/hardhat.svg?style=flat-square\" alt=\"NPM version\" /\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003c!-- Downloads --\u003e\n                \u003ca href=\"https://npmjs.org/package/@bandada/hardhat\"\u003e\n                    \u003cimg src=\"https://img.shields.io/npm/dm/@bandada/hardhat.svg?style=flat-square\" alt=\"Downloads\" /\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                \u003ca href=\"/apps/contracts/contracts\"\u003e\n                    @bandada/contracts\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003c!-- NPM version --\u003e\n                \u003ca href=\"https://npmjs.org/package/@bandada/contracts\"\u003e\n                    \u003cimg src=\"https://img.shields.io/npm/v/@bandada/contracts.svg?style=flat-square\" alt=\"NPM version\" /\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003c!-- Downloads --\u003e\n                \u003ca href=\"https://npmjs.org/package/@bandada/contracts\"\u003e\n                    \u003cimg src=\"https://img.shields.io/npm/dm/@bandada/contracts.svg?style=flat-square\" alt=\"Downloads\" /\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                \u003ca href=\"/libs/utils\"\u003e\n                    @bandada/utils\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003c!-- NPM version --\u003e\n                \u003ca href=\"https://npmjs.org/package/@bandada/utils\"\u003e\n                    \u003cimg src=\"https://img.shields.io/npm/v/@bandada/utils.svg?style=flat-square\" alt=\"NPM version\" /\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003c!-- Downloads --\u003e\n                \u003ca href=\"https://npmjs.org/package/@bandada/utils\"\u003e\n                    \u003cimg src=\"https://img.shields.io/npm/dm/@bandada/utils.svg?style=flat-square\" alt=\"Downloads\" /\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                \u003ca href=\"/libs/credentials\"\u003e\n                    @bandada/credentials\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003c!-- NPM version --\u003e\n                \u003ca href=\"https://npmjs.org/package/@bandada/credentials\"\u003e\n                    \u003cimg src=\"https://img.shields.io/npm/v/@bandada/credentials.svg?style=flat-square\" alt=\"NPM version\" /\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003c!-- Downloads --\u003e\n                \u003ca href=\"https://npmjs.org/package/@bandada/credentials\"\u003e\n                    \u003cimg src=\"https://img.shields.io/npm/dm/@bandada/credentials.svg?style=flat-square\" alt=\"Downloads\" /\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                \u003ca href=\"/libs/api-sdk\"\u003e\n                    @bandada/api-sdk\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003c!-- NPM version --\u003e\n                \u003ca href=\"https://npmjs.org/package/@bandada/api-sdk\"\u003e\n                    \u003cimg src=\"https://img.shields.io/npm/v/@bandada/api-sdk.svg?style=flat-square\" alt=\"NPM version\" /\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e\n                \u003c!-- Downloads --\u003e\n                \u003ca href=\"https://npmjs.org/package/@bandada/api-sdk\"\u003e\n                    \u003cimg src=\"https://img.shields.io/npm/dm/@bandada/api-sdk.svg?style=flat-square\" alt=\"Downloads\" /\u003e\n                \u003c/a\u003e\n            \u003c/td\u003e\n        \u003c/tr\u003e\n    \u003ctbody\u003e\n\u003c/table\u003e\n\n## Bandada board\n\nAll the Bandada board tasks are public. You can view the current tasks, their statuses, and more details [here](https://github.com/orgs/bandada-infra/projects/1).\n\n## 🔧 Configuration\n\n### Prerequisites\n\n-   [NodeJS](https://nodejs.org/en) \u003e= v18.17.0\n\nEach package and application brings its own set of environment variables. To get started with Bandada, you can get rid of the configuration and just use the default settings. Copy the environment variables used by the [`api`](/apps/api/) application by running this command:\n\n```bash\ncp apps/api/.env.example apps/api/.env\n```\n\n**NB.** Bandada requires an SQL database (see [`api`](/apps/api/) application for usage). Currently, [PostgreSQL](https://www.postgresql.org/) and [SQLite](https://www.sqlite.org/index.html) (default) has been successfully tested (watch out that others SQL flavors may work but have not been tested). We are assuming you are using SQLite as the database.\n\nThe applications will be deployed at the following URLs without any changes to the default configurations:\n\n| App                | Development           | Production                     | Staging                                |\n| ------------------ | --------------------- | ------------------------------ | -------------------------------------- |\n| Bandada API        | http://localhost:3000 | https://api.bandada.pse.dev    | https://api-staging.bandada.pse.dev    |\n| Bandada Dashboard  | http://localhost:3001 | https://app.bandada.pse.dev    | https://app-staging.bandada.pse.dev    |\n| Bandada Client App | http://localhost:3002 | https://client.bandada.pse.dev | https://client-staging.bandada.pse.dev |\n\n## 🛠 Installation\n\nClone this repository:\n\n```bash\ngit clone https://github.com/bandada-infra/bandada.git\n```\n\nand install the dependencies:\n\n```bash\ncd bandada \u0026\u0026 yarn\n```\n\n## 📜 Usage\n\nTo build the applications, libraries and compile the contracts, run the following command:\n\n```bash\nyarn build\n```\n\nA `dist` folder will be created in each library/application.\n\nTo start the applications in a development environment, run the following command:\n\n```bash\nyarn dev\n```\n\nUse the following command to start the applications in the production environment:\n\n```bash\nyarn start\n```\n\n### Testing\n\nRun [Jest](https://jestjs.io/) to test the code with coverage:\n\n```bash\nyarn test\n```\n\n## 🐳 Running in Docker\n\n### Prerequisites\n\n-   [Docker](https://www.docker.com/) \u003e= 4.26.1\n-   [docker-compose](https://docs.docker.com/compose/) \u003e= 2.24.2\n\nTo run Bandada using [Docker](https://www.docker.com/), execute the following command in the project root:\n\n```sh\ndocker-compose up -d\n```\n\n### Local Development\n\nTo begin local development, use the following command to start essential dependencies such as a local Ethereum network (with data persistence) and [TheGraph](https://thegraph.com/) node:\n\n```sh\ndocker-compose -f docker-compose.dev.yml up -d\n```\n\nThe Ethereum node ([Ganache](https://trufflesuite.com/ganache/)) will run on port `8545` with accounts pre-funded with 100 ETH:\n\n```sh\n0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\n# this is the same first account generated by Hardhat network as well.\nPrivate Key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\n```\n\nTo deploy the contracts to the local network, use the command below:\n\n```sh\nyarn workspace contracts deploy:bandada-semaphore --network local\n```\n\nThe contract addresses deployed in a new local network are:\n\n```sh\nPairing library has been deployed to:               0x5FbDB2315678afecb367f032d93F642f64180aa3\nSemaphoreVerifier contract has been deployed to:    0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512\nBandada contract has been deployed to:             0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0\nBandadaSemaphore contract has been deployed to:    0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9\n```\n\nDefault values for contract addresses are set in `libs/utils/src/contract-addresses.ts`. If you make changes to the contract and redeploy, you will need to update the address here.\n\nTo reset the local network or TheGraph node, stop the docker containers and delete the corresponding folders inside `./.data`.\n\n## 📡 Enable API Access for a Group\n\nBandada offers APIs for retrieving group data and managing group members. As an admin of a manual or invitation group, you can use the API key to add or remove members.\n\nTo enable API access for a group, go to the group page in the dashboard and toggle the **Enable API Access** button. Once enabled, a new API key will be generated for you. You can disable API access at any time using the same toggle button.\n\n[Enable API access toggle for off-chain group](https://github.com/bandada-infra/bandada/assets/20580910/e7106f24-39c8-422d-97a5-11756200ae03)\n\n## 🔌 API endpoints\n\nTo see the complete list of available endpoints, please visit https://api.bandada.pse.dev.\n\n## 👨‍💻 Contributing\n\n### Good First Issues\n\nCheck out the list of open [Good First Issues](https://github.com/bandada-infra/bandada/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) to find tasks that are ideal for new contributors.\n\nAlternatively, for a more visual organization, check out the [Good First Issues board view](https://github.com/orgs/bandada-infra/projects/1/views/5).\n\n### Code quality and formatting\n\nRun [ESLint](https://eslint.org/) to analyze the code and catch bugs:\n\n```bash\nyarn lint\n```\n\nRun [Prettier](https://prettier.io/) to check formatting rules:\n\n```bash\nyarn prettier\n```\n\nor to format the code automatically:\n\n```bash\nyarn prettier:write\n```\n\n### Conventional commits\n\nBandada uses [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/), which follow a standardised format for commit messages. To use this format, you can run the [command line utility](https://github.com/commitizen/cz-cli) by running:\n\n```bash\nyarn commit\n```\n\nThe command will automatically verify that the modified files adhere to the rules of ESLint and Prettier.\n\n### Releases\n\nSteps:\n\n1. Bump a new version with:\n\n```bash\nyarn version:bump \u003cversion\u003e\n# e.g. yarn version:bump 2.0.0\n```\n\nThis step creates a commit and a git tag.\n\n2. Push the changes to main:\n\n```bash\ngit push origin main\n```\n\n3. Push the new git tag:\n\n```bash\ngit push origin \u003cversion\u003e\n# e.g. git push origin v2.0.0\n```\n\nAfter pushing the new git tag, a workflow will be triggered to publish the Bandada packages on [npm](https://www.npmjs.com/) and release a new version on GitHub with its changelogs automatically.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbandada-infra%2Fbandada","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbandada-infra%2Fbandada","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbandada-infra%2Fbandada/lists"}