Agent skill

Debug Receivers

by timusus in timusus/Shuttle2

Drive the S2 debug build's playback and queue over ADB broadcasts — play the whole library, play/pause, skip, seek, remove a queue item, toggle shuffle/repeat, dump playback state as JSON, reimport…

Apache-2.0Auto-check passedMobile

Install Debug Receivers

skills CLI
$ npx skills add timusus/Shuttle2 --skill debug-receivers -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install timusus/Shuttle2 debug-receivers --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/timusus/Shuttle2.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/debug-receivers .claude/skills/debug-receivers && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
debug-receivers
GitHub stars
229
Token cost
~1.9k tokens
SKILL.md length
740 words
Files
1
Skills in repo
13
Repo updated
First seen
Licence
Apache-2.0

At a glance

Drive the S2 debug build's playback and queue over ADB broadcasts — play the whole library, play/pause, skip, seek, remove a queue item, toggle shuffle/repeat, dump playback state as JSON, reimport…

  • Checking playback on an emulator
  • SKILL.md covers Capturing the crossfade output, Typical check, Raw broadcast and Adding an action
  • Calls adb and python3
  • Device without tapping through the UI

What it does

Debug Receivers is an agent skill from timusus/Shuttle2. Drive the S2 debug build's playback and queue over ADB broadcasts — play the whole library, play/pause, skip, seek, remove a queue item, toggle shuffle/repeat, dump playback state as JSON, reimport the library, download or remove a song offline and dump the downloads. Use when checking playback on an emulator or device without tapping through the UI, or when you need the exact am broadcast syntax.

Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Mobile, covering Mobile testing and debugging. It works with Android. The repository describes itself as: Shuttle Music: a music player for Android and iOS. Plays local files and streams from Jellyfin, Emby, Plex and Navidrome/Subsonic, with Chromecast, Android Auto, EQ and replay… The licence is Apache-2.0.

When your agent uses it

  • Checking playback on an emulator
  • Device without tapping through the UI
  • You need the exact am broadcast syntax

Example prompts

  • “/debug-receivers”

Requirements

  • Python 3

What it can do on your machine

Read from SKILL.md and the folder at commit 9cef5dd. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • adb
    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Debug Receivers loads about 1.9k tokens when it runs. Until then it costs about 105 tokens; SKILL.md has 740 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~105
When it runs · the whole SKILL.md, loaded when a task matches
~1.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from timusus/Shuttle2 at commit 9cef5dd, republished under its Apache-2.0 licence (© timusus). 740 words, ~1,939 tokens.

