{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "domino",
  "homepage": "https://github.com/GetDomino/relay",
  "items": [
    {
      "name": "photo-quest",
      "type": "registry:item",
      "title": "Photo verification quest",
      "description": "Verify a submitted photo, send uncertain results to staff, and award points.",
      "categories": ["quests", "photo"],
      "docs": "Requires an existing Domino project with @domino-sdk/relay. Customize the quest key, photo criteria, and point ledger. Live verification requires Workers AI. See docs/snippets/photo-quest.md.",
      "files": [
        {
          "path": "snippets/photo-quest/photo.quest.ts",
          "type": "registry:file",
          "target": "~/quests/photo.quest.ts"
        },
        {
          "path": "snippets/photo-quest/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/photo-quest.md"
        }
      ]
    },
    {
      "name": "x-profile-picture",
      "type": "registry:item",
      "title": "X profile picture quest",
      "description": "Verify that a participant's X avatar uses your campaign picture, accept close matches without AI, review customized versions, and award points.",
      "categories": ["quests", "x", "images"],
      "docs": "Requires an existing Domino project with @domino-sdk/relay and X account linking. Add your campaign picture to images in relay.json and customize the quest key, criteria, similarity threshold and point ledger. Live verification requires X provider access, reference-image storage and Workers AI. See docs/snippets/x-profile-picture.md.",
      "files": [
        {
          "path": "snippets/x-profile-picture/x-profile-picture.quest.ts",
          "type": "registry:file",
          "target": "~/quests/x-profile-picture.quest.ts"
        },
        {
          "path": "snippets/x-profile-picture/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/x-profile-picture.md"
        }
      ]
    },
    {
      "name": "unique-photo",
      "type": "registry:item",
      "title": "Unique photo quest",
      "description": "Send photos another participant already submitted to staff, review the rest with AI, and award points.",
      "categories": ["quests", "photo", "images"],
      "docs": "Requires an existing Domino project with @domino-sdk/relay. Customize the quest key, photo criteria, similarity threshold and point ledger. Live verification requires Workers AI. See docs/snippets/unique-photo.md.",
      "files": [
        {
          "path": "snippets/unique-photo/unique-photo.quest.ts",
          "type": "registry:file",
          "target": "~/quests/unique-photo.quest.ts"
        },
        {
          "path": "snippets/unique-photo/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/unique-photo.md"
        }
      ]
    },
    {
      "name": "community-screenshot",
      "type": "registry:item",
      "title": "X Community screenshot quest",
      "description": "Read a Community screenshot with AI, match the username to the participant's linked X account, and award points.",
      "categories": ["quests", "x", "images", "photo"],
      "docs": "Requires an existing Domino project with @domino-sdk/relay and X account linking. Customize the quest key, Community name and point ledger. Live verification requires Workers AI and X provider access. See docs/snippets/community-screenshot.md.",
      "files": [
        {
          "path": "snippets/community-screenshot/community-screenshot.quest.ts",
          "type": "registry:file",
          "target": "~/quests/community-screenshot.quest.ts"
        },
        {
          "path": "snippets/community-screenshot/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/community-screenshot.md"
        }
      ]
    },
    {
      "name": "quiz",
      "type": "registry:item",
      "title": "Quiz quest",
      "description": "Check every quiz answer on the server and award points for a correct submission.",
      "categories": ["quests", "quiz"],
      "docs": "Requires an existing Domino project with @domino-sdk/relay. Replace the sample question and customize the quest key and point ledger. See docs/snippets/quiz.md.",
      "files": [
        {
          "path": "snippets/quiz/quiz.quest.ts",
          "type": "registry:file",
          "target": "~/quests/quiz.quest.ts"
        },
        {
          "path": "snippets/quiz/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/quiz.md"
        }
      ]
    },
    {
      "name": "staff-confirmation",
      "type": "registry:item",
      "title": "Staff confirmation quest",
      "description": "Let authorized staff confirm an activity and award the member points once.",
      "categories": ["quests", "staff"],
      "docs": "Requires an existing Domino project with @domino-sdk/relay. Customize the quest key, instructions, and point ledger. Confirmation requires a staff session. See docs/snippets/staff-confirmation.md.",
      "files": [
        {
          "path": "snippets/staff-confirmation/staff-confirmation.quest.ts",
          "type": "registry:file",
          "target": "~/quests/staff-confirmation.quest.ts"
        },
        {
          "path": "snippets/staff-confirmation/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/staff-confirmation.md"
        }
      ]
    },
    {
      "name": "discord-membership",
      "type": "registry:item",
      "title": "Discord account verification",
      "description": "Read the participant\u2019s verified Discord membership and apply custom membership or role rules.",
      "categories": ["quests", "discord", "connected-accounts"],
      "docs": "Requires Relay project integrations support and a Discord server connected in Console. See docs/snippets/discord-membership.md.",
      "files": [
        {
          "path": "snippets/discord-membership/discord-membership.quest.ts",
          "type": "registry:file",
          "target": "~/quests/discord-membership.quest.ts"
        },
        {
          "path": "snippets/discord-membership/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/discord-membership.md"
        }
      ]
    },
    {
      "name": "telegram-membership",
      "type": "registry:item",
      "title": "Telegram chat membership",
      "description": "Reward a participant whose linked Telegram account is in a chat the project connected.",
      "categories": ["quests", "telegram", "connected-accounts"],
      "docs": "Requires Relay Telegram chat support and a Telegram chat connected in Console. See docs/snippets/telegram-membership.md.",
      "files": [
        {
          "path": "snippets/telegram-membership/telegram-membership.quest.ts",
          "type": "registry:file",
          "target": "~/quests/telegram-membership.quest.ts"
        },
        {
          "path": "snippets/telegram-membership/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/telegram-membership.md"
        }
      ]
    },
    {
      "name": "telegram-contribution",
      "type": "registry:item",
      "title": "Telegram contribution",
      "description": "Reward group participation once per day. Messages are deduplicated, and no message text is stored.",
      "categories": ["quests", "telegram", "automatic"],
      "docs": "Connect a Telegram group in Console Integrations, add trackers/telegram-contribution-messages.ts to trackers in relay.json, and configure the quest settings. See docs/snippets/telegram-contribution.md.",
      "files": [
        {
          "path": "snippets/telegram-contribution/telegram-contribution.quest.ts",
          "type": "registry:file",
          "target": "~/quests/telegram-contribution.quest.ts"
        },
        {
          "path": "snippets/telegram-contribution/telegram-contribution-messages.ts",
          "type": "registry:file",
          "target": "~/trackers/telegram-contribution-messages.ts"
        },
        {
          "path": "snippets/telegram-contribution/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/telegram-contribution.md"
        }
      ]
    },
    {
      "name": "discord-announcements",
      "type": "registry:item",
      "title": "Automatic announcement reactions",
      "description": "Reward a linked participant once per Discord announcement, with a shared daily budget.",
      "categories": ["quests", "discord", "automatic"],
      "docs": "Requires the Discord integration and Gateway receiver. Add trackers/discord-announcement-reactions.ts to trackers in relay.json, then configure the announcement channel and publication cutoff. See docs/snippets/discord-announcements.md.",
      "files": [
        {
          "path": "snippets/discord-announcements/discord-announcements.quest.ts",
          "type": "registry:file",
          "target": "~/quests/discord-announcements.quest.ts"
        },
        {
          "path": "snippets/discord-announcements/discord-announcement-reactions.ts",
          "type": "registry:file",
          "target": "~/trackers/discord-announcement-reactions.ts"
        },
        {
          "path": "snippets/discord-announcements/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/discord-announcements.md"
        }
      ]
    },
    {
      "name": "discord-contribution",
      "type": "registry:item",
      "title": "Discord contribution",
      "description": "Reward channel participation once per day. Messages are deduplicated; content verification is optional authored logic.",
      "categories": ["quests", "discord"],
      "docs": "Connect Discord in Console Integrations, add trackers/discord-contribution-messages.ts to trackers in relay.json, and configure the quest settings. See docs/snippets/discord-contribution.md.",
      "files": [
        {
          "path": "snippets/discord-contribution/discord-contribution.quest.ts",
          "type": "registry:file",
          "target": "~/quests/discord-contribution.quest.ts"
        },
        {
          "path": "snippets/discord-contribution/discord-contribution-messages.ts",
          "type": "registry:file",
          "target": "~/trackers/discord-contribution-messages.ts"
        },
        {
          "path": "snippets/discord-contribution/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/discord-contribution.md"
        }
      ]
    },
    {
      "name": "discord-moderator-recognition",
      "type": "registry:item",
      "title": "Discord moderator recognition",
      "description": "Reward the message author when an authorized moderator reacts, once per message.",
      "categories": ["quests", "discord"],
      "docs": "Connect Discord in Console Integrations, add trackers/discord-recognition-reactions.ts to trackers in relay.json, and configure the quest settings. See docs/snippets/discord-moderator-recognition.md.",
      "files": [
        {
          "path": "snippets/discord-moderator-recognition/discord-moderator-recognition.quest.ts",
          "type": "registry:file",
          "target": "~/quests/discord-moderator-recognition.quest.ts"
        },
        {
          "path": "snippets/discord-moderator-recognition/discord-recognition-reactions.ts",
          "type": "registry:file",
          "target": "~/trackers/discord-recognition-reactions.ts"
        },
        {
          "path": "snippets/discord-moderator-recognition/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/discord-moderator-recognition.md"
        }
      ]
    },
    {
      "name": "discord-role-reward",
      "type": "registry:item",
      "title": "Discord role reward",
      "description": "Unlock a Discord role after a prerequisite quest with durable reward delivery.",
      "categories": ["quests", "discord"],
      "docs": "Connect Discord in Console Integrations. Installs a community-onboarding quest whose typed handle gates the role quest; adapt it or replace the import with an existing onboarding quest. Configure the reward role in Console. See docs/snippets/discord-role-reward.md.",
      "files": [
        {
          "path": "snippets/discord-role-reward/community-onboarding.quest.ts",
          "type": "registry:file",
          "target": "~/quests/community-onboarding.quest.ts"
        },
        {
          "path": "snippets/discord-role-reward/discord-role-reward.quest.ts",
          "type": "registry:file",
          "target": "~/quests/discord-role-reward.quest.ts"
        },
        {
          "path": "snippets/discord-role-reward/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/discord-role-reward.md"
        }
      ]
    },
    {
      "name": "token-holder",
      "type": "registry:item",
      "title": "Token holder quest",
      "description": "Check that a participant's linked wallets hold at least a minimum of a token or native coin, on Solana or an EVM chain, at verification time.",
      "categories": ["quests", "wallets"],
      "docs": "Requires wallet linking in your app and Relay with ctx.wallet.balance(). Configure the chain, token address and minimum. EVM chains need the platform's dRPC key. Checks the balance at verification time only; it does not prove the participant keeps holding it. See docs/snippets/token-holder.md.",
      "files": [
        {
          "path": "snippets/token-holder/token-holder.quest.ts",
          "type": "registry:file",
          "target": "~/quests/token-holder.quest.ts"
        },
        {
          "path": "snippets/token-holder/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/token-holder.md"
        }
      ]
    },
    {
      "name": "token-hold-streak",
      "type": "registry:item",
      "title": "Token hold streak",
      "description": "Reward members whose linked wallet holds at least a minimum of a token for 7 days in a row, from balances Domino samples once a day.",
      "categories": ["quests", "wallets", "automatic"],
      "docs": "Requires wallet linking in your app. Set the chain and token in trackers/token-hold-streak-balances.ts before the first deploy, add it to trackers in relay.json, and configure the minimum and the reward. A day with no successful sample breaks the streak. See docs/snippets/token-hold-streak.md.",
      "files": [
        {
          "path": "snippets/token-hold-streak/token-hold-streak.quest.ts",
          "type": "registry:file",
          "target": "~/quests/token-hold-streak.quest.ts"
        },
        {
          "path": "snippets/token-hold-streak/token-hold-streak-balances.ts",
          "type": "registry:file",
          "target": "~/trackers/token-hold-streak-balances.ts"
        },
        {
          "path": "snippets/token-hold-streak/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/token-hold-streak.md"
        }
      ]
    },
    {
      "name": "nft-holder",
      "type": "registry:item",
      "title": "NFT holder quest",
      "description": "Check that a participant's linked wallets hold at least one NFT from an ERC-721 collection, one ERC-1155 token ID, or a Metaplex verified collection on Solana, at verification time.",
      "categories": ["quests", "wallets"],
      "docs": "Requires wallet linking in your app and Relay with ctx.wallet.nfts(). Configure the collection with settings.nft(); publication checks an EVM contract's standard through ERC-165, or that a Solana mint is a Metaplex collection NFT. EVM collections need the platform's dRPC key. Checks holdings at verification time only; it does not prove the participant keeps holding them. See docs/snippets/nft-holder.md.",
      "files": [
        {
          "path": "snippets/nft-holder/nft-holder.quest.ts",
          "type": "registry:file",
          "target": "~/quests/nft-holder.quest.ts"
        },
        {
          "path": "snippets/nft-holder/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/nft-holder.md"
        }
      ]
    },
    {
      "name": "contract-state",
      "type": "registry:item",
      "title": "Contract state quest",
      "description": "Check that a view function on an EVM contract, such as stakedOf(address) or getVotes(address), returns at least a minimum for a participant's linked wallets, at verification time.",
      "categories": ["quests", "wallets"],
      "docs": "Requires wallet linking in your app and Relay with ctx.wallet.call(). Configure the contract and function with settings.contractCall(); publication refuses functions that are not view or pure or do not return one uint, int, bool or address, and chains the platform does not read. Needs the platform's dRPC key. For staking that mints a receipt token, use token-holder instead. Checks state at verification time only. See docs/snippets/contract-state.md.",
      "files": [
        {
          "path": "snippets/contract-state/contract-state.quest.ts",
          "type": "registry:file",
          "target": "~/quests/contract-state.quest.ts"
        },
        {
          "path": "snippets/contract-state/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/contract-state.md"
        }
      ]
    },
    {
      "name": "cosmos-staker",
      "type": "registry:item",
      "title": "Cosmos staker quest",
      "description": "Check that a participant's wallets linked on a Cosmos SDK chain delegate at least a minimum, to any validator or to a configured one, at verification time.",
      "categories": ["quests", "wallets"],
      "docs": "Requires Cosmos wallet linking in your app and Relay with ctx.wallet.delegations(). The chain must be one the platform lists for balance reads. Counts bonded native staking delegations only, not unbonding ones or liquid-staking tokens. Checks delegations at verification time only. See docs/snippets/cosmos-staker.md.",
      "files": [
        {
          "path": "snippets/cosmos-staker/cosmos-staker.quest.ts",
          "type": "registry:file",
          "target": "~/quests/cosmos-staker.quest.ts"
        },
        {
          "path": "snippets/cosmos-staker/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/cosmos-staker.md"
        }
      ]
    },
    {
      "name": "onchain-action",
      "type": "registry:item",
      "title": "On-chain action quest",
      "description": "Reward participants once per swap, mint, deposit, bridge transfer or vote: an event of your EVM contract that names one of their linked wallets, read from finalized blocks without an indexer.",
      "categories": ["quests", "wallets"],
      "docs": "Requires wallet linking in your app, Relay with ctx.wallet.events() and the platform's dRPC key. Configure the event with settings.contractEvent(): the contract and its Solidity event signature, with the participant in an indexed address argument; publication checks the chain and the contract. Reads at most 30 days back, up to the chain's finalized block. See docs/snippets/onchain-action.md.",
      "files": [
        {
          "path": "snippets/onchain-action/onchain-action.quest.ts",
          "type": "registry:file",
          "target": "~/quests/onchain-action.quest.ts"
        },
        {
          "path": "snippets/onchain-action/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/onchain-action.md"
        }
      ]
    },
    {
      "name": "solana-action",
      "type": "registry:item",
      "title": "Solana action quest",
      "description": "Reward participants once per transaction their linked Solana wallet signed that called your program, optionally receiving at least an amount of a token: a swap, mint, claim or deposit, read from finalized transactions without an indexer.",
      "categories": ["quests", "wallets"],
      "docs": "Requires wallet linking in your app, Relay with ctx.wallet.transactions() and the platform's Solana RPC. Configure the program with settings.solanaProgram(); publication checks it is an executable program. Counts only transactions the wallet signed, since the later of activation and the wallet's link, at most 30 days back. See docs/snippets/solana-action.md.",
      "files": [
        {
          "path": "snippets/solana-action/solana-action.quest.ts",
          "type": "registry:file",
          "target": "~/quests/solana-action.quest.ts"
        },
        {
          "path": "snippets/solana-action/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/solana-action.md"
        }
      ]
    },
    {
      "name": "qualified-referrals",
      "type": "registry:item",
      "title": "Qualified referrals",
      "description": "Qualify a referred friend after three verified actions counted by a lifetime quest, then reward the inviter and the invitee.",
      "categories": ["referrals", "quests", "counters"],
      "docs": "Add trackers/qualification-actions.ts to trackers, referrals/qualified-friends.ts to referrals, and its community export to pointLedgers in relay.json. Your backend ingests the verified actions. See docs/snippets/qualified-referrals.md.",
      "files": [
        {
          "path": "snippets/qualified-referrals/actions.ts",
          "type": "registry:file",
          "target": "~/trackers/qualification-actions.ts"
        },
        {
          "path": "snippets/qualified-referrals/qualification.quest.ts",
          "type": "registry:file",
          "target": "~/quests/qualified-participant.quest.ts"
        },
        {
          "path": "snippets/qualified-referrals/referrals.ts",
          "type": "registry:file",
          "target": "~/referrals/qualified-friends.ts"
        },
        {
          "path": "snippets/qualified-referrals/continuous-membership.quest.ts",
          "type": "registry:file",
          "target": "~/docs/snippets/qualified-referrals-continuous-membership.quest.ts"
        },
        {
          "path": "snippets/qualified-referrals/README.md",
          "type": "registry:file",
          "target": "~/docs/snippets/qualified-referrals.md"
        }
      ]
    }
  ]
}
