brainstorming
Structured design dialogue that validates ideas before implementation begins.
documentation-asset-manager
Manages Tallyfy documentation assets on Cloudflare R2. Uploads images, generates AI captions using Claude Code native vision, maintains CSV inventory with build-time integration. Use when managing docs screenshots or media files.
Full skill instructions
Automates the complete workflow for Tallyfy documentation asset management with Claude Code native vision:
$GITHUB_ROOT/documentation/documentation_assets.csv✅ Completed:
Required Credentials (in parent directory):
$GITHUB_ROOT/cloudflare_credentials.json with fields:
account_id - Cloudflare account IDapi_token - Cloudflare API token with R2 accessRequired Packages (auto-check):
pip3 install pillow requests
Claude Code Native (Recommended):
image_captioner.py uses subprocess to call claude native# Check credentials exist
test -f $GITHUB_ROOT/cloudflare_credentials.json || echo "❌ Credentials missing"
# Check Anthropic API key
test -f ~/.anthropic/api_key || echo "⚠️ Set ANTHROPIC_API_KEY or create ~/.anthropic/api_key"
# Check Python packages
python3 -c "import anthropic, PIL, requests" 2>/dev/null || echo "⚠️ Run: pip3 install anthropic pillow requests"
Use the R2 uploader script to upload any file:
# Single file upload
python3 ~/.claude/skills/documentation-asset-manager/scripts/r2_uploader.py \
--file /path/to/screenshot.png \
--key "tallyfy/pro/desktop-light-new-feature.png" \
--credentials $GITHUB_ROOT/cloudflare_credentials.json
# Returns JSON with public URL:
# {
# "success": true,
# "url": "https://screenshots.tallyfy.com/tallyfy/pro/desktop-light-new-feature.png",
# "key": "tallyfy/pro/desktop-light-new-feature.png",
# "size": "125.4KB"
# }
Generate all three caption types using Claude Code native vision:
For Single Images:
# Generate captions using Claude Code native (no API key needed)
python3 ~/.claude/skills/documentation-asset-manager/scripts/image_captioner.py \
--url "https://screenshots.tallyfy.com/tallyfy/pro/desktop-light-new-feature.png" \
--output /tmp/captions.json
# Returns:
# {
# "captions": {
# "alt_text": "Task assignment interface showing user selection dropdown",
# "descriptive": "Tallyfy task assignment screen with dropdown menu...",
# "seo": "Tallyfy task assignment feature showing how to assign tasks..."
# }
# }
For Batch Operations (Recommended for >10 images):
# Use Task agents for parallel processing
# See "Batch Vision Captioning" section below
Add asset to master inventory CSV:
# Add to inventory
python3 ~/.claude/skills/documentation-asset-manager/scripts/asset_inventory.py \
--action add \
--r2-key "tallyfy/pro/desktop-light-new-feature.png" \
--url "https://screenshots.tallyfy.com/tallyfy/pro/desktop-light-new-feature.png" \
--captions /tmp/captions.json \
--article-ids "pro-tasks-assign,pro-getting-started"
For one-command complete workflow:
# Upload + Caption + Inventory in one go
python3 ~/.claude/skills/documentation-asset-manager/scripts/orchestrator.py \
--file /path/to/screenshot.png \
--key "tallyfy/pro/desktop-light-new-feature.png" \
--article-ids "pro-tasks-assign" \
--credentials $GITHUB_ROOT/cloudflare_credentials.json
# Complete output:
# ✅ Uploaded: https://screenshots.tallyfy.com/tallyfy/pro/desktop-light-new-feature.png
# ✅ Alt text: "Task assignment interface showing user selection dropdown"
# ✅ Added to inventory: $GITHUB_ROOT/documentation/documentation_assets.csv
Automatic Alt Text Injection:
The master CSV is integrated with Starlight documentation builds via a remark plugin:
Location: /support-docs/src/plugins/remark/inject-alt-text.ts
How It Works:
/documentation/documentation_assets.csvai_caption_alt as alt textLocal Development:
cd /support-docs
# CSV symlinked to ../documentation/documentation_assets.csv
npm run dev # Alt text injected automatically
CI/CD (Netlify):
# package.json prebuild script copies CSV
npm run prebuild # Copies CSV before build
npm run build # Alt text injected during build
Example:
<!-- Before build: -->