Download SKILL.mdSave it as .claude/skills/debug-receivers/SKILL.md (or your agent's skills folder).
name
debug-receivers
description
Drive the S2 debug build's playback and queue over ADB broadcasts — play the whole library, play/pause, skip, seek, remove a queue item, toggle shuffle/repeat, dump playback state as JSON, reimport the library, download or remove a song offline and dump the downloads. Use when checking playback on an emulator or device without tapping through the UI, or when you need the exact `am broadcast` syntax.

Debug Broadcast Receivers

Debug-only receivers in android/app/src/debug/ (never in release). All are exported but guarded by android.permission.DUMP, which adb shell holds and third-party apps don't.

Use the wrapper, support/scripts/s2-debug.sh <ACTION> [am broadcast extras]. It sends the broadcast, waits for the receiver's reply on logcat tag S2Debug, prints it, and exits non-zero on an error or when no reply arrives within S2_DEBUG_TIMEOUT seconds (10). It honours ANDROID_SERIAL / ANDROID_ADB_SERVER_PORT, so on a WSL lane eval "$(support/scripts/remote-emu.sh env)" first. Broadcasts carry FLAG_INCLUDE_STOPPED_PACKAGES, so they also reach (and start) the app after am force-stop. If the WSL lane's tunnel drops mid-run ("device offline"/"device not found"), the wrapper reconnects it once via remote-emu.sh reconnect and retries once before failing.

ActionExtrasDoes
PLAY_ALL[--ei index N] [--es album NAME]Queue every library song (SongRepository, SongQuery.All()), or only album NAME's, and play from index N, via the PlaySongs use case the song list uses
PLAY / PAUSEPlaybackOperations.play() / pause()
NEXT / PREVskipToNext() / skipToPrev() (PREV restarts the track past 2 s, as the UI does)
SEEK--el ms 20000seekTo(ms)
REMOVE_QUEUE_ITEM--ei position NPlaybackOperations.removeQueueItem, the queue screen's "Remove from Queue" path. N indexes the queue in its displayed (shuffle-aware) order
REMOVE_PLAYLIST_SONG--es playlist NAME --es song TITLEPlaylistRepository.removeFromPlaylist, the playlist detail screen's per-row "Remove" path (the RemoveFromPlaylist use case)
REORDER_QUEUE--ei from N --ei to NQueueOperations.move(from, to), the queue screen's drag-to-reorder path. Both indices are in the displayed (shuffle-aware) order
TAP_START[--es name NAME]Start recording what CrossfadeMixer outputs (before the equalizer) to <externalFilesDir>/crossfade-tap/NAME.wav (default crossfade-tap); replies with the path. See below
TAP_STOPFinish the WAV; replies with path, format and duration
SHUFFLE[--ez enabled true|false]Toggle, or set, the shuffle mode
REPEAT[--es mode off|all|one]Toggle (Off → All → One), or set, the repeat mode
SPEED--ef multiplier 1.5PlaybackOperations.setPlaybackSpeed(multiplier)
SLEEP_TIMER--el seconds 3 [--ez play_to_end true|false]SleepTimer.startTimer, the same timer the Sleep Timer dialog starts
DUMP_STATEPrint the state as one JSON line (below)
DOWNLOAD_SONG[--el song_id N]DebugDownloadReceiver: download a song for offline use (default: the first remote song) from its current stream URI, keyed by song.path
REMOVE_DOWNLOAD[--el song_id N]Remove that song's download
DOWNLOAD_WIFI_ONLY--ez enabled true|falseSet the Wi-Fi-only download preference (default true); pushed to the DownloadManager's requirements
DUMP_DOWNLOADSOne JSON line: wifiOnly, cacheFiles/cacheBytes under filesDir/downloads, and downloads (path, state, progress, bytesDownloaded, contentLength)
IMPORTWrapper-only alias for DebugMediaImportReceiver: reimport the library from MediaStore. Fire-and-forget; give it a few seconds

Replies: <ACTION> ok[: detail] (e.g. PLAY_ALL ok: 5 songs from index 0, REMOVE_QUEUE_ITEM ok: <removed title>) or <ACTION> error: <reason>. An action not in the manifest's intent filter is never delivered, so the wrapper times out on typos.

DUMP_STATE fields: state (PlaybackOperations.playbackState()), reportedState (the playbackStateFlow value), positionMs (getProgress()), progressMs (progressFlow), durationMs, savedPositionMs (the persisted resume position), queuePosition, queueSize, title (current song), inLibrary (false for a file opened from another app that isn't in the library, playing as a transient song), queueTitles (every song name in the queue's displayed, shuffle-aware order -- queueTitles[queuePosition + 1] is the item that will auto-advance to next), shuffle, repeat, speed (getPlaybackSpeed()), pendingLoad (a track load in flight: the state is Loading).

json
{"state":"Playing","reportedState":"Playing","positionMs":3225,"progressMs":3153,"durationMs":60029,"savedPositionMs":3050,"queuePosition":0,"queueSize":5,"title":"Playback One","queueTitles":["Playback One","Playback Two","Playback Three","Playback Four","Playback Five"],"shuffle":"Off","repeat":"Off","speed":1.0,"pendingLoad":false}
Show full SKILL.md (228 more words)Show less

Capturing the crossfade output

TAP_START / TAP_STOP record the mixer's PCM (16/24-bit, the stream's rate) as a WAV, across song joins, so a fade or a gap can be checked from the file instead of by ear. Debug builds only: WavTapAudioProcessor is bound by CrossfadeTapDebugModule in src/debug; release binds none. Start before the join, stop after; pausing writes nothing. A stream in a different format from the first is left out and reported.

