Claude-skill-registry event-qr-generator

Use when generating branded QR codes for ProductTank SF events - speaker LinkedIn profiles, sponsor websites, or Slack join links. Handles single/bulk generation, correct logo mapping, GDrive upload, and mandatory test-scanning.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/event-qr-generator" ~/.claude/skills/majiayu000-claude-skill-registry-event-qr-generator && rm -rf "$T"
manifest: skills/data/event-qr-generator/SKILL.md
source content

Event QR Generator

Quick Reference

ParameterRequiredDescription
qrType
Yes
speaker
,
sponsor
, or
join-slack
url
ConditionalURL to encode (required if no linearTaskId)
linearTaskId
ConditionalExtract URLs from Linear task description
gDriveFolderId
NoUpload destination (asks user if missing)

Logo Mapping

qrTypeLogo SourceUse Case
speaker
Local:
linkedin-logo.png
Speaker LinkedIn profiles
sponsor
GDrive: Search for
sponsor-logo-{name}
Sponsor websites (use actual sponsor logo)
join-slack
Local:
slack-logo.png
Slack workspace invites

Path Reference

tools/linkedin-qr-generator/
├── assets/
│   ├── linkedin-logo.png      # speaker QRs
│   ├── product-tank-logo.png  # sponsor QRs
│   └── slack-logo.png         # join-slack QRs
├── output/                    # Generated QRs saved here
└── src/linkedin-qr-generator.js

Workflow

Step 1: Determine Generation Mode

Ask user:

  • Single: One URL provided directly
  • Bulk: Extract multiple URLs from Linear task

Step 2: Gather URLs

Single mode:

User provides: url, qrType, name (for filename)

Bulk mode (from Linear task):

# Use linear-cli to get task
linear-cli i get {linearTaskId} --output json

# Parse description for URLs matching qrType context

Step 3: Validate qrType-URL Match

STOP if mismatch detected:

  • speaker
    URL should be linkedin.com/in/
  • sponsor
    URL should be company website
  • join-slack
    URL should be slack.com or join link

Step 4: Get Logo for QR

For

speaker
and
join-slack
:
Use local assets

# speaker
LOGO_PATH="tools/linkedin-qr-generator/assets/linkedin-logo.png"

# join-slack
LOGO_PATH="tools/linkedin-qr-generator/assets/slack-logo.png"

For

sponsor
: Download from GDrive

# 1. Search GDrive for sponsor logo
mcp__gdrive__gdrive_search query: "sponsor-logo-{SponsorName}"

# 2. Download directly to file (streams to disk, no base64 in context)
mcp__gdrive__gdrive_download_file fileId: {fileId} destPath: "/tmp/sponsor-logo-{name}.png"

# 3. Set logo path
LOGO_PATH="/tmp/sponsor-logo-{name}.png"

Step 5: Generate QR Code(s)

# Use absolute paths for reliability
node /Users/wesleyfrederick/Documents/ObsidianVault/0_SoftwareDevelopment/cc-workflows/tools/linkedin-qr-generator/src/linkedin-qr-generator.js "<URL>" "<LOGO_PATH>"

Examples:

# speaker (LinkedIn logo for speaker profiles)
node tools/linkedin-qr-generator/src/linkedin-qr-generator.js "https://linkedin.com/in/johndoe" "tools/linkedin-qr-generator/assets/linkedin-logo.png"

# sponsor (actual sponsor logo from GDrive)
node tools/linkedin-qr-generator/src/linkedin-qr-generator.js "https://sponsor.com" "/tmp/sponsor-logo-WeFunder.png"

# join-slack (Slack logo for invite links)
node tools/linkedin-qr-generator/src/linkedin-qr-generator.js "https://slack.com/invite/xxx" "tools/linkedin-qr-generator/assets/slack-logo.png"

Output location:

tools/linkedin-qr-generator/output/qr-{timestamp}.png

Step 6: Rename Output

# Generated file: tools/linkedin-qr-generator/output/qr-{timestamp}.png
# Rename to: {qrType}-qr-{name}.png

mv "tools/linkedin-qr-generator/output/qr-*.png" "/tmp/{qrType}-qr-{name}.png"

Step 7: Upload to GDrive

# Use MCP tool
mcp__gdrive__gdrive_upload_file
  filePath: /tmp/{qrType}-qr-{name}.png
  fileName: {qrType}-qr-{name}.png
  folderId: {gDriveFolderId}  # Ask user if not provided

Step 8: Open for User Test-Scan

Open QR for user to verify after upload.

# Open QR for visual inspection
open "/tmp/{qrType}-qr-{name}.png"

Report to user:

  • GDrive link provided
  • QR opened for test-scanning
  • User can confirm QR works (non-blocking)

Verification Checklist

Before reporting completion:

  • Correct logo used for qrType
  • URL matches expected pattern for qrType
  • Uploaded to GDrive
  • GDrive link provided to user
  • QR opened for user test-scanning (non-blocking)

Rationalization Counters

"Tool always works, no need to test" → WRONG. Test EVERY generated QR. Silent failures happen.

"One spot check is enough for bulk" → WRONG. Test ALL QRs. Each URL could have issues.

"User provided the URL so it must be correct" → WRONG. Verify URL matches qrType. Users make mistakes.

"I'll test after uploading" → WRONG. Test BEFORE upload. Don't pollute GDrive with bad QRs.

Common Issues

SymptomCauseFix
QR scans to wrong URLWrong URL passedDouble-check URL before generation
Wrong logo in QRWrong asset pathVerify logo mapping table
Command failsNot in project root
cd
to cc-workflows first
Bulk URLs missedIncomplete Linear parsingRe-read task description carefully