{"id":49585466,"url":"https://github.com/anarkrypto/zeropoll","last_synced_at":"2026-05-03T22:06:48.035Z","repository":{"id":255728970,"uuid":"849037035","full_name":"anarkrypto/zeropoll","owner":"anarkrypto","description":"A private voting system powered by zero-knowledge proofs","archived":false,"fork":false,"pushed_at":"2025-02-25T15:03:01.000Z","size":2467,"stargazers_count":6,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2026-04-19T14:11:10.052Z","etag":null,"topics":["mina","mina-protocol","poll","privacy","zero-knowledge","zk-snarks"],"latest_commit_sha":null,"homepage":"","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/anarkrypto.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2024-08-28T21:30:07.000Z","updated_at":"2025-09-23T14:01:04.000Z","dependencies_parsed_at":"2024-09-06T22:28:11.255Z","dependency_job_id":"22f49780-fc64-43b5-92fc-dce36ed48db7","html_url":"https://github.com/anarkrypto/zeropoll","commit_stats":null,"previous_names":["anarkrypto/zeropoll"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/anarkrypto/zeropoll","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anarkrypto%2Fzeropoll","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anarkrypto%2Fzeropoll/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anarkrypto%2Fzeropoll/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anarkrypto%2Fzeropoll/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anarkrypto","download_url":"https://codeload.github.com/anarkrypto/zeropoll/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anarkrypto%2Fzeropoll/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32586243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: 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":["mina","mina-protocol","poll","privacy","zero-knowledge","zk-snarks"],"created_at":"2026-05-03T22:06:47.885Z","updated_at":"2026-05-03T22:06:48.027Z","avatar_url":"https://github.com/anarkrypto.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://zeropoll.xyz\"\u003e\n    \u003cpicture\u003e\n      \u003cimg src=\".github/images/logo.png\" height=\"128\"\u003e\n    \u003c/picture\u003e\n    \u003ch1 align=\"center\"\u003eZeroPoll.xyz\u003c/h1\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\nA private voting system powered by zero-knowledge proofs.\n\nSecure, anonymous and verifiable!\n\nhttps://zeropoll.xyz\n\n---\n\n- This project is funded by Mina Protocol: [Check the proposal](https://forums.minaprotocol.com/t/zeropoll-voting-polls/6482) 🎉\n- This project is based on [Protokit framework](https://protokit.dev) and was set up with [`proto-kit/starter-kit`](https://github.com/proto-kit/starter-kit).\n\n### Key Features\n\n- **Private Voting**: Vote counts are public while keeping individual votes confidential\n- **Double-Vote Prevention**: Uses nullifier system to prevent multiple votes from same user\n- **Verifiable Results**: All votes include zero-knowledge proofs for eligibility verification\n- **Flexible Polls**: Support for up to 10 options per poll with real-time result tracking\n- **Decentralized**: Fully on-chain implementation with no central authority\n\n### Technical Stack\n\n- Built with o1js for zero-knowledge proofs\n- Proto-kit for blockchain runtime implementation\n- Merkle trees for efficient voter verification\n- React with TypeScript for frontend implementation\n\n### Security Features\n\n- Zero-knowledge proofs for voter eligibility\n- Poseidon hash function for option privacy\n- Nullifier-based double-vote prevention\n- MerkleMap-based voter set management\n\n## Quick start\n\n**Overview:**\n\nThe monorepo contains:\n\n- `packages/chain` contains everything related to our app-chain\n- `packages/core` contains the core logic of ZeroPoll\n- `packages/react` contains hooks and a contex provider to implement ZeroPoll in a React app\n- `packages/react-ui` contains React components to implement the ZeroPoll UI\n- `apps/ipfs-storage` contains a simple IPFS storage node service\n- `apps/web` contains the web interface for ZeroPoll\n\n**Prerequisites:**\n\n- Node.js `v18` (we recommend using NVM)\n- pnpm `v9.8`\n- nvm\n\nFor running with persistance / deploying on a server\n\n- docker `\u003e= 24.0`\n\n## Setup\n\n```zsh\ngit clone https://github.com/anarkrypto/zeropoll zeropoll\ncd zeropoll\n\n# ensures you have the right node.js version\nnvm install \u0026\u0026 nvm use\n\n# ensure you have the right pnpm version\ncorepack enable\n\n# install dependencies\npnpm install\n```\n\n## Running\n\n### Environments\n\nThe starter-kit offers different environments to run you appchain.\nYou can use those environments to configure the mode of operation for your appchain depending on which stage of development you are in.\n\nThe starter kit comes with a set of pre-configured environments:\n\n- `inmemory`: Runs everything in-memory without persisting the data. Useful for early stages of runtime development.\n- `development`: Runs the sequencer locally and persists all state in databases running in docker.\n- `sovereign`: Runs your appchain fully in docker (except the UI) for testnet deployments without settlement.\n\nEvery command you execute should follow this pattern:\n\n`pnpm env:\u003cenvironment\u003e \u003ccommand\u003e`\n\nThis makes sure that everything is set correctly and our tooling knows which environment you want to use.\n\n### Running in-memory\n\n```zsh\n# starts both UI and sequencer locally\npnpm env:inmemory dev\n\n# starts UI only\npnpm env:inmemory dev --filter @zeropoll/web\n# starts sequencer only\npnpm env:inmemory dev --filter @zeropoll/chain\n```\n\n\u003e Be aware, the dev command will automatically restart your application when your sources change.\n\u003e If you don't want that, you can alternatively use `pnpm run build` and `pnpm run start`\n\nNavigate to `localhost:3000` to see the example UI, or to `localhost:8080/graphql` to see the GQL interface of the locally running sequencer.\n\n### Running tests\n\n```zsh\n# run and watch tests for the `chain` package\npnpm run test --filter=@zeropoll/chain -- --watchAll\n```\n\n### Running with persistence\n\n```zsh\n# start databases\npnpm env:development docker:up -d\n# generate prisma client\npnpm env:development prisma:generate\n# migrate database schema\npnpm env:development prisma:migrate\n\n# build \u0026 start sequencer, make sure to prisma:generate \u0026 migrate before\npnpm build --filter=@zeropoll/chain\npnpm env:development start --filter=@zeropoll/chain\n\n# Watch sequencer for local filesystem changes\n# Be aware: Flags like --prune won't work with 'dev'\npnpm env:development dev --filter=@zeropoll/chain\n\n# Start the UI\npnpm env:development dev --filter @zeropoll/web\n```\n\n### Deploying to a server\n\nWhen deploying to a server, you should push your code along with your forked starter-kit to some repository,\nthen clone it on your remote server and execute it.\n\n```zsh\n# start every component with docker\npnpm env:sovereign docker:up -d\n```\n\nUI will be accessible at `https://localhost` and GQL inspector will be available at `https://localhost/graphql`\n\n#### Configuration\n\nFor security reasons, modify the `POSTGRES_PASSWORD` and `REDIS_PASSWORD` envs found in the `packages/chain/src/environments/sovereign/.env` file.\n\nGo to `docker/proxy/Caddyfile` and replace the `*` matcher with your domain.\n\n```\nyourdomain.com {\n    ...\n}\n```\n\n\u003e HTTPS is handled automatically by Caddy, you can (learn more about automatic https here.)[https://caddyserver.com/docs/automatic-https]\n\nIn most cases, you will need to change the `NEXT_PUBLIC_PROTOKIT_GRAPHQL_URL` property in the `.env` file to the domain your graphql endpoint is running in.\nBy default, the graphql endpoint is running on the same domain as your UI with the `/graphql` suffix.\n\n#### Running sovereign chain locally\n\nThe caddy reverse-proxy automatically uses https for all connections, use this guide to remove certificate errors when accessing localhost sites\n\n\u003chttps://caddyserver.com/docs/running#local-https-with-docker\u003e\n\n## CLI Options\n\n- `logLevel`: Overrides the loglevel used. Also configurable via the `PROTOKIT_LOG_LEVEL` environment variable.\n- `pruneOnStartup`: If set, prunes the database before startup, so that your chain is starting from a clean, genesis state. Alias for environment variable `PROTOKIT_PRUNE_ON_STARTUP`\n\nIn order to pass in those CLI option, add it at the end of your command like this\n\n`pnpm env:inmemory dev --filter @zeropoll/chain -- --logLevel DEBUG --pruneOnStartup`\n\n### Building the framework from source\n\n1. Make sure the framework is located under ../framework from the starter-kit's location\n2. Adapt your starter-kit's package.json to use the file:// references to framework\n3. Go into the framework folder, and build a docker image containing the sources with `docker build -f ./packages/deployment/docker/development-base/Dockerfile -t protokit-base .`\n\n4. Comment out the first line of docker/base/Dockerfile to use protokit-base\n\n## Contributing\n\nContributions to ZeroPoll are welcome and highly appreciated!\n\nConsider [Open an Issue](https://github.com/anarkrypto/zeropoll/issues/new) or send a Pull Request\n\n## Authors\n\n- Kaique Nunes ([@anarkrypto](https://github.com/anarkrypto))\n\n## Security\n\nIf you believe you have found a security vulnerability in ZeroPoll, we encourage you to responsibly disclose this and NOT open a public issue.\nWe will investigate all legitimate reports. Email anarkrypto@gmail.com to disclose any security vulnerabilities\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanarkrypto%2Fzeropoll","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanarkrypto%2Fzeropoll","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanarkrypto%2Fzeropoll/lists"}