[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-ethereum-semaphore":3,"mdc--g60kmj-key":34,"related-org-ethereum-semaphore":1274,"related-repo-ethereum-semaphore":1319},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"semaphore","build anonymous group proof applications","Build, adapt, and debug Semaphore V4 applications. Use when a user wants anonymous voting, anonymous feedback, group membership proofs, nullifier-based double-spend prevention, off-chain Semaphore proof generation, on-chain Semaphore group management, or integration with Semaphore identities, groups, proofs, contracts, or subgraphs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"ethereum","Ethereum","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fethereum.png",[12,16,19,20],{"name":13,"slug":14,"type":15},"Security","security","tag",{"name":17,"slug":18,"type":15},"Web3","web3",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Privacy","privacy",3,"https:\u002F\u002Fgithub.com\u002Fethereum\u002Fzk-skills","2026-08-20T03:53:28.249664",null,0,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"AI-friendly skills for EF \u002F PSE Projects","https:\u002F\u002Fgithub.com\u002Fethereum\u002Fzk-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fsemaphore","---\nname: semaphore\ndescription: Build, adapt, and debug Semaphore V4 applications. Use when a user wants anonymous voting, anonymous feedback, group membership proofs, nullifier-based double-spend prevention, off-chain Semaphore proof generation, on-chain Semaphore group management, or integration with Semaphore identities, groups, proofs, contracts, or subgraphs.\n---\n\n# Semaphore\n\n## Overview\n\nUse this skill to help an agent turn a product goal such as \"let verified members vote anonymously\" or \"let conference attendees submit one private feedback message\" into a working Semaphore integration.\n\nSemaphore is useful when an app needs a user to prove group membership and send a message without revealing which group member sent it. The practical building blocks are:\n\n- identities: private keys, public keys, and public identity commitments;\n- groups: Merkle trees containing identity commitments;\n- proofs: zero-knowledge proofs over membership, a message, and a scope;\n- nullifiers: public values used to reject duplicate signals for the same scope.\n\nCurrent app-building should target Semaphore V4 unless the existing codebase already uses an older version.\n\n## Workflow\n\n1. Clarify the action the user wants to protect: vote, post, endorse, claim, join, or submit feedback.\n2. Decide whether Semaphore is appropriate: the app needs anonymous group membership, not private arbitrary computation or private credentials by itself.\n3. Define the group source: off-chain list, on-chain group, allowlist, token ownership snapshot, credential proof, or admin-managed registry.\n4. Define the scope: ballot id, proposal id, room id, campaign id, epoch, or another value that determines where one identity may only signal once.\n5. Define the message: the vote choice, feedback hash, post hash, endorsement target, claim data, or another public value.\n6. Choose the integration path: off-chain proof verification for prototypes, on-chain validation for contracts, or a hybrid app with off-chain proof generation and on-chain validation.\n7. Implement identity creation or recovery, group loading, proof generation, proof submission, verification, and duplicate-nullifier handling.\n8. Test with multiple identities, duplicate submissions, stale groups, invalid proofs, and small anonymity sets.\n9. Before claiming the app works, confirm the final path uses real `generateProof` plus real `verifyProof` or official contract validation. Mock verifiers, server counters, and trusted client claims are scaffolding only.\n\n## Recommended References\n\n- Semaphore docs: https:\u002F\u002Fdocs.semaphore.pse.dev\u002F\n- JavaScript SDK TypeDoc: https:\u002F\u002Fjs.semaphore.pse.dev\u002F\n- GitHub repository: https:\u002F\u002Fgithub.com\u002Fsemaphore-protocol\u002Fsemaphore\n- Deployed contracts: https:\u002F\u002Fdocs.semaphore.pse.dev\u002Fdeployed-contracts\n- CLI templates: `npx @semaphore-protocol\u002Fcli create my-app --template monorepo-ethers`\n- Implementation card: `references\u002Fsemaphore-v4-implementation.md`\n\n## Implementation Choices\n\nFor one-shot app work, read `references\u002Fsemaphore-v4-implementation.md` before writing code. It contains the verified V4 proof shape, off-chain verifier route, database constraints for used nullifiers, browser artifact notes, and required tests.\n\nPrefer `@semaphore-protocol\u002Fcore` for new JavaScript or TypeScript app code when the app needs identity, group, and proof utilities together. Use the narrower packages when the codebase already imports them:\n\n- `@semaphore-protocol\u002Fidentity` for `Identity`;\n- `@semaphore-protocol\u002Fgroup` for `Group`;\n- `@semaphore-protocol\u002Fproof` for `generateProof` and `verifyProof`;\n- `@semaphore-protocol\u002Fcontracts` for Solidity interfaces and on-chain validation;\n- `@semaphore-protocol\u002Fdata` for loading on-chain group data from supported networks.\n\nFor a fast prototype, build off-chain first:\n\n```typescript\nimport { Identity } from \"@semaphore-protocol\u002Fidentity\"\nimport { Group } from \"@semaphore-protocol\u002Fgroup\"\nimport { generateProof, verifyProof } from \"@semaphore-protocol\u002Fproof\"\n\nconst identity = new Identity()\nconst group = new Group([identity.commitment])\nconst message = 1\nconst scope = group.root\n\nconst proof = await generateProof(identity, group, message, scope)\nconst valid = await verifyProof(proof)\n```\n\nFor an on-chain app, keep proof generation in the client or backend and validate with the Semaphore contract. Use `Semaphore.sol` or `ISemaphore.sol` from `@semaphore-protocol\u002Fcontracts`; do not write a custom verifier unless the app has a specific reason and tests.\n\n## Working App Definition Of Done\n\nA finished Semaphore app must include:\n\n- a concrete identity creation or recovery model;\n- a concrete registration or membership model with identity commitments only;\n- group state that the verifier or contract trusts;\n- app-specific scope and message encoding;\n- real proof generation with Semaphore;\n- real proof verification off-chain, on-chain, or both;\n- root, scope, message, and nullifier checks before side effects;\n- duplicate prevention through a transaction\u002Funique constraint or the official Semaphore contract;\n- behavioral tests for valid member action, duplicate action, second member action, non-member or untrusted-root proof, tampered message, wrong scope, and stale or unknown root behavior.\n\nIf any mock verifier, server-side-only counter, or client-claimed membership remains, do not describe the result as a working Semaphore app. Mark it as incomplete scaffolding and state which real proof or validation path is missing.\n\n## App Design Checklist\n\nBefore writing code, record:\n\n- user action and threat model;\n- group id or group construction rule;\n- who may add, update, or remove group members;\n- identity recovery strategy;\n- scope value and why it prevents only the intended duplicate action;\n- message encoding and whether large data should be hashed before proof generation;\n- proof generation location: browser, mobile app, backend, or test script;\n- verification location: backend, smart contract, or both;\n- nullifier storage and duplicate rejection path;\n- expected group size and anonymity set risks.\n\nUse unique identity derivation prompts per application. If deriving identities from wallet signatures, use an app-specific message and warn against reusing the same signed message across apps because it can link identities.\n\nAvoid groups with 1 or 2 members for real privacy. They can be useful in tests but should not be described as anonymous.\n\n## Common App Patterns\n\n### Anonymous Voting\n\nUse a group for eligible voters. Use the ballot or proposal id as the scope. Use the vote choice or a hash of a structured ballot as the message. Store used nullifiers and reject duplicates.\n\nTest:\n\n- valid member can vote once;\n- same identity cannot vote twice for the same scope;\n- same identity can vote in a different scope if allowed;\n- non-member proof fails;\n- proof with tampered message fails.\n\n### Anonymous Feedback\n\nUse a group for eligible feedback authors. Use the event id, class id, or room id as the scope. Use a feedback hash as the message if the raw feedback should stay off-chain or be stored elsewhere.\n\nTest duplicate nullifier rejection and moderation requirements. Semaphore proves group membership; it does not make abusive content safe.\n\n### Anonymous Posting Or Signaling\n\nUse a scope that represents a topic, epoch, channel, or campaign. If the app allows more than one message per period, plain Semaphore may be too restrictive; consider multiple scopes or RLN for privacy-preserving rate limits.\n\n## Backend And Contract Guidance\n\nFor off-chain verification:\n\n- verify the proof with `verifyProof`;\n- check the proof's group root is trusted for the relevant group;\n- check the scope is exactly the expected scope;\n- check the message matches the submitted action;\n- persist the nullifier before accepting side effects, or use a transaction\u002Funique constraint to avoid races.\n\nFor on-chain verification:\n\n- use the official Semaphore interface and deployed contract where practical;\n- create or reference a group id;\n- add members with identity commitments only, never private keys;\n- call `validateProof(groupId, proof)` for submitted proofs;\n- store accepted nullifiers or rely on the Semaphore contract behavior required by the chosen flow.\n\nFor local on-chain harnesses, the official npm package exposes Solidity files at package-root paths such as `@semaphore-protocol\u002Fcontracts\u002FSemaphore.sol` and `@semaphore-protocol\u002Fcontracts\u002Finterfaces\u002FISemaphore.sol`. If the Solidity toolchain does not emit deployable artifacts for package contracts, add a local import wrapper contract and deploy\u002Flink `PoseidonT3` before deploying `Semaphore`.\n\nWhen loading on-chain groups off-chain, reconstruct the group from trusted subgraph or contract data and handle stale roots. Semaphore contracts may allow old roots for a configured duration; make that duration explicit in app behavior.\n\n## Security And Privacy Rules\n\n- Never log, commit, or transmit a Semaphore private key unless the user explicitly asked to export it.\n- Never store identity private keys in plaintext local storage for a production app.\n- Do not call a public identity commitment a private identifier; it is safe to share but linkable wherever reused.\n- Do not use the same wallet-signature challenge across different apps.\n- Do not accept a proof just because it verifies cryptographically; also check group, scope, message, root freshness, and nullifier uniqueness.\n- Do not promise anonymity when the group is tiny, the group list is uniquely identifying, or the action metadata deanonymizes the user.\n\n## Verification\n\nFor application code, run the repository's normal typecheck and test commands. Add focused tests for:\n\n- identity creation\u002Fimport;\n- group membership and Merkle proof generation;\n- proof generation and verification;\n- duplicate nullifier rejection;\n- invalid group, invalid scope, and invalid message;\n- on-chain validation if contracts are touched.\n\nFor contract code, run unit tests against both valid and invalid proofs when fixtures are available. If proof generation is slow in CI, keep at least one integration test and use deterministic fixtures for faster unit tests.\n\nFor browser apps, also exercise visible UI state for registration, proof generation, acceptance, duplicate rejection, non-member or stale-root rejection, and current vote\u002Faction counts. Screenshot capture is useful but DOM\u002FAPI assertions are acceptable when screenshot tooling is flaky.\n\nBefore finishing, run the security, duplicate-nullifier, root-freshness, and browser-artifact checks in `references\u002Fsemaphore-v4-implementation.md`.\n\n## Output Expectations\n\nWhen building an app integration, produce:\n\n- the group and membership model;\n- identity creation or recovery strategy;\n- scope and message definitions;\n- proof generation and verification code path;\n- nullifier duplicate handling;\n- commands used for build and tests;\n- known privacy limitations and remaining setup steps.\n\nWhen only planning, produce the same information without code edits and clearly mark unknowns such as group source, network, deployed contract address, or identity recovery requirements.\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,47,54,60,65,90,95,101,167,173,244,250,262,275,359,364,741,769,775,780,828,833,839,844,897,902,907,913,920,925,930,958,964,969,974,980,985,991,996,1030,1035,1071,1105,1110,1116,1149,1155,1160,1193,1198,1203,1214,1220,1225,1263,1268],{"type":40,"tag":41,"props":42,"children":43},"element","h1",{"id":4},[44],{"type":45,"value":46},"text","Semaphore",{"type":40,"tag":48,"props":49,"children":51},"h2",{"id":50},"overview",[52],{"type":45,"value":53},"Overview",{"type":40,"tag":55,"props":56,"children":57},"p",{},[58],{"type":45,"value":59},"Use this skill to help an agent turn a product goal such as \"let verified members vote anonymously\" or \"let conference attendees submit one private feedback message\" into a working Semaphore integration.",{"type":40,"tag":55,"props":61,"children":62},{},[63],{"type":45,"value":64},"Semaphore is useful when an app needs a user to prove group membership and send a message without revealing which group member sent it. The practical building blocks are:",{"type":40,"tag":66,"props":67,"children":68},"ul",{},[69,75,80,85],{"type":40,"tag":70,"props":71,"children":72},"li",{},[73],{"type":45,"value":74},"identities: private keys, public keys, and public identity commitments;",{"type":40,"tag":70,"props":76,"children":77},{},[78],{"type":45,"value":79},"groups: Merkle trees containing identity commitments;",{"type":40,"tag":70,"props":81,"children":82},{},[83],{"type":45,"value":84},"proofs: zero-knowledge proofs over membership, a message, and a scope;",{"type":40,"tag":70,"props":86,"children":87},{},[88],{"type":45,"value":89},"nullifiers: public values used to reject duplicate signals for the same scope.",{"type":40,"tag":55,"props":91,"children":92},{},[93],{"type":45,"value":94},"Current app-building should target Semaphore V4 unless the existing codebase already uses an older version.",{"type":40,"tag":48,"props":96,"children":98},{"id":97},"workflow",[99],{"type":45,"value":100},"Workflow",{"type":40,"tag":102,"props":103,"children":104},"ol",{},[105,110,115,120,125,130,135,140,145],{"type":40,"tag":70,"props":106,"children":107},{},[108],{"type":45,"value":109},"Clarify the action the user wants to protect: vote, post, endorse, claim, join, or submit feedback.",{"type":40,"tag":70,"props":111,"children":112},{},[113],{"type":45,"value":114},"Decide whether Semaphore is appropriate: the app needs anonymous group membership, not private arbitrary computation or private credentials by itself.",{"type":40,"tag":70,"props":116,"children":117},{},[118],{"type":45,"value":119},"Define the group source: off-chain list, on-chain group, allowlist, token ownership snapshot, credential proof, or admin-managed registry.",{"type":40,"tag":70,"props":121,"children":122},{},[123],{"type":45,"value":124},"Define the scope: ballot id, proposal id, room id, campaign id, epoch, or another value that determines where one identity may only signal once.",{"type":40,"tag":70,"props":126,"children":127},{},[128],{"type":45,"value":129},"Define the message: the vote choice, feedback hash, post hash, endorsement target, claim data, or another public value.",{"type":40,"tag":70,"props":131,"children":132},{},[133],{"type":45,"value":134},"Choose the integration path: off-chain proof verification for prototypes, on-chain validation for contracts, or a hybrid app with off-chain proof generation and on-chain validation.",{"type":40,"tag":70,"props":136,"children":137},{},[138],{"type":45,"value":139},"Implement identity creation or recovery, group loading, proof generation, proof submission, verification, and duplicate-nullifier handling.",{"type":40,"tag":70,"props":141,"children":142},{},[143],{"type":45,"value":144},"Test with multiple identities, duplicate submissions, stale groups, invalid proofs, and small anonymity sets.",{"type":40,"tag":70,"props":146,"children":147},{},[148,150,157,159,165],{"type":45,"value":149},"Before claiming the app works, confirm the final path uses real ",{"type":40,"tag":151,"props":152,"children":154},"code",{"className":153},[],[155],{"type":45,"value":156},"generateProof",{"type":45,"value":158}," plus real ",{"type":40,"tag":151,"props":160,"children":162},{"className":161},[],[163],{"type":45,"value":164},"verifyProof",{"type":45,"value":166}," or official contract validation. Mock verifiers, server counters, and trusted client claims are scaffolding only.",{"type":40,"tag":48,"props":168,"children":170},{"id":169},"recommended-references",[171],{"type":45,"value":172},"Recommended References",{"type":40,"tag":66,"props":174,"children":175},{},[176,189,200,211,222,233],{"type":40,"tag":70,"props":177,"children":178},{},[179,181],{"type":45,"value":180},"Semaphore docs: ",{"type":40,"tag":182,"props":183,"children":187},"a",{"href":184,"rel":185},"https:\u002F\u002Fdocs.semaphore.pse.dev\u002F",[186],"nofollow",[188],{"type":45,"value":184},{"type":40,"tag":70,"props":190,"children":191},{},[192,194],{"type":45,"value":193},"JavaScript SDK TypeDoc: ",{"type":40,"tag":182,"props":195,"children":198},{"href":196,"rel":197},"https:\u002F\u002Fjs.semaphore.pse.dev\u002F",[186],[199],{"type":45,"value":196},{"type":40,"tag":70,"props":201,"children":202},{},[203,205],{"type":45,"value":204},"GitHub repository: ",{"type":40,"tag":182,"props":206,"children":209},{"href":207,"rel":208},"https:\u002F\u002Fgithub.com\u002Fsemaphore-protocol\u002Fsemaphore",[186],[210],{"type":45,"value":207},{"type":40,"tag":70,"props":212,"children":213},{},[214,216],{"type":45,"value":215},"Deployed contracts: ",{"type":40,"tag":182,"props":217,"children":220},{"href":218,"rel":219},"https:\u002F\u002Fdocs.semaphore.pse.dev\u002Fdeployed-contracts",[186],[221],{"type":45,"value":218},{"type":40,"tag":70,"props":223,"children":224},{},[225,227],{"type":45,"value":226},"CLI templates: ",{"type":40,"tag":151,"props":228,"children":230},{"className":229},[],[231],{"type":45,"value":232},"npx @semaphore-protocol\u002Fcli create my-app --template monorepo-ethers",{"type":40,"tag":70,"props":234,"children":235},{},[236,238],{"type":45,"value":237},"Implementation card: ",{"type":40,"tag":151,"props":239,"children":241},{"className":240},[],[242],{"type":45,"value":243},"references\u002Fsemaphore-v4-implementation.md",{"type":40,"tag":48,"props":245,"children":247},{"id":246},"implementation-choices",[248],{"type":45,"value":249},"Implementation Choices",{"type":40,"tag":55,"props":251,"children":252},{},[253,255,260],{"type":45,"value":254},"For one-shot app work, read ",{"type":40,"tag":151,"props":256,"children":258},{"className":257},[],[259],{"type":45,"value":243},{"type":45,"value":261}," before writing code. It contains the verified V4 proof shape, off-chain verifier route, database constraints for used nullifiers, browser artifact notes, and required tests.",{"type":40,"tag":55,"props":263,"children":264},{},[265,267,273],{"type":45,"value":266},"Prefer ",{"type":40,"tag":151,"props":268,"children":270},{"className":269},[],[271],{"type":45,"value":272},"@semaphore-protocol\u002Fcore",{"type":45,"value":274}," for new JavaScript or TypeScript app code when the app needs identity, group, and proof utilities together. Use the narrower packages when the codebase already imports them:",{"type":40,"tag":66,"props":276,"children":277},{},[278,297,314,337,348],{"type":40,"tag":70,"props":279,"children":280},{},[281,287,289,295],{"type":40,"tag":151,"props":282,"children":284},{"className":283},[],[285],{"type":45,"value":286},"@semaphore-protocol\u002Fidentity",{"type":45,"value":288}," for ",{"type":40,"tag":151,"props":290,"children":292},{"className":291},[],[293],{"type":45,"value":294},"Identity",{"type":45,"value":296},";",{"type":40,"tag":70,"props":298,"children":299},{},[300,306,307,313],{"type":40,"tag":151,"props":301,"children":303},{"className":302},[],[304],{"type":45,"value":305},"@semaphore-protocol\u002Fgroup",{"type":45,"value":288},{"type":40,"tag":151,"props":308,"children":310},{"className":309},[],[311],{"type":45,"value":312},"Group",{"type":45,"value":296},{"type":40,"tag":70,"props":315,"children":316},{},[317,323,324,329,331,336],{"type":40,"tag":151,"props":318,"children":320},{"className":319},[],[321],{"type":45,"value":322},"@semaphore-protocol\u002Fproof",{"type":45,"value":288},{"type":40,"tag":151,"props":325,"children":327},{"className":326},[],[328],{"type":45,"value":156},{"type":45,"value":330}," and ",{"type":40,"tag":151,"props":332,"children":334},{"className":333},[],[335],{"type":45,"value":164},{"type":45,"value":296},{"type":40,"tag":70,"props":338,"children":339},{},[340,346],{"type":40,"tag":151,"props":341,"children":343},{"className":342},[],[344],{"type":45,"value":345},"@semaphore-protocol\u002Fcontracts",{"type":45,"value":347}," for Solidity interfaces and on-chain validation;",{"type":40,"tag":70,"props":349,"children":350},{},[351,357],{"type":40,"tag":151,"props":352,"children":354},{"className":353},[],[355],{"type":45,"value":356},"@semaphore-protocol\u002Fdata",{"type":45,"value":358}," for loading on-chain group data from supported networks.",{"type":40,"tag":55,"props":360,"children":361},{},[362],{"type":45,"value":363},"For a fast prototype, build off-chain first:",{"type":40,"tag":365,"props":366,"children":371},"pre",{"className":367,"code":368,"language":369,"meta":370,"style":370},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Identity } from \"@semaphore-protocol\u002Fidentity\"\nimport { Group } from \"@semaphore-protocol\u002Fgroup\"\nimport { generateProof, verifyProof } from \"@semaphore-protocol\u002Fproof\"\n\nconst identity = new Identity()\nconst group = new Group([identity.commitment])\nconst message = 1\nconst scope = group.root\n\nconst proof = await generateProof(identity, group, message, scope)\nconst valid = await verifyProof(proof)\n","typescript","",[372],{"type":40,"tag":151,"props":373,"children":374},{"__ignoreMap":370},[375,424,461,507,517,552,592,615,646,654,711],{"type":40,"tag":376,"props":377,"children":380},"span",{"class":378,"line":379},"line",1,[381,387,393,399,404,409,414,419],{"type":40,"tag":376,"props":382,"children":384},{"style":383},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[385],{"type":45,"value":386},"import",{"type":40,"tag":376,"props":388,"children":390},{"style":389},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[391],{"type":45,"value":392}," {",{"type":40,"tag":376,"props":394,"children":396},{"style":395},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[397],{"type":45,"value":398}," Identity",{"type":40,"tag":376,"props":400,"children":401},{"style":389},[402],{"type":45,"value":403}," }",{"type":40,"tag":376,"props":405,"children":406},{"style":383},[407],{"type":45,"value":408}," from",{"type":40,"tag":376,"props":410,"children":411},{"style":389},[412],{"type":45,"value":413}," \"",{"type":40,"tag":376,"props":415,"children":417},{"style":416},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[418],{"type":45,"value":286},{"type":40,"tag":376,"props":420,"children":421},{"style":389},[422],{"type":45,"value":423},"\"\n",{"type":40,"tag":376,"props":425,"children":427},{"class":378,"line":426},2,[428,432,436,441,445,449,453,457],{"type":40,"tag":376,"props":429,"children":430},{"style":383},[431],{"type":45,"value":386},{"type":40,"tag":376,"props":433,"children":434},{"style":389},[435],{"type":45,"value":392},{"type":40,"tag":376,"props":437,"children":438},{"style":395},[439],{"type":45,"value":440}," Group",{"type":40,"tag":376,"props":442,"children":443},{"style":389},[444],{"type":45,"value":403},{"type":40,"tag":376,"props":446,"children":447},{"style":383},[448],{"type":45,"value":408},{"type":40,"tag":376,"props":450,"children":451},{"style":389},[452],{"type":45,"value":413},{"type":40,"tag":376,"props":454,"children":455},{"style":416},[456],{"type":45,"value":305},{"type":40,"tag":376,"props":458,"children":459},{"style":389},[460],{"type":45,"value":423},{"type":40,"tag":376,"props":462,"children":463},{"class":378,"line":23},[464,468,472,477,482,487,491,495,499,503],{"type":40,"tag":376,"props":465,"children":466},{"style":383},[467],{"type":45,"value":386},{"type":40,"tag":376,"props":469,"children":470},{"style":389},[471],{"type":45,"value":392},{"type":40,"tag":376,"props":473,"children":474},{"style":395},[475],{"type":45,"value":476}," generateProof",{"type":40,"tag":376,"props":478,"children":479},{"style":389},[480],{"type":45,"value":481},",",{"type":40,"tag":376,"props":483,"children":484},{"style":395},[485],{"type":45,"value":486}," verifyProof",{"type":40,"tag":376,"props":488,"children":489},{"style":389},[490],{"type":45,"value":403},{"type":40,"tag":376,"props":492,"children":493},{"style":383},[494],{"type":45,"value":408},{"type":40,"tag":376,"props":496,"children":497},{"style":389},[498],{"type":45,"value":413},{"type":40,"tag":376,"props":500,"children":501},{"style":416},[502],{"type":45,"value":322},{"type":40,"tag":376,"props":504,"children":505},{"style":389},[506],{"type":45,"value":423},{"type":40,"tag":376,"props":508,"children":510},{"class":378,"line":509},4,[511],{"type":40,"tag":376,"props":512,"children":514},{"emptyLinePlaceholder":513},true,[515],{"type":45,"value":516},"\n",{"type":40,"tag":376,"props":518,"children":520},{"class":378,"line":519},5,[521,527,532,537,542,547],{"type":40,"tag":376,"props":522,"children":524},{"style":523},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[525],{"type":45,"value":526},"const",{"type":40,"tag":376,"props":528,"children":529},{"style":395},[530],{"type":45,"value":531}," identity ",{"type":40,"tag":376,"props":533,"children":534},{"style":389},[535],{"type":45,"value":536},"=",{"type":40,"tag":376,"props":538,"children":539},{"style":389},[540],{"type":45,"value":541}," new",{"type":40,"tag":376,"props":543,"children":545},{"style":544},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[546],{"type":45,"value":398},{"type":40,"tag":376,"props":548,"children":549},{"style":395},[550],{"type":45,"value":551},"()\n",{"type":40,"tag":376,"props":553,"children":555},{"class":378,"line":554},6,[556,560,565,569,573,577,582,587],{"type":40,"tag":376,"props":557,"children":558},{"style":523},[559],{"type":45,"value":526},{"type":40,"tag":376,"props":561,"children":562},{"style":395},[563],{"type":45,"value":564}," group ",{"type":40,"tag":376,"props":566,"children":567},{"style":389},[568],{"type":45,"value":536},{"type":40,"tag":376,"props":570,"children":571},{"style":389},[572],{"type":45,"value":541},{"type":40,"tag":376,"props":574,"children":575},{"style":544},[576],{"type":45,"value":440},{"type":40,"tag":376,"props":578,"children":579},{"style":395},[580],{"type":45,"value":581},"([identity",{"type":40,"tag":376,"props":583,"children":584},{"style":389},[585],{"type":45,"value":586},".",{"type":40,"tag":376,"props":588,"children":589},{"style":395},[590],{"type":45,"value":591},"commitment])\n",{"type":40,"tag":376,"props":593,"children":595},{"class":378,"line":594},7,[596,600,605,609],{"type":40,"tag":376,"props":597,"children":598},{"style":523},[599],{"type":45,"value":526},{"type":40,"tag":376,"props":601,"children":602},{"style":395},[603],{"type":45,"value":604}," message ",{"type":40,"tag":376,"props":606,"children":607},{"style":389},[608],{"type":45,"value":536},{"type":40,"tag":376,"props":610,"children":612},{"style":611},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[613],{"type":45,"value":614}," 1\n",{"type":40,"tag":376,"props":616,"children":618},{"class":378,"line":617},8,[619,623,628,632,637,641],{"type":40,"tag":376,"props":620,"children":621},{"style":523},[622],{"type":45,"value":526},{"type":40,"tag":376,"props":624,"children":625},{"style":395},[626],{"type":45,"value":627}," scope ",{"type":40,"tag":376,"props":629,"children":630},{"style":389},[631],{"type":45,"value":536},{"type":40,"tag":376,"props":633,"children":634},{"style":395},[635],{"type":45,"value":636}," group",{"type":40,"tag":376,"props":638,"children":639},{"style":389},[640],{"type":45,"value":586},{"type":40,"tag":376,"props":642,"children":643},{"style":395},[644],{"type":45,"value":645},"root\n",{"type":40,"tag":376,"props":647,"children":649},{"class":378,"line":648},9,[650],{"type":40,"tag":376,"props":651,"children":652},{"emptyLinePlaceholder":513},[653],{"type":45,"value":516},{"type":40,"tag":376,"props":655,"children":657},{"class":378,"line":656},10,[658,662,667,671,676,680,685,689,693,697,702,706],{"type":40,"tag":376,"props":659,"children":660},{"style":523},[661],{"type":45,"value":526},{"type":40,"tag":376,"props":663,"children":664},{"style":395},[665],{"type":45,"value":666}," proof ",{"type":40,"tag":376,"props":668,"children":669},{"style":389},[670],{"type":45,"value":536},{"type":40,"tag":376,"props":672,"children":673},{"style":383},[674],{"type":45,"value":675}," await",{"type":40,"tag":376,"props":677,"children":678},{"style":544},[679],{"type":45,"value":476},{"type":40,"tag":376,"props":681,"children":682},{"style":395},[683],{"type":45,"value":684},"(identity",{"type":40,"tag":376,"props":686,"children":687},{"style":389},[688],{"type":45,"value":481},{"type":40,"tag":376,"props":690,"children":691},{"style":395},[692],{"type":45,"value":636},{"type":40,"tag":376,"props":694,"children":695},{"style":389},[696],{"type":45,"value":481},{"type":40,"tag":376,"props":698,"children":699},{"style":395},[700],{"type":45,"value":701}," message",{"type":40,"tag":376,"props":703,"children":704},{"style":389},[705],{"type":45,"value":481},{"type":40,"tag":376,"props":707,"children":708},{"style":395},[709],{"type":45,"value":710}," scope)\n",{"type":40,"tag":376,"props":712,"children":714},{"class":378,"line":713},11,[715,719,724,728,732,736],{"type":40,"tag":376,"props":716,"children":717},{"style":523},[718],{"type":45,"value":526},{"type":40,"tag":376,"props":720,"children":721},{"style":395},[722],{"type":45,"value":723}," valid ",{"type":40,"tag":376,"props":725,"children":726},{"style":389},[727],{"type":45,"value":536},{"type":40,"tag":376,"props":729,"children":730},{"style":383},[731],{"type":45,"value":675},{"type":40,"tag":376,"props":733,"children":734},{"style":544},[735],{"type":45,"value":486},{"type":40,"tag":376,"props":737,"children":738},{"style":395},[739],{"type":45,"value":740},"(proof)\n",{"type":40,"tag":55,"props":742,"children":743},{},[744,746,752,754,760,762,767],{"type":45,"value":745},"For an on-chain app, keep proof generation in the client or backend and validate with the Semaphore contract. Use ",{"type":40,"tag":151,"props":747,"children":749},{"className":748},[],[750],{"type":45,"value":751},"Semaphore.sol",{"type":45,"value":753}," or ",{"type":40,"tag":151,"props":755,"children":757},{"className":756},[],[758],{"type":45,"value":759},"ISemaphore.sol",{"type":45,"value":761}," from ",{"type":40,"tag":151,"props":763,"children":765},{"className":764},[],[766],{"type":45,"value":345},{"type":45,"value":768},"; do not write a custom verifier unless the app has a specific reason and tests.",{"type":40,"tag":48,"props":770,"children":772},{"id":771},"working-app-definition-of-done",[773],{"type":45,"value":774},"Working App Definition Of Done",{"type":40,"tag":55,"props":776,"children":777},{},[778],{"type":45,"value":779},"A finished Semaphore app must include:",{"type":40,"tag":66,"props":781,"children":782},{},[783,788,793,798,803,808,813,818,823],{"type":40,"tag":70,"props":784,"children":785},{},[786],{"type":45,"value":787},"a concrete identity creation or recovery model;",{"type":40,"tag":70,"props":789,"children":790},{},[791],{"type":45,"value":792},"a concrete registration or membership model with identity commitments only;",{"type":40,"tag":70,"props":794,"children":795},{},[796],{"type":45,"value":797},"group state that the verifier or contract trusts;",{"type":40,"tag":70,"props":799,"children":800},{},[801],{"type":45,"value":802},"app-specific scope and message encoding;",{"type":40,"tag":70,"props":804,"children":805},{},[806],{"type":45,"value":807},"real proof generation with Semaphore;",{"type":40,"tag":70,"props":809,"children":810},{},[811],{"type":45,"value":812},"real proof verification off-chain, on-chain, or both;",{"type":40,"tag":70,"props":814,"children":815},{},[816],{"type":45,"value":817},"root, scope, message, and nullifier checks before side effects;",{"type":40,"tag":70,"props":819,"children":820},{},[821],{"type":45,"value":822},"duplicate prevention through a transaction\u002Funique constraint or the official Semaphore contract;",{"type":40,"tag":70,"props":824,"children":825},{},[826],{"type":45,"value":827},"behavioral tests for valid member action, duplicate action, second member action, non-member or untrusted-root proof, tampered message, wrong scope, and stale or unknown root behavior.",{"type":40,"tag":55,"props":829,"children":830},{},[831],{"type":45,"value":832},"If any mock verifier, server-side-only counter, or client-claimed membership remains, do not describe the result as a working Semaphore app. Mark it as incomplete scaffolding and state which real proof or validation path is missing.",{"type":40,"tag":48,"props":834,"children":836},{"id":835},"app-design-checklist",[837],{"type":45,"value":838},"App Design Checklist",{"type":40,"tag":55,"props":840,"children":841},{},[842],{"type":45,"value":843},"Before writing code, record:",{"type":40,"tag":66,"props":845,"children":846},{},[847,852,857,862,867,872,877,882,887,892],{"type":40,"tag":70,"props":848,"children":849},{},[850],{"type":45,"value":851},"user action and threat model;",{"type":40,"tag":70,"props":853,"children":854},{},[855],{"type":45,"value":856},"group id or group construction rule;",{"type":40,"tag":70,"props":858,"children":859},{},[860],{"type":45,"value":861},"who may add, update, or remove group members;",{"type":40,"tag":70,"props":863,"children":864},{},[865],{"type":45,"value":866},"identity recovery strategy;",{"type":40,"tag":70,"props":868,"children":869},{},[870],{"type":45,"value":871},"scope value and why it prevents only the intended duplicate action;",{"type":40,"tag":70,"props":873,"children":874},{},[875],{"type":45,"value":876},"message encoding and whether large data should be hashed before proof generation;",{"type":40,"tag":70,"props":878,"children":879},{},[880],{"type":45,"value":881},"proof generation location: browser, mobile app, backend, or test script;",{"type":40,"tag":70,"props":883,"children":884},{},[885],{"type":45,"value":886},"verification location: backend, smart contract, or both;",{"type":40,"tag":70,"props":888,"children":889},{},[890],{"type":45,"value":891},"nullifier storage and duplicate rejection path;",{"type":40,"tag":70,"props":893,"children":894},{},[895],{"type":45,"value":896},"expected group size and anonymity set risks.",{"type":40,"tag":55,"props":898,"children":899},{},[900],{"type":45,"value":901},"Use unique identity derivation prompts per application. If deriving identities from wallet signatures, use an app-specific message and warn against reusing the same signed message across apps because it can link identities.",{"type":40,"tag":55,"props":903,"children":904},{},[905],{"type":45,"value":906},"Avoid groups with 1 or 2 members for real privacy. They can be useful in tests but should not be described as anonymous.",{"type":40,"tag":48,"props":908,"children":910},{"id":909},"common-app-patterns",[911],{"type":45,"value":912},"Common App Patterns",{"type":40,"tag":914,"props":915,"children":917},"h3",{"id":916},"anonymous-voting",[918],{"type":45,"value":919},"Anonymous Voting",{"type":40,"tag":55,"props":921,"children":922},{},[923],{"type":45,"value":924},"Use a group for eligible voters. Use the ballot or proposal id as the scope. Use the vote choice or a hash of a structured ballot as the message. Store used nullifiers and reject duplicates.",{"type":40,"tag":55,"props":926,"children":927},{},[928],{"type":45,"value":929},"Test:",{"type":40,"tag":66,"props":931,"children":932},{},[933,938,943,948,953],{"type":40,"tag":70,"props":934,"children":935},{},[936],{"type":45,"value":937},"valid member can vote once;",{"type":40,"tag":70,"props":939,"children":940},{},[941],{"type":45,"value":942},"same identity cannot vote twice for the same scope;",{"type":40,"tag":70,"props":944,"children":945},{},[946],{"type":45,"value":947},"same identity can vote in a different scope if allowed;",{"type":40,"tag":70,"props":949,"children":950},{},[951],{"type":45,"value":952},"non-member proof fails;",{"type":40,"tag":70,"props":954,"children":955},{},[956],{"type":45,"value":957},"proof with tampered message fails.",{"type":40,"tag":914,"props":959,"children":961},{"id":960},"anonymous-feedback",[962],{"type":45,"value":963},"Anonymous Feedback",{"type":40,"tag":55,"props":965,"children":966},{},[967],{"type":45,"value":968},"Use a group for eligible feedback authors. Use the event id, class id, or room id as the scope. Use a feedback hash as the message if the raw feedback should stay off-chain or be stored elsewhere.",{"type":40,"tag":55,"props":970,"children":971},{},[972],{"type":45,"value":973},"Test duplicate nullifier rejection and moderation requirements. Semaphore proves group membership; it does not make abusive content safe.",{"type":40,"tag":914,"props":975,"children":977},{"id":976},"anonymous-posting-or-signaling",[978],{"type":45,"value":979},"Anonymous Posting Or Signaling",{"type":40,"tag":55,"props":981,"children":982},{},[983],{"type":45,"value":984},"Use a scope that represents a topic, epoch, channel, or campaign. If the app allows more than one message per period, plain Semaphore may be too restrictive; consider multiple scopes or RLN for privacy-preserving rate limits.",{"type":40,"tag":48,"props":986,"children":988},{"id":987},"backend-and-contract-guidance",[989],{"type":45,"value":990},"Backend And Contract Guidance",{"type":40,"tag":55,"props":992,"children":993},{},[994],{"type":45,"value":995},"For off-chain verification:",{"type":40,"tag":66,"props":997,"children":998},{},[999,1010,1015,1020,1025],{"type":40,"tag":70,"props":1000,"children":1001},{},[1002,1004,1009],{"type":45,"value":1003},"verify the proof with ",{"type":40,"tag":151,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":45,"value":164},{"type":45,"value":296},{"type":40,"tag":70,"props":1011,"children":1012},{},[1013],{"type":45,"value":1014},"check the proof's group root is trusted for the relevant group;",{"type":40,"tag":70,"props":1016,"children":1017},{},[1018],{"type":45,"value":1019},"check the scope is exactly the expected scope;",{"type":40,"tag":70,"props":1021,"children":1022},{},[1023],{"type":45,"value":1024},"check the message matches the submitted action;",{"type":40,"tag":70,"props":1026,"children":1027},{},[1028],{"type":45,"value":1029},"persist the nullifier before accepting side effects, or use a transaction\u002Funique constraint to avoid races.",{"type":40,"tag":55,"props":1031,"children":1032},{},[1033],{"type":45,"value":1034},"For on-chain verification:",{"type":40,"tag":66,"props":1036,"children":1037},{},[1038,1043,1048,1053,1066],{"type":40,"tag":70,"props":1039,"children":1040},{},[1041],{"type":45,"value":1042},"use the official Semaphore interface and deployed contract where practical;",{"type":40,"tag":70,"props":1044,"children":1045},{},[1046],{"type":45,"value":1047},"create or reference a group id;",{"type":40,"tag":70,"props":1049,"children":1050},{},[1051],{"type":45,"value":1052},"add members with identity commitments only, never private keys;",{"type":40,"tag":70,"props":1054,"children":1055},{},[1056,1058,1064],{"type":45,"value":1057},"call ",{"type":40,"tag":151,"props":1059,"children":1061},{"className":1060},[],[1062],{"type":45,"value":1063},"validateProof(groupId, proof)",{"type":45,"value":1065}," for submitted proofs;",{"type":40,"tag":70,"props":1067,"children":1068},{},[1069],{"type":45,"value":1070},"store accepted nullifiers or rely on the Semaphore contract behavior required by the chosen flow.",{"type":40,"tag":55,"props":1072,"children":1073},{},[1074,1076,1082,1083,1089,1091,1097,1099,1104],{"type":45,"value":1075},"For local on-chain harnesses, the official npm package exposes Solidity files at package-root paths such as ",{"type":40,"tag":151,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":45,"value":1081},"@semaphore-protocol\u002Fcontracts\u002FSemaphore.sol",{"type":45,"value":330},{"type":40,"tag":151,"props":1084,"children":1086},{"className":1085},[],[1087],{"type":45,"value":1088},"@semaphore-protocol\u002Fcontracts\u002Finterfaces\u002FISemaphore.sol",{"type":45,"value":1090},". If the Solidity toolchain does not emit deployable artifacts for package contracts, add a local import wrapper contract and deploy\u002Flink ",{"type":40,"tag":151,"props":1092,"children":1094},{"className":1093},[],[1095],{"type":45,"value":1096},"PoseidonT3",{"type":45,"value":1098}," before deploying ",{"type":40,"tag":151,"props":1100,"children":1102},{"className":1101},[],[1103],{"type":45,"value":46},{"type":45,"value":586},{"type":40,"tag":55,"props":1106,"children":1107},{},[1108],{"type":45,"value":1109},"When loading on-chain groups off-chain, reconstruct the group from trusted subgraph or contract data and handle stale roots. Semaphore contracts may allow old roots for a configured duration; make that duration explicit in app behavior.",{"type":40,"tag":48,"props":1111,"children":1113},{"id":1112},"security-and-privacy-rules",[1114],{"type":45,"value":1115},"Security And Privacy Rules",{"type":40,"tag":66,"props":1117,"children":1118},{},[1119,1124,1129,1134,1139,1144],{"type":40,"tag":70,"props":1120,"children":1121},{},[1122],{"type":45,"value":1123},"Never log, commit, or transmit a Semaphore private key unless the user explicitly asked to export it.",{"type":40,"tag":70,"props":1125,"children":1126},{},[1127],{"type":45,"value":1128},"Never store identity private keys in plaintext local storage for a production app.",{"type":40,"tag":70,"props":1130,"children":1131},{},[1132],{"type":45,"value":1133},"Do not call a public identity commitment a private identifier; it is safe to share but linkable wherever reused.",{"type":40,"tag":70,"props":1135,"children":1136},{},[1137],{"type":45,"value":1138},"Do not use the same wallet-signature challenge across different apps.",{"type":40,"tag":70,"props":1140,"children":1141},{},[1142],{"type":45,"value":1143},"Do not accept a proof just because it verifies cryptographically; also check group, scope, message, root freshness, and nullifier uniqueness.",{"type":40,"tag":70,"props":1145,"children":1146},{},[1147],{"type":45,"value":1148},"Do not promise anonymity when the group is tiny, the group list is uniquely identifying, or the action metadata deanonymizes the user.",{"type":40,"tag":48,"props":1150,"children":1152},{"id":1151},"verification",[1153],{"type":45,"value":1154},"Verification",{"type":40,"tag":55,"props":1156,"children":1157},{},[1158],{"type":45,"value":1159},"For application code, run the repository's normal typecheck and test commands. Add focused tests for:",{"type":40,"tag":66,"props":1161,"children":1162},{},[1163,1168,1173,1178,1183,1188],{"type":40,"tag":70,"props":1164,"children":1165},{},[1166],{"type":45,"value":1167},"identity creation\u002Fimport;",{"type":40,"tag":70,"props":1169,"children":1170},{},[1171],{"type":45,"value":1172},"group membership and Merkle proof generation;",{"type":40,"tag":70,"props":1174,"children":1175},{},[1176],{"type":45,"value":1177},"proof generation and verification;",{"type":40,"tag":70,"props":1179,"children":1180},{},[1181],{"type":45,"value":1182},"duplicate nullifier rejection;",{"type":40,"tag":70,"props":1184,"children":1185},{},[1186],{"type":45,"value":1187},"invalid group, invalid scope, and invalid message;",{"type":40,"tag":70,"props":1189,"children":1190},{},[1191],{"type":45,"value":1192},"on-chain validation if contracts are touched.",{"type":40,"tag":55,"props":1194,"children":1195},{},[1196],{"type":45,"value":1197},"For contract code, run unit tests against both valid and invalid proofs when fixtures are available. If proof generation is slow in CI, keep at least one integration test and use deterministic fixtures for faster unit tests.",{"type":40,"tag":55,"props":1199,"children":1200},{},[1201],{"type":45,"value":1202},"For browser apps, also exercise visible UI state for registration, proof generation, acceptance, duplicate rejection, non-member or stale-root rejection, and current vote\u002Faction counts. Screenshot capture is useful but DOM\u002FAPI assertions are acceptable when screenshot tooling is flaky.",{"type":40,"tag":55,"props":1204,"children":1205},{},[1206,1208,1213],{"type":45,"value":1207},"Before finishing, run the security, duplicate-nullifier, root-freshness, and browser-artifact checks in ",{"type":40,"tag":151,"props":1209,"children":1211},{"className":1210},[],[1212],{"type":45,"value":243},{"type":45,"value":586},{"type":40,"tag":48,"props":1215,"children":1217},{"id":1216},"output-expectations",[1218],{"type":45,"value":1219},"Output Expectations",{"type":40,"tag":55,"props":1221,"children":1222},{},[1223],{"type":45,"value":1224},"When building an app integration, produce:",{"type":40,"tag":66,"props":1226,"children":1227},{},[1228,1233,1238,1243,1248,1253,1258],{"type":40,"tag":70,"props":1229,"children":1230},{},[1231],{"type":45,"value":1232},"the group and membership model;",{"type":40,"tag":70,"props":1234,"children":1235},{},[1236],{"type":45,"value":1237},"identity creation or recovery strategy;",{"type":40,"tag":70,"props":1239,"children":1240},{},[1241],{"type":45,"value":1242},"scope and message definitions;",{"type":40,"tag":70,"props":1244,"children":1245},{},[1246],{"type":45,"value":1247},"proof generation and verification code path;",{"type":40,"tag":70,"props":1249,"children":1250},{},[1251],{"type":45,"value":1252},"nullifier duplicate handling;",{"type":40,"tag":70,"props":1254,"children":1255},{},[1256],{"type":45,"value":1257},"commands used for build and tests;",{"type":40,"tag":70,"props":1259,"children":1260},{},[1261],{"type":45,"value":1262},"known privacy limitations and remaining setup steps.",{"type":40,"tag":55,"props":1264,"children":1265},{},[1266],{"type":45,"value":1267},"When only planning, produce the same information without code edits and clearly mark unknowns such as group source, network, deployed contract address, or identity recovery requirements.",{"type":40,"tag":1269,"props":1270,"children":1271},"style",{},[1272],{"type":45,"value":1273},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1275,"total":509},[1276,1288,1299,1306],{"slug":1277,"name":1277,"fn":1278,"description":1279,"org":1280,"tags":1281,"stars":656,"repoUrl":1286,"updatedAt":1287},"state-actor","generate and verify Ethereum databases","Use this skill when a user wants to generate, boot, verify, or extend a state-actor-produced Ethereum database. Covers --client, --spec, --target-size, per-client boot recipes (geth \u002F reth \u002F besu \u002F nethermind \u002F ethrex \u002F erigon), and the canonical 29-entity spec fixture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1282,1285],{"name":1283,"slug":1284,"type":15},"Database","database",{"name":9,"slug":8,"type":15},"https:\u002F\u002Fgithub.com\u002Fethereum\u002Fstate-actor","2026-08-07T04:40:34.14665",{"slug":1289,"name":1289,"fn":1290,"description":1291,"org":1292,"tags":1293,"stars":23,"repoUrl":24,"updatedAt":1298},"rln","build privacy-preserving rate-limiting applications","Route, build, adapt, and debug Rate-Limiting Nullifier (RLN) applications. Use when a user wants privacy-preserving rate limits, anonymous chat or posting with spam deterrence, nullifier-based abuse detection, RLN registration\u002Fsignaling\u002Fslashing flows, RLN V3 with Semaphore V4 or Noir, or guidance on choosing an RLN version.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1294,1295,1296,1297],{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},"2026-08-20T03:53:24.30695",{"slug":4,"name":4,"fn":5,"description":6,"org":1300,"tags":1301,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1302,1303,1304,1305],{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"slug":1307,"name":1307,"fn":1308,"description":1309,"org":1310,"tags":1311,"stars":23,"repoUrl":24,"updatedAt":1318},"tlsnotary","build and debug TLSNotary workflows","Build, adapt, and debug TLSNotary agent workflows and TLSNotary Extension plugins. Use when a user wants to prove data from a web service with TLSNotary, create or review a TLSNotary extension plugin, find a JSON API endpoint to notarize, design selective disclosure handlers, intercept browser auth headers, size maxRecvData\u002FmaxSentData, or troubleshoot TLSNotary proof generation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1312,1315,1316,1317],{"name":1313,"slug":1314,"type":15},"Cryptography","cryptography",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},"2026-08-20T03:53:27.874217",{"items":1320,"total":23},[1321,1328,1335],{"slug":1289,"name":1289,"fn":1290,"description":1291,"org":1322,"tags":1323,"stars":23,"repoUrl":24,"updatedAt":1298},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1324,1325,1326,1327],{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1329,"tags":1330,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1331,1332,1333,1334],{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"slug":1307,"name":1307,"fn":1308,"description":1309,"org":1336,"tags":1337,"stars":23,"repoUrl":24,"updatedAt":1318},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1338,1339,1340,1341],{"name":1313,"slug":1314,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15}]