Anti-echo-chamber music discovery, independent of any streaming service's recommender.
Streaming recommenders optimise for one thing: that you keep listening. So they
converge on your comfort zone — more of the same. crate-digger does the
opposite. It's not a trained model; it's three simple ideas:
-
A rotating exploration axis. Each weekday pushes the search in a deliberately different direction, so it can never collapse into a single lane:
Day Axis Mon An under-the-radar artist a couple of hops from your taste Tue A genre/tag you probably don't listen to Wed A different country / scene (rotate the world) Thu A different era / decade Fri An independent or recent release (indie labels, Bandcamp) Sat A deep cut from an artist you already like Sun Wildcard: a pick from a respected human curator -
Human curation, not engagement algorithms. It leans on editorial sources (Bandcamp Daily, KEXP, NPR Music, Gilles Peterson…) and open data (MusicBrainz, ListenBrainz) — never a platform's recommender.
-
Memory. It logs everything it has suggested (
history.tsv) so it never repeats and keeps exploring further out.
The result: one song of the day, with why it was picked and YouTube/Bandcamp links (no Spotify dependency). Perfect for a morning briefing, a cron job, or a Telegram nudge.
Honest framing: this is a prompt + rotation + memory pattern, not a novel ML algorithm. That's the point — it's transparent, provider-agnostic, and yours to tweak.
Zero third-party dependencies — just Python 3.9+ (3.11+ to use a TOML config).
git clone https://github.com/YOURNAME/crate-digger && cd crate-digger
cp config.example.toml config.toml # edit it# Pick today's track
CRATEDIG_API_KEY=sk-... python3 cratedig.py --config config.toml
# See exactly what it would send the LLM (no API call, no key needed)
python3 cratedig.py --dry-run
# Preview any weekday's axis (0=Mon .. 6=Sun)
python3 cratedig.py --dry-run --day 2
# Deliver to Telegram too
TELEGRAM_BOT_TOKEN=... TELEGRAM_CHAT_ID=... python3 cratedig.py --telegramTwo backends cover almost everything (set in config or env):
provider = "anthropic"— Claude.provider = "openai"— OpenAI and any OpenAI-compatible endpoint: just pointbase_urlat DeepSeek, OpenRouter, Groq, or a local Ollama (http://localhost:11434/v1).
Environment variables (or a TOML file, see config.example.toml):
| Var | Meaning |
|---|---|
CRATEDIG_PROVIDER |
openai (default) or anthropic |
CRATEDIG_MODEL |
model id |
CRATEDIG_BASE_URL |
for openai-compatible endpoints |
CRATEDIG_API_KEY |
LLM key |
CRATEDIG_TASTE |
your taste seed (the starting point, not the destination) |
CRATEDIG_LANG |
output language (default es) |
CRATEDIG_HISTORY |
path to the dedup log |
- Optional web-search grounding (DuckDuckGo, no key) for fresher editorial picks.
- ListenBrainz/Last.fm integration: seed from your real listening history and a similar-artist graph — still no Spotify.