commit b32ebefb518e1897331940004c0757e1919bb30e Author: Zhongwei Li Date: Sat Nov 29 18:16:08 2025 +0800 Initial commit diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json new file mode 100644 index 0000000..28ddef2 --- /dev/null +++ b/.claude-plugin/plugin.json @@ -0,0 +1,12 @@ +{ + "name": "raffle-winner-picker", + "description": "Randomly selects winners from lists, spreadsheets, or Google Sheets for giveaways and contests with cryptographically secure randomness.", + "version": "0.0.0-2025.11.28", + "author": { + "name": "ComposioHQ", + "email": "tech@composio.dev" + }, + "skills": [ + "./" + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..fa77f3a --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# raffle-winner-picker + +Randomly selects winners from lists, spreadsheets, or Google Sheets for giveaways and contests with cryptographically secure randomness. diff --git a/SKILL.md b/SKILL.md new file mode 100644 index 0000000..bb25539 --- /dev/null +++ b/SKILL.md @@ -0,0 +1,159 @@ +--- +name: raffle-winner-picker +description: Picks random winners from lists, spreadsheets, or Google Sheets for giveaways, raffles, and contests. Ensures fair, unbiased selection with transparency. +--- + +# Raffle Winner Picker + +This skill randomly selects winners from lists, spreadsheets, or Google Sheets for giveaways and contests. + +## When to Use This Skill + +- Running social media giveaways +- Picking raffle winners at events +- Randomly selecting participants for surveys or tests +- Choosing winners from contest submissions +- Fair distribution of limited spots or resources +- Random team assignments + +## What This Skill Does + +1. **Random Selection**: Uses cryptographically random selection +2. **Multiple Sources**: Works with CSV, Excel, Google Sheets, or plain lists +3. **Multiple Winners**: Can pick one or multiple winners +4. **Duplicate Prevention**: Ensures the same person can't win twice +5. **Transparent Results**: Shows the selection process clearly +6. **Winner Details**: Displays all relevant information about winners + +## How to Use + +### From Google Sheets + +``` +Pick a random row from this Google Sheet to select a winner +for a giveaway: [Sheet URL] +``` + +### From Local File + +``` +Pick 3 random winners from entries.csv +``` + +### From List + +``` +Pick a random winner from this list: +- Alice (alice@email.com) +- Bob (bob@email.com) +- Carol (carol@email.com) +... +``` + +### Multiple Winners + +``` +Pick 5 random winners from contest-entries.xlsx, +make sure no duplicates +``` + +## Example + +**User**: "Pick a random row from this Google Sheet to select a winner for a giveaway." + +**Output**: +``` +Accessing Google Sheet... +Total entries found: 247 + +Randomly selecting winner... + +🎉 WINNER SELECTED! 🎉 + +Row #142 +Name: Sarah Johnson +Email: sarah.j@email.com +Entry Date: March 10, 2024 +Comment: "Love your newsletter!" + +Selection method: Cryptographically random +Timestamp: 2024-03-15 14:32:18 UTC + +Would you like to: +- Pick another winner (excluding Sarah)? +- Export winner details? +- Pick runner-ups? +``` + +**Inspired by:** Lenny's use case - picking a Sora 2 giveaway winner from his subscriber Slack community + +## Features + +### Fair Selection +- Uses secure random number generation +- No bias or patterns +- Transparent process +- Repeatable with seed (for verification) + +### Exclusions +``` +Pick a random winner excluding previous winners: +Alice, Bob, Carol +``` + +### Weighted Selection +``` +Pick a winner with weighted probability based on +the "entries" column (1 entry = 1 ticket) +``` + +### Runner-ups +``` +Pick 1 winner and 3 runner-ups from the list +``` + +## Example Workflows + +### Social Media Giveaway +1. Export entries from Google Form to Sheets +2. "Pick a random winner from [Sheet URL]" +3. Verify winner details +4. Announce publicly with timestamp + +### Event Raffle +1. Create CSV of attendee names and emails +2. "Pick 10 random winners from attendees.csv" +3. Export winner list +4. Email winners directly + +### Team Assignment +1. Have list of participants +2. "Randomly split this list into 4 equal teams" +3. Review assignments +4. Share team rosters + +## Tips + +- **Document the process**: Save the timestamp and method +- **Public announcement**: Share selection details for transparency +- **Check eligibility**: Verify winner meets contest rules +- **Have backups**: Pick runner-ups in case winner is ineligible +- **Export results**: Save winner list for records + +## Privacy & Fairness + +✓ Uses cryptographically secure randomness +✓ No manipulation possible +✓ Timestamp recorded for verification +✓ Can provide seed for third-party verification +✓ Respects data privacy + +## Common Use Cases + +- Newsletter subscriber giveaways +- Product launch raffles +- Conference ticket drawings +- Beta tester selection +- Focus group participant selection +- Random prize distribution at events + diff --git a/plugin.lock.json b/plugin.lock.json new file mode 100644 index 0000000..0a41ff6 --- /dev/null +++ b/plugin.lock.json @@ -0,0 +1,45 @@ +{ + "$schema": "internal://schemas/plugin.lock.v1.json", + "pluginId": "gh:ComposioHQ/awesome-claude-skills:raffle-winner-picker", + "normalized": { + "repo": null, + "ref": "refs/tags/v20251128.0", + "commit": "5515fa7e10a9970403a6d2c284aa03fc7faa5955", + "treeHash": "632bf0db25f614634940380379e54a71388c6d1c01fc2a5054e3f12e0ce6602c", + "generatedAt": "2025-11-28T10:10:08.204289Z", + "toolVersion": "publish_plugins.py@0.2.0" + }, + "origin": { + "remote": "git@github.com:zhongweili/42plugin-data.git", + "branch": "master", + "commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390", + "repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data" + }, + "manifest": { + "name": "raffle-winner-picker", + "description": "Randomly selects winners from lists, spreadsheets, or Google Sheets for giveaways and contests with cryptographically secure randomness.", + "version": null + }, + "content": { + "files": [ + { + "path": "README.md", + "sha256": "e85c6b1e7afbda6df66e254c9d03decce9899c3152aaa853e0e493e03af373b8" + }, + { + "path": "SKILL.md", + "sha256": "3ca742a080f4b257cfec431fa641006d270f7c53422a20d48465a38ccf75c5db" + }, + { + "path": ".claude-plugin/plugin.json", + "sha256": "518b67261341491c028e34e52ea54a4c6e5e5f986bbd922c056c01b3fc8ba3cc" + } + ], + "dirSha256": "632bf0db25f614634940380379e54a71388c6d1c01fc2a5054e3f12e0ce6602c" + }, + "security": { + "scannedAt": null, + "scannerVersion": null, + "flags": [] + } +} \ No newline at end of file