bash
support/scripts/s2-debug.sh TAP_START --es name join1      # prints the device path
support/scripts/s2-debug.sh PLAY_ALL
# ... let it cross a join ...
support/scripts/s2-debug.sh TAP_STOP
adb pull /sdcard/Android/data/com.simplecityapps.shuttle.dev/files/crossfade-tap/join1.wav build/

To have the capture judged for you: support/scripts/seed-test-media.sh crossfade seeds tone songs (a distinct frequency each, 16- and 24-bit albums), support/scripts/crossfade-analyse.py tap.wav --freqs 330,550,770 --crossfade-ms 3000 reports per-transition overlap, fade envelopes, gaps and clipping (exit 1 on a problem; its tests are python3 -I support/scripts/crossfade_analyse_test.py), and support/scripts/crossfade-check.sh [ms] does the whole seed, set, play, tap, pull, analyse run on the current lane.

Typical check

bash
support/scripts/remote-emu.sh start && eval "$(support/scripts/remote-emu.sh env)"
support/scripts/remote-emu.sh install
support/scripts/seed-test-media.sh playback --skip-onboarding   # 5 x 60 s tracks, library imported
support/scripts/s2-debug.sh PLAY_ALL
support/scripts/s2-debug.sh REMOVE_QUEUE_ITEM --ei position 0   # remove the playing item
support/scripts/s2-debug.sh DUMP_STATE                          # expect Playing, title "Playback Two"
support/scripts/remote-emu.sh stop

Parse the JSON with python3 -c 'import json,sys; ...' or jq. Ready-made checks built on this live in support/maestro/ (see its README).

Raw broadcast

bash
adb shell am broadcast -f 32 -p com.simplecityapps.shuttle.dev \
  -a com.simplecityapps.shuttle.debug.SEEK --el ms 20000
adb logcat -d -s S2Debug:I | tail -1

Adding an action

Add a branch to DebugPlaybackReceiver.handle() (return an optional detail string, throw with the reason on failure), add the <action> to the receiver's intent filter in android/app/src/debug/AndroidManifest.xml, and add a row above. Keep release code untouched: reach state through injected classes, not new public hooks.

Never pm clear a device you don't own; on a WSL lane, remote-emu.sh reset is the way to wipe the debug app.

© timusus, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/debug-receivers of timusus/Shuttle2.

Open the folder on GitHubat commit 9cef5dd

Compare with similar skills

Debug Receivers next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Debug Receivers compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Debug Receivers this skilltimusus/Shuttle2229—~1.9kAutomated safety check: PassApache-2.0
Phone HarnessShawnPana/phone-harness3.2k—~4.3kAutomated safety check: PassMIT
Mobile QAtloncorp/tlon-apps107—~2.4kAutomated safety check: PassMIT
Androidyang1ming/android-harness176—~259Automated safety check: PassMIT
Debug Bridgegetknit/knit131—~2.2kAutomated safety check: PassGPL-3.0
Capturing Screenshots And Screenrecordskydoves/android-testing-skills333—~3.7kAutomated safety check: PassApache-2.0

Similar skills

  • Phone Harness

    ShawnPana/phone-harness

    Control the user's phone — an iPhone through the Mac's iPhone Mirroring window, an Android over adb, or a rented cloud Android: open apps, tap, type, swipe, read the screen.

    3.2k GitHub stars~4.3k tokensUpdated 10 days ago
    MobileAuto-check passed
  • Mobile QA

    tloncorp/tlon-apps

    Run a mobile QA checklist on a physical Android device over adb for tlon-apps, then triage what fails into fixes.

    107 GitHub stars~2.4k tokensUpdated today
    MobileAuto-check passed
  • Android

    yang1ming/android-harness

    Direct Android device control through ADB. An agent skill from yang1ming/android-harness.

    176 GitHub stars~259 tokensUpdated 2 mo ago
    MobileAuto-check passed
  • Debug Bridge

    getknit/knit

    Drive and verify Knit on a device or emulator through the headless debug bridge (am broadcast to app.getknit.knit.debug.<ACTION, replies as JSON) — send a message on one phone and confirm it landed…

    131 GitHub stars~2.2k tokensUpdated 3 days ago
    MobileAuto-check passed
  • Capturing Screenshots And Screenrecord

    skydoves/android-testing-skills

    A skill your agent uses to capture visual artefacts from a device for test failures, golden image generation, QA repro, and demo videos.

    333 GitHub stars~3.7k tokensUpdated 4 mo ago
    MobileAuto-check passed
  • Android Emulator Skill

    Moustachauve/WLED-Android

    Production-ready scripts for Android app testing, building, and automation.

    169 GitHub starsUsed in 1 repo~911 tokens
    MobileAuto-check passed

