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=${ECHONEST_EMAIL}'
# YouTube
curl -s -X POST https://echone.st/add_song \
-d 'track_uri=youtube:dQw4w9WgXcQ&email=${ECHONEST_EMAIL}'
# SoundCloud
curl -s -X POST https://echone.st/add_song \
-d 'track_uri=soundcloud:123456&email=${ECHONEST_EMAIL}'
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=${ECHONEST_EMAIL}'
curl -s https://echone.st/api/jammit/
curl -s -X POST https://echone.st/blast_airhorn \
-d 'name=classic&email=${ECHONEST_EMAIL}'
# 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=${ECHONEST_EMAIL} from the protected cache should be used as the user identifier for API callstools
Use exact configured Reolink cameras through the local Home Hub for availability and power status, fresh stills, visual commentary, protected Dylan/Julia/household sharing, and reversible spotlight control. Supports trusted owner tasks and explicitly scoped proactive automations; not for Nest or Ring cameras, arbitrary recipients, recordings, account changes, or raw camera APIs.
data-ai
Privately manage Dylan and Julia's household plant inventory and care history by physical location, bed, and exact Flower Cam view. Use for confirmed plant onboarding from camera conversations, camera- or bed-filtered inventory, record corrections, individual or whole-bed care, and private filtered exports. Pair with reolink-camera when an owner asks about plants visible in Flower Cam images.
testing
Inspect and control the physically secured Reachy Mini at Crosstown through ClawBody. Use for requests to check Reachy, look around, express an emotion, play any official emotion or dance preset, speak proactively, mute or unmute its microphone, stop movement, or describe what its camera sees.
tools
Handle Reachy/iMessage handoffs, selective durable memory, forgetting, and diagnostics; automatic context comes from the gateway plugin.