<!-- After build: -->

For Large-Scale Caption Regeneration:
When regenerating captions for many images (>10), use parallel Task agents for efficiency:
Process:
Example (287 images completed in ~60 minutes):
# See /temporary/asset-inventory/ for reference implementation:
# - prepare_images_for_vision.py (download + resize)
# - Task agents launched in parallel (6 batches of ~48 images)
# - consolidate_and_update.py (merge results → CSV)
Why Task Agents:
# User: "Upload this screenshot to docs"
# Skill detects image file path, generates reasonable R2 key from filename
# Executes: upload → generate captions → update inventory → return URL
# User: "Replace screenshot at /tallyfy/pro/desktop-light-tasks.png"
# Skill: uploads with same key (overwrites), regenerates captions, updates inventory
# User: "Upload all screenshots in /docs/images/"
# Skill: processes each file sequentially with delays to avoid rate limits
# User: "Generate caption for existing image at https://screenshots.tallyfy.com/..."
# Skill: skips upload, generates captions using Claude Code native, updates inventory
# All 287 native images now have vision-based captions (completed 2025-11)
# Location: /documentation/documentation_assets.csv (columns: ai_caption_alt, ai_caption_descriptive, ai_caption_seo)
# Build integration: Auto-injected during Starlight builds via remark plugin
Working Directory: $GITHUB_ROOT/temporary/asset-manager/
Files Created:
upload_result.json - R2 upload responsecaptions_alt.json - Alt text captioncaptions_descriptive.json - Descriptive captioncaptions_seo.json - SEO captionasset_metadata.json - Combined metadataprocessing.log - Processing logCleanup: Temporary files auto-cleaned after successful completion
Location: $GITHUB_ROOT/documentation/documentation_assets.csv
CSV Columns:
filename - Asset filenamer2_key - Full R2 bucket keyproduction_url - Public URL (screenshots.tallyfy.com)source_type - native|orphaned|external|missingfile_type - File extensionfile_size - Human-readable sizefile_size_bytes - Size in bytesurl_exists - Boolean (URL accessible)article_ids - Comma-separated article IDsarticle_count - Number of articles referencinglast_modified - R2 last modified timestampetag - R2 ETagai_caption_alt - Alt text captionai_caption_descriptive - Detailed captionai_caption_seo - SEO-optimized captionneeds_caption - yes|no (based on file type)Auto-Update: CSV automatically updated on any upload/delete/caption operation
ERROR: Credentials file not found
ACTION: Check $GITHUB_ROOT/cloudflare_credentials.json exists
PROMPT: "Cannot find Cloudflare credentials. Ensure file exists with:
- account_id
- api_token"
ERROR: R2 upload failed (API error)
ACTION: Retry once after 5s, then notify user
PROMPT: "Upload to R2 failed: {error_message}
Retrying once..."
ERROR: Claude API error (rate limit, network, etc)
ACTION: Complete upload, skip caption, mark for later
PROMPT: "File uploaded successfully to {url}
Caption generation failed: {error}
You can generate captions later with:
python3 scripts/image_captioner.py --url {url}"
ERROR: Anthropic API rate limit
ACTION: Wait 60s, retry once, then defer
PROMPT: "Rate limit reached. Waiting 60s before retry...
If persistent, use --skip-captions flag to upload without captions"
ERROR: CSV file in use (another process)
ACTION: Wait 2s, retry 3 times, then warn
PROMPT: "Inventory CSV busy. Retried 3 times. Upload succeeded but inventory not updated.
Run: python3 scripts/asset_inventory.py --sync to update manually"
# For quick uploads without AI captions
python3 scripts/orchestrator.py --file screenshot.png --skip-captions
# Regenerate all captions for specific asset
python3 scripts/image_captioner.py \
--url "https://screenshots.tallyfy.com/tallyfy/pro/desktop-light-tasks.png" \
--update-inventory
# Process all images in directory
for img in /docs/screenshots/*.png; do
python3 scripts/orchestrator.py --file "$img" --batch-mode
sleep 3 # Delay between uploads
done
# Check all URLs in inventory are accessible
python3 scripts/asset_inventory.py --verify-urls
# Get inventory statistics
python3 scripts/asset_inventory.py --stats
# Output:
# Total assets: 812
# Active (used in docs): 290
# Orphaned (not referenced): 499
# Missing (404s): 23
# Images with captions: 288
Bucket Name: screenshots
Account ID: ac9046789c9ad74c8704a143b442f918
Public Domain: screenshots.tallyfy.com
API Endpoint: https://api.cloudflare.com/client/v4/accounts/{account_id}/r2/buckets/screenshots/objects
CDN: Cloudflare global edge cache
Recommended R2 Key Patterns:
Structured (Preferred):
tallyfy/pro/desktop-light-{action}-{context}.png
tallyfy/pro/mobile-dark-{feature}.png
manufactory/{feature}-{version}.png
Legacy (Auto-generated):
file-{random_id}.png
Examples:
tallyfy/pro/desktop-light-assign-task.pngtallyfy/pro/desktop-light-sidebar-numerated.pngmanufactory-triggers-v2.png"Module not found" errors:
pip3 install pillow requests
"Credentials not found":
cat $GITHUB_ROOT/cloudflare_credentials.json
# Should show account_id and api_token
"Claude Code not available":
# Ensure Claude Code CLI is installed and accessible
which claude # Should return path to claude executable
For external API usage (legacy):
# Not recommended - use Claude Code native instead
export ANTHROPIC_API_KEY="your-api-key-here"
"R2 upload succeeds but URL 404":
"CSV inventory out of sync":
# Rebuild inventory from R2 + documentation
python3 scripts/asset_inventory.py --rebuild
references/r2_api_reference.md - Complete Cloudflare R2 API docsreferences/supported_formats.md - Supported file types and limitsreferences/examples.md - Usage examples and tutorials$GITHUB_ROOT/documentation/CLAUDE.md - Documentation repo guidelinesRegular Tasks:
Inventory Location:
$GITHUB_ROOT/documentation/documentation_assets.csv (version controlled)$GITHUB_ROOT/temporary/asset-inventory/asset_inventory_master.csv (generated master)Structured design dialogue that validates ideas before implementation begins.
Comprehensive design intelligence for web and mobile UI/UX across 10 technology stacks.
Comprehensive implementation plans for multi-step tasks, breaking down specs into bite-sized, testable steps.
Introduction to the obra skills system with mandatory skill invocation rules and best practices.
Execute a written implementation plan with critical review and task checkpoints.
Delegate independent tasks to specialized agents working concurrently with isolated context.
Isolated git worktrees with smart directory selection and safety verification.
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
Plan searchable and shareable content that drives traffic, builds authority, and generates leads.
README-first repository scanner that extracts commands and classifies reproduction candidates without executing them.
Brainstorm and prioritize marketing strategies tailored to your SaaS stage, budget, and goals.
Plan and optimize your website's page hierarchy, navigation, URL structure, and internal linking.
The world's fastest calendar for remote work
Capture, organize, and utilize your knowledge effortlessly.
Instant Summaries of Audio & Video Interviews with AnySummary
Transform PDFs into engaging mind maps.
Chat with any PDF instantly
Create an optimal daily plan using your voice
A productivity platform to centralize organizational knowledge and workflows with contextual AI assistance.
AskYourPDF Pricing Plans: Tailored to Your Needs