A scheduled Claude agent that curates Dance Dance Revolution music for Preston.
Every other day it:
- Reads local DDR/StepMania play data (song library + play counts / recent plays).
- Updates favorites.json with songs it infers Preston likes.
- Writes a fresh "remix" batch to
remix/YYYY-MM-DD.md— a mix of English and Asian songs, chosen from official DDR song catalogs online and from songs already installed locally.
No downloading of music. The agent only produces song lists. It never downloads audio, simfile packs with bundled audio, or any copyrighted media.
Open PowerShell as Administrator and run:
# 1. Get the code (install git first via `winget install Git.Git` if needed)
git clone https://github.com/pseay-imbue/ddr-picker.git C:\ddr-picker
cd C:\ddr-picker
# 2. Create the token file (outside the repo — never committed).
# Generate a token with `claude setup-token` on any machine where
# you're logged in to Claude Code, then:
mkdir "$env:USERPROFILE\.music-curator" -Force
notepad "$env:USERPROFILE\.music-curator\claude.env"
# ...and paste one line: CLAUDE_CODE_OAUTH_TOKEN=<your token>
# Optional extra line if your DDR install is somewhere unusual:
# DDR_DATA_DIR=C:\path\to\your\game
# 3. Install deps + register the schedule (Tue & Thu, 9:00 AM)
Set-ExecutionPolicy -Scope Process Bypass
.\setup.ps1
# 4. Do a first run right now to verify everything works
.\run-agent.ps1setup.ps1 installs Node.js (via winget) and Claude Code if missing, then
registers a Windows Scheduled Task named MusicCuratorAgent that runs
run-agent.ps1 every Tuesday and Thursday at 9:00 AM.
After the first run, check:
state\ddr-install.json— did it detect your DDR app correctly?remix\— today's batch (markdown + json)- your game's
Courses\Remix\folder — the in-game course logs\— full agent transcript if anything looks off
run-agent.ps1 loads the OAuth token from the env file, then runs Claude Code
headless (claude -p) with the instructions in prompts/curator.md.
Tool permissions are scoped by .claude/settings.json.
Results are committed to this repo locally (favorites.json, remix/); logs go
to logs/ (gitignored).
If the machine has WSL with mngr installed, you can instead schedule via mngr's cron support:
mngr schedule add --name music-curator --command create \
--args "--type headless_claude --project /path/to/music-curator --message-file prompts/curator.md --env-file ~/.music-curator/claude.env" \
--schedule "0 9 */2 * *" --provider localThe native Task Scheduler path above is the default because it assumes nothing is pre-installed.
Before each run, scripts/detect-ddr.ps1 scans for the
installed DDR app (ITGmania, StepMania 5, Project OutFox — or a DDR_DATA_DIR
override from the env file), records it in state/ddr-install.json, and
installs only the matching version-specific skill from
skills/templates/ into .claude/skills/ddr-integration/.
So the agent always works against the app that's actually installed.
The agent emits a structured remix/YYYY-MM-DD.json, and after each run
scripts/publish-course.js deterministically
generates a course file (Courses\Remix\Remix-YYYY-MM-DD.crs) in the game
directory, so the batch appears inside the game under Course mode. Only
songs verified to exist under the game's Songs\ folder go into the course;
discoveries not installed locally stay in the markdown list. Remixes (and their
in-game courses) older than 2 weeks are pruned automatically, so with the
Tue/Thu schedule there are always at most 4. If no app is detected, the run
still produces the markdown remix list and flags the gap.
The batch is published on two in-game surfaces:
- A course (
Courses\Remix\Remix-YYYY-MM-DD.crs) — visible in Course mode on StepMania 5 / Project OutFox. - A song-wheel pack (
Songs\Remix YYYY-MM-DD\) made of NTFS directory junctions to the installed song folders — no audio is copied, and it appears in the song wheel in every theme, including ITGmania's Simply Love (which has no Course mode).