wax is a Rust CLI for digging through public music discovery signals from Bandcamp, SoundCloud, and YouTube.
Give it a URL and it will detect the platform automatically:
- Bandcamp album URLs use collector overlap
- SoundCloud track URLs use public likers and nearby likes in each liker feed
- YouTube watch URLs with playlist context use public playlist overlap
wax keeps the same entrypoint across providers:
wax dig <url>Build and install the binary into Cargo's bin directory:
cargo install --path .To install from crates.io:
cargo install wax-digThat usually installs wax to ~/.cargo/bin/wax.
If ~/.cargo/bin is not on your PATH, add:
export PATH="$HOME/.cargo/bin:$PATH"For a local build without installing:
cargo build --releaseThe binary will be at target/release/wax.
Bandcamp:
wax dig https://artist.bandcamp.com/album/example-recordSoundCloud:
wax resolve https://soundcloud.com/chvrches/the-mother-we-share
wax dig https://soundcloud.com/chvrches/the-mother-we-shareYouTube:
export YOUTUBE_API_KEY=your-api-key
wax resolve https://www.youtube.com/watch?v=dQw4w9WgXcQ
wax dig 'https://music.youtube.com/watch?v=dQw4w9WgXcQ&list=PL123'Inspect the available commands:
wax --help
wax dig --help
wax resolve --helpTypical flow:
- Run
wax resolve <url>to confirm the seed metadata and platform detection. - Run
wax dig <url>to generate ranked recommendations. - Add output flags like
--jsonor--csvwhen you want to script against the results.
Runs the recommendation flow for a supported URL.
What it does:
- Bandcamp: resolves the seed album, collects public collectors, reads each public library, and ranks repeated overlap
- SoundCloud: resolves the seed track, fetches public likers, inspects each liker feed around the seed like event, and ranks repeated nearby co-likes
- YouTube: resolves the seed video, loads the playlist from the URL, and ranks nearby co-occurrence within that playlist
Examples:
wax dig https://artist.bandcamp.com/album/example-record
wax dig https://artist.bandcamp.com/album/example-record --max-collectors 50 --limit 20
wax dig https://soundcloud.com/chvrches/the-mother-we-share --max-collectors 25 --limit 10
wax dig 'https://www.youtube.com/watch?v=dQw4w9WgXcQ&list=PL123' --limit 10
wax dig https://soundcloud.com/chvrches/the-mother-we-share --exclude-artist --sort overlap
wax dig https://artist.bandcamp.com/album/example-record --jsonUseful flags:
--max-collectors <n>: maximum source nodes to sample during discovery--max-depth <n>: reserved crawl-depth flag, currently defaults to1--limit <n>: maximum recommendations to print--sample top|random: keep sources in discovery order or shuffle before truncating--min-overlap <n>: minimum overlap count required for a recommendation--exclude-artist: drop records by the same artist as the seed--exclude-label: drop records on the same label as the seed--tag <tag>: require matching tags on candidate records--sort score|overlap: sort recommendations by score or raw overlap
Provider notes:
- Bandcamp
diguses public collectors and their public libraries - SoundCloud
digcurrently supports track URLs - YouTube
digrequires a YouTube Data API key and a watch URL with playlist context - SoundCloud playlist URLs are not supported for
digyet - YouTube recommendations are based on public playlist overlap rather than user likes
--tagfiltering is most useful on Bandcamp; SoundCloud tags are currently limited to what the public API exposes--csvwrites only ranked result rows fordig
Resolves a supported URL and prints canonical seed metadata.
Examples:
wax resolve https://artist.bandcamp.com/album/example-record
wax resolve https://soundcloud.com/chvrches/the-mother-we-share
wax resolve https://www.youtube.com/watch?v=dQw4w9WgXcQLists public collectors discovered for a Bandcamp seed album.
wax collectors https://artist.bandcamp.com/album/example-record
wax collectors https://artist.bandcamp.com/album/example-record --max-collectors 100This command is Bandcamp-only.
Prints albums from a public Bandcamp fan page.
wax library https://bandcamp.com/fanname
wax library https://bandcamp.com/fanname --limit 50This command is Bandcamp-only.
Prints the cache directory, entry count, and cache size in bytes.
wax cache statsClears the local fetch cache.
wax cache clearThese flags are available across commands:
--config <path>: load settings from a TOML config file--cache-dir <path>: override the cache directory--json: print JSON output--csv: print CSV output where supported--user-agent <value>: override the HTTP user agent--youtube-api-key <value>: YouTube Data API key, alternatively setYOUTUBE_API_KEY--rate-limit-ms <n>: delay between requests in milliseconds--concurrency <n>: request concurrency setting--timeout-ms <n>: per-request timeout-v,--verbose: enable debug logging--quiet: only print errors
CLI precedence:
- command-line flags override config file values
- config file values override built-in defaults
By default, wax prints readable table output.
Use --json for structured output:
wax dig https://artist.bandcamp.com/album/example-record --json
wax resolve https://soundcloud.com/chvrches/the-mother-we-share --jsonUse --csv for CSV output:
wax dig https://artist.bandcamp.com/album/example-record --csv
wax collectors https://artist.bandcamp.com/album/example-record --csv
wax library https://bandcamp.com/fanname --csvCommand support:
resolve: table or JSONdig: table, JSON, or CSVcollectors: table, JSON, or CSVlibrary: table, JSON, or CSVcache: plain text
If both --json and --csv are passed, CSV wins for commands that support it.
Pass a TOML file with --config:
wax dig https://artist.bandcamp.com/album/example-record --config ./wax.tomlExample:
cache_dir = "/tmp/wax-cache"
request_delay_ms = 1000
concurrency = 4
timeout_ms = 10000
user_agent = "wax/0.1"
youtube_api_key = "your-api-key"
max_collectors = 75
max_depth = 1Currently wired settings:
cache_dirrequest_delay_msconcurrencytimeout_msuser_agentyoutube_api_key
Schema fields such as max_collectors and max_depth exist in the config type, but command execution still takes those values from CLI arguments and built-in defaults.
- Bandcamp album URLs for
resolve,collectors, anddig - Bandcamp fan URLs for
library - SoundCloud track URLs for
resolveanddig - SoundCloud playlist URLs for
resolve - YouTube watch URLs for
resolve - YouTube watch URLs with
v=andlist=fordig youtu.beshort URLs forresolve, and fordigwhen they also includelist=music.youtube.comwatch URLs forresolve, and fordigwhen they also includelist=
Unsupported today:
- SoundCloud
collectors - SoundCloud
library - SoundCloud playlist
dig - YouTube
collectors - YouTube
library
waxonly uses publicly visible Bandcamp, SoundCloud, and YouTube data- SoundCloud support currently focuses on track resolution and a prototype
digflow - YouTube support requires a YouTube Data API key and currently focuses on video resolution plus playlist-overlap
dig - private or unavailable public data is skipped when possible
- repeated runs are faster when the cache is warm
- some commands may return
no usable public data foundwhen a page is valid but the needed public signals are missing
Developer-facing notes live in HACKING.md.