Skip to main content

Sync your music library to a classic iPod from a modern Mac

Project description

clickwheel

PyPI CI Python License: MIT

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[fix]'   # metadata cleanup via beets
pipx inject clickwheel 'clickwheel[mcp]'   # MCP server for Claude / AI clients

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 Clean up metadata via beets — art, genres, 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

clickwheel-0.15.0.tar.gz (1.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

clickwheel-0.15.0-py3-none-any.whl (1.1 MB view details)

Uploaded Python 3

File details

Details for the file clickwheel-0.15.0.tar.gz.

File metadata

  • Download URL: clickwheel-0.15.0.tar.gz
  • Upload date:
  • Size: 1.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for clickwheel-0.15.0.tar.gz
Algorithm Hash digest
SHA256 ea3657df3930b4707e2fb79fb06bdcfa375d4f8678833428b3f5f6ce4eb3eeff
MD5 eb65f081641f6e4061976c2f08e467cc
BLAKE2b-256 1d2ee0cd3485d55ed4fba01cef4d8c05bac9cd13ad3747c28ec3d32bccfa562b

See more details on using hashes here.

Provenance

The following attestation bundles were made for clickwheel-0.15.0.tar.gz:

Publisher: publish.yml on pdugan20/clickwheel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file clickwheel-0.15.0-py3-none-any.whl.

File metadata

  • Download URL: clickwheel-0.15.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.12

File hashes

Hashes for clickwheel-0.15.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3e07d39fea9026924c4d8e68afadbb08659830366b20114843144dd98914388f
MD5 8837b4165debaca000b98dab1146ee44
BLAKE2b-256 c4137b185cc586ad8498d2710b7dcea62d1647792fd7ee23d5b038da20c7126f

See more details on using hashes here.

Provenance

The following attestation bundles were made for clickwheel-0.15.0-py3-none-any.whl:

Publisher: publish.yml on pdugan20/clickwheel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page