openclaw/skills/echonest/SKILL.md
Control the EchoNest collaborative music queue and manage the EchoNest server. Use when asked about music, queue, now playing, adding songs, searching for music, skipping songs, deploying EchoNest, checking server health, or viewing logs.
npx skillsauth add Dbochman/dotfiles echonestInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
EchoNest is a collaborative music queue at https://echone.st. Control the queue via REST API and manage the server via SSH.
All queue endpoints are public (no auth needed for reads and basic writes).
curl -s https://echone.st/playing/
curl -s https://echone.st/queue/
curl -s https://echone.st/queue/<track_id>
curl -s 'https://echone.st/search/v2?q=bohemian+rhapsody'
# Spotify
curl -s -X POST https://echone.st/add_song \
-d 'track_uri=spotify:track:4u7EnebtmKWzUH433cf5Qv&[email protected]'
# YouTube
curl -s -X POST https://echone.st/add_song \
-d 'track_uri=youtube:dQw4w9WgXcQ&[email protected]'
# SoundCloud
curl -s -X POST https://echone.st/add_song \
-d 'track_uri=soundcloud:123456&[email protected]'
The track_uri format is <source>:<id>. Get the ID from search results.
curl -s -X POST https://echone.st/jam \
-d 'id=<track_id>&[email protected]'
curl -s https://echone.st/api/jammit/
curl -s -X POST https://echone.st/blast_airhorn \
-d 'name=classic&[email protected]'
# Last 10 plays
curl -s https://echone.st/history/10
# User history
curl -s https://echone.st/user_history/<userid>
curl -s 'https://echone.st/youtube/lookup?id=<video_id>'
curl -s 'https://echone.st/youtube/playlist?id=<playlist_id>'
curl -s https://echone.st/health
These endpoints require Bearer token authentication. The token is stored in 1Password at op://OpenClaw/EchoNest API Token/password.
curl -s -X POST https://echone.st/api/queue/skip \
-H "Authorization: Bearer $ECHONEST_API_TOKEN"
curl -s -X POST https://echone.st/api/queue/remove \
-H "Authorization: Bearer $ECHONEST_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id": "<track_id>"}'
# Upvote
curl -s -X POST https://echone.st/api/queue/vote \
-H "Authorization: Bearer $ECHONEST_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id": "<track_id>", "up": true}'
# Downvote
curl -s -X POST https://echone.st/api/queue/vote \
-H "Authorization: Bearer $ECHONEST_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id": "<track_id>", "up": false}'
curl -s -X POST https://echone.st/api/queue/pause \
-H "Authorization: Bearer $ECHONEST_API_TOKEN"
curl -s -X POST https://echone.st/api/queue/resume \
-H "Authorization: Bearer $ECHONEST_API_TOKEN"
curl -s -X POST https://echone.st/api/queue/clear \
-H "Authorization: Bearer $ECHONEST_API_TOKEN"
Note: All management endpoints return {"ok": true} on success or {"error": "message"} on failure.
These endpoints allow playback transfer and device control via Spotify Connect.
curl -s https://echone.st/api/spotify/devices \
-H "Authorization: Bearer $ECHONEST_API_TOKEN"
Returns list of available Spotify Connect devices with their IDs and names.
curl -s -X POST https://echone.st/api/spotify/transfer \
-H "Authorization: Bearer $ECHONEST_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"device_id": "<device_id>", "play": true}'
Transfers playback to the specified device. Set "play": true to resume playback, "play": false to transfer but keep paused.
curl -s https://echone.st/api/spotify/status \
-H "Authorization: Bearer $ECHONEST_API_TOKEN"
Returns info about what's currently playing and which device it's on.
Enhanced endpoints with full metadata including vote counts, jam counts, comments, duration, and score.
curl -s https://echone.st/api/queue \
-H "Authorization: Bearer $ECHONEST_API_TOKEN"
Returns {"queue": [...], "now": "<ISO timestamp>"}. Each track includes: id, title, artist, trackid, src, user, img, big_img, duration, vote, jam, comments, score, auto.
curl -s https://echone.st/api/playing \
-H "Authorization: Bearer $ECHONEST_API_TOKEN"
Returns: id, title, artist, trackid, src, user, img, big_img, duration, vote, jam, comments, starttime, endtime, paused, pos, type, now (server timestamp for clock sync).
curl -N https://echone.st/api/events \
-H "Authorization: Bearer $ECHONEST_API_TOKEN"
Server-Sent Events stream for real-time updates. Keepalive comments every 15 seconds. Use Ctrl+C to disconnect.
Event types:
queue_update — Full queue array (same shape as /api/queue)now_playing — Now-playing object (same shape as /api/playing)player_position — {"src": "...", "trackid": "...", "pos": N}volume — {"volume": N}SSH to the EchoNest DigitalOcean droplet via the echonest-droplet host.
ssh echonest-droplet 'docker compose -f /opt/andre/docker-compose.yaml ps'
# Recent logs
ssh echonest-droplet 'docker compose -f /opt/andre/docker-compose.yaml logs --tail=50 andre'
# Follow logs (use timeout to avoid hanging)
ssh echonest-droplet 'timeout 10 docker compose -f /opt/andre/docker-compose.yaml logs -f --tail=20 andre'
# Redis logs
ssh echonest-droplet 'docker compose -f /opt/andre/docker-compose.yaml logs --tail=20 redis'
# Player worker logs
ssh echonest-droplet 'docker compose -f /opt/andre/docker-compose.yaml logs --tail=20 player'
# Restart all
ssh echonest-droplet 'cd /opt/andre && docker compose restart'
# Restart specific service
ssh echonest-droplet 'cd /opt/andre && docker compose restart andre'
ssh echonest-droplet 'cd /opt/andre && docker compose restart player'
ssh echonest-droplet 'cd /opt/andre && docker compose restart redis'
# 1. Sync code from local repo to server
rsync -avz --exclude='.git' --exclude='__pycache__' --exclude='*.pyc' \
--exclude='.env' --exclude='local_config.yaml' --exclude='.cache' \
~/repos/andre/ echonest-droplet:/opt/andre/
# 2. Rebuild and restart
ssh echonest-droplet 'cd /opt/andre && docker compose up -d --build'
# 3. Verify
ssh echonest-droplet 'docker compose -f /opt/andre/docker-compose.yaml ps'
curl -s https://echone.st/health
Note: Always confirm with Dylan before deploying.
# Check Redis memory usage
ssh echonest-droplet 'docker exec andre_redis redis-cli -a \$REDIS_PASSWORD INFO memory 2>/dev/null | grep used_memory_human'
# Trigger Redis backup
ssh echonest-droplet 'docker exec andre_redis redis-cli -a \$REDIS_PASSWORD BGSAVE 2>/dev/null'
# Count Redis keys
ssh echonest-droplet 'docker exec andre_redis redis-cli -a \$REDIS_PASSWORD DBSIZE 2>/dev/null'
ssh echonest-droplet 'df -h / && echo --- && free -m && echo --- && docker stats --no-stream'
echonest-droplet (configured in ~/.ssh/config, uses deploy key)100.92.192.62 (backup SSH access, bypasses fail2ban)[email protected] should be used as the user identifier for API callsdevelopment
Search the web for current information, news, facts, and answers. Use when asked questions about current events, needing to look something up, finding websites, researching topics, or when you need up-to-date information beyond your training data.
development
Summarize any URL, YouTube video, podcast, PDF, or file into concise text. Use when asked to read an article, summarize a link, get the gist of a video or podcast, extract content from a URL, or when you need to understand what a web page or document contains.
development
Play music via Spotify and control Google Home speakers. Use when asked to play music, songs, artists, playlists, podcasts, or control speakers/volume/audio.
testing
Create new OpenClaw skills, modify and improve existing skills, and measure skill performance with evals. Use when users want to create a skill from scratch, update or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy. Also use when asked to "make a skill", "turn this into a skill", "improve this skill", or "test this skill".