Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Uploads promo videos and content to Cloudflare R2 or AWS S3. Use when the user wants to host promo content for social media or distribution.
.claude/skills/bitwize-music-studio-cloud-uploader/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 123% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 85% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 120% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 150% | 0% |
Upload promo videos and other album content to cloud storage (Cloudflare R2 or AWS S3).
After generating promo videos with /bitwize-music:promo-director, upload them to cloud storage for:
Generate → Master → Promo Videos → **[Cloud Upload]** → ReleaseOptional step after promo-director, before release-director.
Cloud credentials must be configured in ~/.bitwize-music/config.yaml:
yamlcloud: enabled: true provider: "r2" # or "s3" # For Cloudflare R2 r2: account_id: "your-account-id" access_key_id: "your-access-key" secret_access_key: "your-secret-key" bucket: "promo-videos" # For AWS S3 s3: region: "us-west-2" access_key_id: "your-access-key" secret_access_key: "your-secret-key" bucket: "promo-videos"
See ${CLAUDE_PLUGIN_ROOT}/reference/cloud/setup-guide.md for detailed setup instructions.
/bitwize-music:promo-director first){audio_root}/artists/{artist}/albums/{genre}/{album}/promo_videos/{audio_root}/artists/{artist}/albums/{genre}/{album}/album_sampler.mp4bash# If using the shared venv (recommended) ~/.bitwize-music/venv/bin/pip install -r ${CLAUDE_PLUGIN_ROOT}/requirements.txt # Or install separately pip install boto3
The upload script uses ~/.bitwize-music/venv if available, otherwise falls back to system Python.
Check config:
bashcat ~/.bitwize-music/config.yaml | grep -A 20 "cloud:"
Verify:
cloud.enabled: trueCheck promo videos exist:
bashls {audio_root}/artists/{artist}/albums/{genre}/{album}/promo_videos/ ls {audio_root}/artists/{artist}/albums/{genre}/{album}/album_sampler.mp4
If missing:
Error: Promo videos not found.
Generate with: /bitwize-music:promo-director {album}Call get_python_command() first to get the venv Python path and plugin root. Use these for all bash invocations below.
PYTHON="{python from get_python_command}"
PLUGIN_DIR="{plugin_root from get_python_command}"Preview first:
bash$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} --dry-run
Output shows:
Upload all (promos + sampler):
bash$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album}
Upload only track promos:
bash$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} --type promos
Upload only album sampler:
bash$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} --type sampler
Upload with public access:
bash$PYTHON "$PLUGIN_DIR/tools/cloud/upload_to_cloud.py" {album} --public
For R2:
{artist}/{album}/For S3:
aws s3 ls s3://{bucket}/{artist}/{album}/## Cloud Upload Complete
**Provider:** R2 (or S3)
**Bucket:** {bucket}
**Album:** {album}
**Uploaded Files:**
- {artist}/{album}/promos/01-track_promo.mp4
- {artist}/{album}/promos/02-track_promo.mp4
- ...
- {artist}/{album}/promos/album_sampler.mp4
**Total:** 11 files, 125.4 MB
**Next Steps:**
1. Verify files in cloud dashboard
2. If public: Test URLs work
3. Continue to release: /bitwize-music:release-director {album}IMPORTANT: Cloud paths are FLAT - no genre folder.
The cloud path structure is different from the local content structure:
| Location | Path Structure | |----------|----------------| | Local content | {content_root}/artists/{artist}/albums/{genre}/{album}/ | | Local audio | {audio_root}/artists/{artist}/albums/{genre}/{album}/ | | Cloud | {artist}/{album}/ (no genre!) |
Files are organized in the bucket as:
{bucket}/
└── {artist}/
└── {album}/
└── promos/
├── 01-track_promo.mp4
├── 02-track_promo.mp4
├── ...
└── album_sampler.mp4Example for album "my-album" by "bitwize" in rock genre:
~/music/artists/bitwize/albums/rock/my-album/bitwize/my-album/promos/ (NOT bitwize/albums/rock/my-album/)| Option | Description | |--------|-------------| | --type promos | Upload only track promo videos | | --type sampler | Upload only album sampler | | --type all | Upload both (default) | | --dry-run | Preview without uploading | | --public | Set files as public-read | | --audio-root PATH | Override audio_root from config |
Basic upload:
/bitwize-music:cloud-uploader my-albumPreview only:
/bitwize-music:cloud-uploader my-album --dry-runUpload promos only:
/bitwize-music:cloud-uploader my-album --type promosUpload with public access:
/bitwize-music:cloud-uploader my-album --public"Cloud uploads not enabled"
cloud.enabled: true to config${CLAUDE_PLUGIN_ROOT}/reference/cloud/setup-guide.md"Credentials not configured"
"Album not found"
{audio_root}/artists/{artist}/albums/{genre}/{album}/"No files found to upload"
/bitwize-music:promo-director {album}"Access Denied"
"Bucket not found"
--public flag only for files intended for public accesspromo-director:
After promo generation:
Promo videos generated successfully.
**Optional:** Upload to cloud storage: /bitwize-music:cloud-uploader {album}release-director:
After cloud upload:
Cloud upload complete.
Ready for release workflow: /bitwize-music:release-director {album}${CLAUDE_PLUGIN_ROOT}/reference/cloud/setup-guide.md - Detailed setup instructions${CLAUDE_PLUGIN_ROOT}/skills/promo-director/SKILL.md - Generate promo videos${CLAUDE_PLUGIN_ROOT}/skills/release-director/SKILL.md - Release workflowSonnet 4.5 - This skill runs scripts and coordinates workflow. No creative output from LLM.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 7,728 | 5,341 | -31% | 1 | 1 | 0% | 1,321 | 2,940 | +123% | 0 | 0 | — |
case-01 | fail→fail | 8,085 | 3,405 | -58% | 1 | 1 | 0% | 1,612 | 2,588 | +61% | 0 | 0 | — |
case-02 | fail→fail | 5,857 | 5,177 | -12% | 1 | 1 | 0% | 1,132 | 2,675 | +136% | 0 | 0 | — |
case-03 | fail→fail | 6,439 | 3,210 | -50% | 1 | 1 | 0% | 1,255 | 2,603 | +107% | 0 | 0 | — |
case-04 | pass→pass | 10,409 | 3,762 | -64% | 1 | 1 | 0% | 1,621 | 3,102 | +91% | 0 | 0 | — |
case-06 | pass→pass | 7,384 | 2,700 | -63% | 1 | 1 | 0% | 1,264 | 2,835 | +124% | 0 | 0 | — |
case-07 | fail→pass | 8,191 | 2,053 | -75% | 1 | 1 | 0% | 1,398 | 2,698 | +93% | 0 | 0 | — |
case-08 | fail→pass | 24,180 | 1,465 | -94% | 1 | 1 | 0% | 1,390 | 2,574 | +85% | 0 | 0 | — |
case-09 | fail→pass | 7,698 | 2,237 | -71% | 1 | 1 | 0% | 1,257 | 2,763 | +120% | 0 | 0 | — |
case-10 | pass→pass | 5,960 | 1,994 | -67% | 1 | 1 | 0% | 876 | 2,616 | +199% | 0 | 0 | — |
case-11 | fail→pass | 6,819 | 2,466 | -64% | 1 | 1 | 0% | 1,091 | 2,730 | +150% | 0 | 0 | — |
case-12 | fail→pass | 9,054 | 2,030 | -78% | 1 | 1 | 0% | 1,407 | 2,678 | +90% | 0 | 0 | — |
case-13 | pass→pass | 6,246 | 2,843 | -54% | 1 | 1 | 0% | 1,092 | 2,823 | +159% | 0 | 0 | — |
case-14 | pass→pass | 3,417 | 2,869 | -16% | 1 | 1 | 0% | 623 | 2,927 | +370% | 0 | 0 | — |
case-15 | fail→pass | 7,818 | 2,426 | -69% | 1 | 1 | 0% | 1,415 | 2,789 | +97% | 0 | 0 | — |
case-16 | pass→pass | 5,314 | 2,184 | -59% | 1 | 1 | 0% | 994 | 2,659 | +168% | 0 | 0 | — |
case-17 | fail→pass | 2,895 | 2,332 | -19% | 1 | 1 | 0% | 369 | 2,634 | +614% | 0 | 0 | — |
case-18 | pass→pass | 6,761 | 1,825 | -73% | 1 | 1 | 0% | 1,105 | 2,635 | +138% | 0 | 0 | — |
case-19 | fail→fail | 9,777 | 5,527 | -43% | 1 | 1 | 0% | 1,882 | 2,760 | +47% | 0 | 0 | — |
case-20 | fail→fail | 11,208 | 5,038 | -55% | 1 | 1 | 0% | 2,151 | 2,761 | +28% | 0 | 0 | — |
case-21 | fail→fail | 17,234 | 4,817 | -72% | 1 | 1 | 0% | 3,310 | 2,654 | -20% | 0 | 0 | — |
case-22 | fail→pass | 2,388 | 3,174 | +33% | 1 | 1 | 0% | 357 | 2,911 | +715% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 15 counted toward the lift figure. The other 7 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 15 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.