Sync your music library to a classic iPod from a modern Mac
Project description
clickwheel
Sync a music library to a classic iPod from a modern Mac — no iTunes required. Scan, clean up metadata, pick what goes on the iPod, and sync, all from the terminal. Optional MCP server lets Claude or other AI clients drive it conversationally.
Install
pipx install clickwheel
Optional extras:
pipx inject clickwheel 'clickwheel[mcp]' # MCP server for Claude / AI clients
clickwheel fix (metadata cleanup) runs entirely on the base install — no extras required.
Quick Start
Point clickwheel at your music:
mkdir -p ~/.clickwheel
cat > ~/.clickwheel/config.yaml << 'EOF'
music_dir: /path/to/your/music
EOF
Then index it and pick what goes on the iPod:
clickwheel scan # build the library index
clickwheel select # interactive checkbox picker
clickwheel sync # push to the iPod
Commands
The iPod workflow:
| Command | Description |
|---|---|
clickwheel scan |
Index your library; report metadata gaps |
clickwheel fix |
Fill in album art, years, genres; repair tags |
clickwheel select |
Interactive checkbox picker for the iPod |
clickwheel playlist |
List saved playlists or show one's tracks |
clickwheel edit |
Add/remove artists or set a description |
clickwheel heal |
Drop playlist refs to files no longer on disk |
clickwheel delete |
Delete a saved playlist |
clickwheel diff |
Preview what would change on the iPod |
clickwheel sync |
Push your playlist to the iPod |
clickwheel ls |
Show what's on the iPod |
clickwheel eject |
Safely unmount the iPod |
Each optional integration has its own doc:
- Plex / Plexamp — push/pull playlists between clickwheel and a Plex music library. See
docs/plex.md. - Apple Music — push/pull/delete playlists in your Apple Music account; syncs across Apple devices via iCloud Music Library. See
docs/applemusic.md. - Last.fm — submit iPod listens. See
docs/lastfm.md.
Configuration
# ~/.clickwheel/config.yaml
music_dir: /Volumes/Music/Library
ipod_capacity_gb: 64
auto_scan: true
Environment variables (MUSIC_DIR, AUTO_SCAN, etc.) override config values. See docs/configuration.md for the full schema and fix walkthrough. Integrations (Plex, Apple Music, Last.fm) are all off by default — opt in via the per-integration docs linked above.
MCP server
clickwheel ships an optional MCP server so Claude Code, Claude Desktop, and other MCP-aware clients can drive your library conversationally:
What's on my iPod, and how full is it?
Build me a 45-minute late-night indie folk playlist using only tracks I actually own.
Sync the 'ipod' playlist to my iPod and then eject it.
Quick start with Claude Code:
pipx inject clickwheel 'clickwheel[mcp]'
claude mcp add clickwheel clickwheel-mcp --scope user
The server exposes 37 tools across library, playlist, iPod, Plex, Apple Music, and Last.fm domains, plus a build_playlist prompt with anti-hallucination rules. Destructive operations (delete_playlist, sync_playlist_to_ipod) are gated by client confirmation.
For Claude Desktop config, the full tool reference, and other clients (Cursor, Continue, Cline, Zed), see docs/mcp/.
Requirements
- macOS (iPod sync depends on macOS disk utilities)
- Python 3.11+
- iPod Classic with stock firmware, connected via USB
- FLAC files are excluded from sync (stock firmware limitation)
Contributing
See CONTRIBUTING.md for dev setup, testing, and commit conventions.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file clickwheel-0.16.0.tar.gz.
File metadata
- Download URL: clickwheel-0.16.0.tar.gz
- Upload date:
- Size: 1.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf1e1bfab765c2fc883acff97e1b5126927812a26aec0dc6ff4cf4a6e20f77c5
|
|
| MD5 |
3eb19135dd6c0eed147ba999b0989f3b
|
|
| BLAKE2b-256 |
d3a2bd985f5407c29a21a4963b9822cb4a82f19808d44e6ef71288bf289b61b1
|
Provenance
The following attestation bundles were made for clickwheel-0.16.0.tar.gz:
Publisher:
publish.yml on pdugan20/clickwheel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
clickwheel-0.16.0.tar.gz -
Subject digest:
cf1e1bfab765c2fc883acff97e1b5126927812a26aec0dc6ff4cf4a6e20f77c5 - Sigstore transparency entry: 1673837626
- Sigstore integration time:
-
Permalink:
pdugan20/clickwheel@624d5c71433cbcaa4b52ad7e8bae2a0aeace3a35 -
Branch / Tag:
refs/tags/v0.16.0 - Owner: https://github.com/pdugan20
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@624d5c71433cbcaa4b52ad7e8bae2a0aeace3a35 -
Trigger Event:
push
-
Statement type:
File details
Details for the file clickwheel-0.16.0-py3-none-any.whl.
File metadata
- Download URL: clickwheel-0.16.0-py3-none-any.whl
- Upload date:
- Size: 1.1 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25e3911d1bba7fee6a5920885cd2905714db257e984b19733b6f1e46e5a857d7
|
|
| MD5 |
157354f6b2f6233ac9f6428952d43e74
|
|
| BLAKE2b-256 |
332f0ca1d488ef5ee532bee5b15013b1bb46aae466b35d0bacddbb05f978bfa6
|
Provenance
The following attestation bundles were made for clickwheel-0.16.0-py3-none-any.whl:
Publisher:
publish.yml on pdugan20/clickwheel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
clickwheel-0.16.0-py3-none-any.whl -
Subject digest:
25e3911d1bba7fee6a5920885cd2905714db257e984b19733b6f1e46e5a857d7 - Sigstore transparency entry: 1673837697
- Sigstore integration time:
-
Permalink:
pdugan20/clickwheel@624d5c71433cbcaa4b52ad7e8bae2a0aeace3a35 -
Branch / Tag:
refs/tags/v0.16.0 - Owner: https://github.com/pdugan20
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@624d5c71433cbcaa4b52ad7e8bae2a0aeace3a35 -
Trigger Event:
push
-
Statement type: