Install
openclaw skills install stepace-experimentalGenerate AI music on your Android phone via the StepAce Experimental app. Use this skill whenever the user asks to generate, create, make, compose, or queue a song, track, beat, melody, or any piece of music — even if phrased casually like "make me a vibe", "create something chill", or "schedule a song for tonight". Handles both immediate generation and scheduled (future) generation, with optional BPM, key, duration, lyrics, and time signature control. Requires a StepAce Experimental pairing token (setup guide included).
openclaw skills install stepace-experimentalQueue or schedule AI-generated songs directly to your Android phone through the StepAce Experimental app.
Before using this skill, you need to connect it to your StepAce Experimental app:
"Set my StepAce token to
<paste token here>"
Your agent saves it as STEPACE_TOKEN. You only need to do this once — unless you regenerate your token in the app.
STEPACE_TOKENT2L_****IP0)STEPACE_TOKEN is not set when the user asks to generate music → walk them through setup before proceedingenqueue_generationQueues a song to generate right now on the phone. Use this by default.
schedule_generationQueues a song to generate at a specific future time. Use this when the user gives a time or date ("tonight at 2am", "schedule for tomorrow morning", etc.). Requires scheduledAt as a Unix timestamp in milliseconds.
Only caption is required. All others are optional — omit them entirely from the payload if not specified (do not send null or empty values).
| Parameter | Type | Notes |
|---|---|---|
caption | string | Required. Describe style, mood, genre, instruments. Be descriptive. |
lyrics | string | Song lyrics. Ignored if instrumental: true. |
instrumental | boolean | true = no vocals. If true, do NOT send lyrics. If user provides lyrics, set false. |
bpm | integer | Tempo, 20–300. Infer from genre if confident (e.g. techno → 132, lo-fi → 85). |
duration | integer | Length in seconds, 5–300. Defaults to ~30s if omitted. |
keyscale | string | Key and scale, e.g. "C minor", "F# major", "A dorian". |
timesignature | string | "4/4" or "3/4" only. |
vocal_language | string | BCP-47 tag for vocals. e.g. "en", "es", "pt", "fr", "ja", "ko". Only relevant when instrumental: false. Defaults to "en". |
instrumental: false, include lyricsinstrumental: true, omit lyricsinstrumental and lyrics (let the app decide)Endpoint: POST https://openclaw-bridge.torrico-villanueva-cesar-kadir.workers.dev/openclaw/queue
Header: Content-Type: application/json
Use curl from the shell as the default/preferred way to call the bridge.
Do not prefer Python urllib/generic HTTP clients when curl is available, because the bridge/CDN may treat those clients differently and reject them even when the same payload works via curl.
Preferred example using curl:
source /home/deploy/.stepace-env
curl -X POST \
'https://openclaw-bridge.torrico-villanueva-cesar-kadir.workers.dev/openclaw/queue' \
-H 'Content-Type: application/json' \
--data '{
"pairingToken": "'"$STEPACE_TOKEN"'",
"type": "enqueue_generation",
"payload": {
"requestJson": {
"caption": "cinematic synthwave with huge drums",
"instrumental": true,
"bpm": 120,
"duration": 30
}
}
}'
Equivalent JSON payload:
{
"pairingToken": "{STEPACE_TOKEN}",
"type": "enqueue_generation",
"payload": {
"requestJson": {
"caption": "cinematic synthwave with huge drums",
"instrumental": true,
"bpm": 120,
"duration": 30
}
}
}
Preferred example using curl:
source /home/deploy/.stepace-env
curl -X POST \
'https://openclaw-bridge.torrico-villanueva-cesar-kadir.workers.dev/openclaw/queue' \
-H 'Content-Type: application/json' \
--data '{
"pairingToken": "'"$STEPACE_TOKEN"'",
"type": "schedule_generation",
"payload": {
"requestJson": {
"caption": "dark techno with metallic percussion",
"instrumental": true
},
"scheduledAt": 1775120400000
}
}'
Equivalent JSON payload:
{
"pairingToken": "{STEPACE_TOKEN}",
"type": "schedule_generation",
"payload": {
"requestJson": {
"caption": "dark techno with metallic percussion",
"instrumental": true
},
"scheduledAt": 1775120400000
}
}
scheduledAt must be a Unix timestamp in milliseconds (13 digits). Convert from the user's stated time using their local timezone if known, otherwise ask.
{
"pairingToken": "{STEPACE_TOKEN}",
"type": "enqueue_generation",
"payload": {
"requestJson": {
"caption": "fast energetic electronic anthem with punchy drums",
"lyrics": "We light the night, we never slow, hearts on fire, we steal the show.",
"vocal_language": "en",
"instrumental": false,
"duration": 30,
"bpm": 160
}
}
}
{
"jobRef": "ref_abc123...",
"status": "queued",
"type": "enqueue_generation"
}
Reply to the user with a message like:
🎵 Song queued on StepAce Experimental!
Caption: <caption>
📅 Scheduled for: <human-readable time> ← only if scheduled
Settings: 160 BPM · C minor · 4/4 · 30s ← only mention fields that were set
Job ref: ref_abc123...
Your phone will notify you when it's done 🎶
| Error | What to do |
|---|---|
Missing / invalid pairingToken | Token may have expired. Ask user: StepAce Experimental app → Settings → OpenClaw Bridge → Connect to regenerate, then update the token. |
Missing caption | Ask the user to describe the music they want. |
Missing scheduledAt for schedule_generation | Ask the user for a specific date/time. |
| Network error | Tell the user the bridge couldn't be reached. Ask them to check their phone is online and the app has been opened at least once. |
enqueue_generation, instrumental: true, bpm: 130enqueue_generation, instrumental: false, vocal_language: "es"enqueue_generation, instrumental: true, bpm: 85, duration: 60schedule_generation, resolve scheduledAt from current time + user's timezonetimesignature: "3/4", keyscale: "A minor"vocal_language: "es", infer a relaxed captioninstrumental: true, keyscale: "D minor", duration: 45