Curate age-appropriate audio content for a child's Toniebox (Creative Tonies). Searches YouTube for nursery rhymes, stories, lullabies, and educational content matched to the child's age, downloads audio via yt-dlp, and uploads to Google Drive or alternative storage (Dropbox, OneDrive, S3, Syncthing, NAS, Nextcloud, local folder). Use when the user asks to find content for a Toniebox, update Tonie playlists, download kids audio, curate children's music, refresh Creative Tonie content, or build a monthly audio playlist for a toddler/child. Also triggers on "toniebox", "tonie", "creative tonie", "kids audio playlist", "nursery rhymes download", or "children's audio content".
Curate, download, and organize audio content for Toniebox Creative Tonies.
Verify before starting:
command -v yt-dlp # YouTube downloader
command -v ffmpeg # Audio conversion
command -v ffprobe # Duration detection
For Google Drive uploads, also need gog CLI. See references/storage-providers.md for alternatives.
Install missing tools:
# macOS
brew install yt-dlp ffmpeg
# Linux
pip install yt-dlp && sudo apt install ffmpeg
Collect from the user:
If the user has run this before, check for prior download directories to avoid re-downloading the same tracks.
Map the child's age to a content band. See references/age-bands.md for full detail.
| Age | Focus |
|---|---|
| 0-12mo | Lullabies, white noise, simple nursery rhymes, sensory music |
| 12-24mo | Action songs, animal sounds, nursery rhymes with movement, simple stories |
| 2-3yr | Longer stories, counting/alphabet songs, interactive songs |
| 3-5yr | Chapter stories, educational content, character stories |
| 5-7yr | Audiobook chapters, kids podcasts, world music |
Duration targets:
Search YouTube for age-appropriate individual tracks. Use web_search or direct YouTube search.
Search strategy:
references/age-bands.md)"{channel name}" {content type} for {age group} (e.g., "Super Simple Songs" lullaby)references/age-bands.mdPrioritize these channels:
Track selection criteria:
Build a track list with: title, YouTube URL, channel, estimated duration.
Use scripts/download.sh for each track.
Usage:
bash scripts/download.sh <youtube_url> <output_dir> <filename>
Example:
bash scripts/download.sh "https://youtube.com/watch?v=abc123" ./downloads/emma-2026-04 "Baby Shark"
# Creates: ./downloads/emma-2026-04/baby-shark.mp3
How it works:
--force to override.Batch process: Loop through the track list. Run downloads sequentially (not parallel) to avoid rate limiting. For each track:
bash scripts/download.sh "$url" "$output_dir" "$title"
Track failures and report at the end. Target 15-25 successful downloads per refresh.
After all downloads, verify the collection:
# Count files
ls -la "$output_dir"/*.mp3 | wc -l
# Total duration (requires ffprobe)
total=0
for f in "$output_dir"/*.mp3; do
d=$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 "$f" 2>/dev/null | cut -d. -f1)
total=$((total + ${d:-0}))
done
echo "Total: $((total / 60)) min $((total % 60)) sec"
Ensure total duration is under 90 minutes.
Run scripts/upload.sh to push files to the configured storage provider.
Default (local):
bash scripts/upload.sh ./downloads/child-2026-04 "ChildName" "2026-04 - Nursery Rhymes"
# Files copied to ~/toniebox-content/ChildName/2026-04 - Nursery Rhymes/
Google Drive:
export TONIEBOX_STORAGE=gdrive
export [email protected]
bash scripts/upload.sh ./downloads/child-2026-04 "ChildName" "2026-04 - Nursery Rhymes"
The folder structure at the destination:
Toniebox Content/
└── ChildName/
└── 2026-04 - Nursery Rhymes/
├── baby-shark.mp3
├── wheels-on-the-bus.mp3
└── ...
See references/storage-providers.md for all supported providers: local, gdrive, dropbox, onedrive, s3, syncthing, nas, nextcloud.
Present the user with a summary:
## Toniebox Content: {Child Name} — {Month} {Year}
**Theme:** {theme}
**Age band:** {age band}
**Tracks:** {count}
**Total duration:** {X} min {Y} sec (of 90 min max)
**Storage:** {provider} → {path/url}
### Track List
1. {Title} — {duration} ({channel})
2. {Title} — {duration} ({channel})
...
### Next Steps
1. Open mytonies app (iOS/Android) or my.tonies.com
2. Select the Creative Tonie to update
3. Upload the MP3 files from {storage location}
4. Place the Tonie on the Toniebox (Wi-Fi required) to sync
Set up a recurring cron job to prompt for a monthly refresh:
openclaw cron create \
--schedule "0 10 1 * *" \
--prompt "Time for a monthly Toniebox content refresh. Run the toniebox-curator workflow: ask for any changes to the child profile, research new content, download, and upload." \
--label "toniebox-monthly-refresh"
This runs on the 1st of each month at 10:00 AM. The agent receives the prompt and walks through the full workflow, asking the user for confirmation at each step.
Apply these rules when selecting content. Reject any track that fails:
download.sh. Override with --force only after manual review.references/age-bands.md), listen to or watch 30 seconds before downloading.