More from timusus/Shuttle2

All 13 skills in this repo
  • Comprehensive guidance for writing deterministic tests for Android code using Kotlin coroutines.

    229 GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Deploy Android

    timusus/Shuttle2

    Deploy the Android app to the Play Store via GitHub Actions.

    229 GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Reply Reviews

    timusus/Shuttle2

    Weekly Play Store review flow for S2: fetch new reviews, draft replies, get owner approval, then post.

    229 GitHub stars~1k tokensUpdated today
    Auto-check passed
  • Check

    timusus/Shuttle2

    Run lint + unit tests, investigate and fix failures. An agent skill from timusus/Shuttle2.

    229 GitHub stars~449 tokensUpdated today
    Auto-check passed
  • Commit

    timusus/Shuttle2

    Analyse working tree changes, group them into logical atomic commits, and create well-structured conventional commits with module scopes.

    229 GitHub stars~1.9k tokensUpdated today
    Auto-check: notes
  • Delegate Verbose

    timusus/Shuttle2

    Run high-volume work in a subagent so its raw output never enters this conversation.

    229 GitHub stars~864 tokensUpdated today
    Auto-check passed

Works with

Categories

Questions about Debug Receivers

What does Debug Receivers do?

Drive the S2 debug build's playback and queue over ADB broadcasts — play the whole library, play/pause, skip, seek, remove a queue item, toggle shuffle/repeat, dump playback state as JSON, reimport…. Debug Receivers is an agent skill from timusus/Shuttle2. Drive the S2 debug build's playback and queue over ADB broadcasts — play the whole library, play/pause, skip, seek, remove a queue item, toggle shuffle/repeat, dump playback state as JSON, reimport the library, download or remove a song offline and dump the downloads.

When should I use Debug Receivers?

Debug Receivers fits situations like: checking playback on an emulator; device without tapping through the UI; you need the exact am broadcast syntax.

How do I install Debug Receivers in Claude Code?

Run `npx skills add timusus/Shuttle2 --skill debug-receivers -a claude-code`. Or copy the skill folder (.claude/skills/debug-receivers in timusus/Shuttle2) into .claude/skills/debug-receivers in your project. Claude Code loads it when a task matches its description.

How do I install Debug Receivers in Codex?

Run `npx skills add timusus/Shuttle2 --skill debug-receivers -a codex`. Or copy the skill folder (.claude/skills/debug-receivers in timusus/Shuttle2) into .agents/skills/debug-receivers in your project. Codex loads it when a task matches its description.

Can I use Debug Receivers in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add timusus/Shuttle2 --skill debug-receivers -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/debug-receivers, .gemini/skills/debug-receivers, .github/skills/debug-receivers and .opencode/skills/debug-receivers in your project.

What does Debug Receivers need to run?

Going by SKILL.md and its folder, Debug Receivers needs the command-line tools its instructions call (adb and python3). Our summary lists: Python 3.

Does Debug Receivers access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Debug Receivers safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Debug Receivers use?

Debug Receivers is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Debug Receivers use?

About 1.9k tokens (SKILL.md is roughly 7.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Debug Receivers?

Skills that share tags, products or a category with Debug Receivers: Phone Harness (ShawnPana/phone-harness, 3.2k stars), Mobile QA (tloncorp/tlon-apps, 107 stars), Android (yang1ming/android-harness, 176 stars) and Debug Bridge (getknit/knit, 131 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Debug Receivers?

timusus (a GitHub user) maintains it in timusus/Shuttle2, which has 229 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on October 7, 2026.

Source: timusus/Shuttle2 on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.