Repository navigation
podkit 0.5.0
podkit v0.5.0
podkit 0.5.0 brings Docker daemon mode, a config migration system, smarter shell completions, a new --force-metadata flag, and more reliable iPod ejecting. Since we're still pre-v1, some of these are technically breaking (the config version field), but nothing should require you to change how you use podkit today.
Highlights
Daemon mode for Docker — podkit can now run as a long-running service that polls for iPod devices and auto-syncs them when plugged in. Perfect for NAS setups where you want hands-free syncing. Supports Apprise notifications (ntfy, Slack, Discord, Telegram) so you know when a sync completes. See the daemon mode guide.
Config migration system — Config files now have a version field, and podkit migrate walks you through upgrading when the format changes. Supports --dry-run to preview changes, automatic backups, and interactive migrations that can prompt for decisions. If you're running an older config, podkit will tell you exactly what to do. See the migration docs.
Shell completions for option values — Tab completion now goes beyond just subcommands and flags. Options like --quality, --type, --encoding, and --format complete their known values (e.g., max, high, medium, low). Even --device and --collection complete with names from your config file. Works in both zsh and bash — see the CLI reference.
--force-metadata flag — Rewrite metadata on all synced tracks without re-transcoding or re-transferring audio files. Useful when you've updated tags in your source library and want to push those changes to your iPod quickly.
Under the Hood
Eject reliability on macOS — If you've ever had macOS refuse to eject your iPod because Finder or Spotlight was holding a reference, this one's for you. podkit now uses diskutil eject (proper removable-media handling), flushes filesystem buffers first, and automatically retries up to 3 times when the device is busy. On Linux, busy errors from udisksctl are now surfaced properly so the retry logic can kick in.
Docker and daemon are now versioned packages — @podkit/docker and @podkit/daemon ship as proper versioned packages with changelogs, OCI image labels, and a /usr/local/share/podkit-versions.json manifest for inspecting component versions inside the container.
Quality of Life
- Docker image published as multi-arch (linux/amd64 + linux/arm64) to
ghcr.io/jvgomg/podkit - Daemon supports configurable poll intervals (
PODKIT_POLL_INTERVAL) and graceful shutdown - File-based health check at
/tmp/podkit-daemon-healthfor Docker healthcheck integration
Full auto-generated changelog
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
podkit@0.5.0
Minor Changes
-
6b90ef7Thanks @jvgomg! - Add config migration system withpodkit migratecommandConfig files now have a
versionfield. Running any command with an outdated config shows a clear error directing you to runpodkit migrate. The migrate command detects your config version, shows what will change, backs up your original file, and applies updates. Supports--dry-runto preview changes and interactive migrations that can prompt for decisions. Configs without a version field are treated as version 0 and can be migrated withpodkit migrate. -
0019607Thanks @jvgomg! - Add--force-metadataflag to rewrite metadata on all synced tracks without re-transcoding or re-transferring files -
4edaddeThanks @jvgomg! - Add tab completion for option values and dynamic config namesOptions like
--quality,--type,--encoding, and--formatnow offer their known values when pressing tab (e.g.max,high,medium,low). The--deviceand--collectionflags complete with names from your config file. Works in both zsh and bash.
Patch Changes
-
8dddd29Thanks @jvgomg! - Improve iPod eject reliability with automatic retry and filesystem sync- Use
diskutil ejectinstead ofdiskutil unmounton macOS for proper removable-media handling (unmounts + detaches the disk) - Flush filesystem buffers before ejecting to ensure all writes are persisted
- Automatically retry eject up to 3 times when the device is temporarily busy (common on macOS when Finder/Spotlight holds a reference)
- Show progress output during retry so you know what's happening
- On Linux, return busy errors from udisksctl immediately so the retry wrapper can handle them instead of silently falling through
- Use
-
Updated dependencies [
8dddd29,0019607]:- @podkit/core@0.5.0
@podkit/core@0.5.0
Minor Changes
0019607Thanks @jvgomg! - Add--force-metadataflag to rewrite metadata on all synced tracks without re-transcoding or re-transferring files
Patch Changes
8dddd29Thanks @jvgomg! - Improve iPod eject reliability with automatic retry and filesystem sync- Use
diskutil ejectinstead ofdiskutil unmounton macOS for proper removable-media handling (unmounts + detaches the disk) - Flush filesystem buffers before ejecting to ensure all writes are persisted
- Automatically retry eject up to 3 times when the device is temporarily busy (common on macOS when Finder/Spotlight holds a reference)
- Show progress output during retry so you know what's happening
- On Linux, return busy errors from udisksctl immediately so the retry wrapper can handle them instead of silently falling through
- Use
@podkit/daemon@0.2.0
Minor Changes
-
0aed896Thanks @jvgomg! - Initial release of@podkit/dockerand@podkit/daemonas versioned packages.@podkit/daemonis a long-running service that polls for iPod devices and automatically syncs them. It detects when an iPod is plugged in, mounts it, runs a full podkit sync, and ejects it — hands-free. Designed for always-on setups like NAS devices running Docker. Supports configurable poll intervals (PODKIT_POLL_INTERVAL) and Apprise notifications (PODKIT_APPRISE_URL). Handles graceful shutdown, waiting for any in-progress sync to complete before exiting.@podkit/dockeris the Docker distribution of podkit, published as a multi-arch image (linux/amd64, linux/arm64) toghcr.io/jvgomg/podkit. Bundles the CLI and daemon binaries in an Alpine-based image following LinuxServer.io conventions (PUID/PGID, /config volume). Supports two modes: CLI (default, runsyncon demand) and daemon (opt-in, auto-detect and sync iPods on plug-in). Component versions are inspectable via OCI image labels and/usr/local/share/podkit-versions.json.
@podkit/docker@0.2.0
Minor Changes
-
0aed896Thanks @jvgomg! - Initial release of@podkit/dockerand@podkit/daemonas versioned packages.@podkit/daemonis a long-running service that polls for iPod devices and automatically syncs them. It detects when an iPod is plugged in, mounts it, runs a full podkit sync, and ejects it — hands-free. Designed for always-on setups like NAS devices running Docker. Supports configurable poll intervals (PODKIT_POLL_INTERVAL) and Apprise notifications (PODKIT_APPRISE_URL). Handles graceful shutdown, waiting for any in-progress sync to complete before exiting.@podkit/dockeris the Docker distribution of podkit, published as a multi-arch image (linux/amd64, linux/arm64) toghcr.io/jvgomg/podkit. Bundles the CLI and daemon binaries in an Alpine-based image following LinuxServer.io conventions (PUID/PGID, /config volume). Supports two modes: CLI (default, runsyncon demand) and daemon (opt-in, auto-detect and sync iPods on plug-in). Component versions are inspectable via OCI image labels and/usr/local/share/podkit-versions.json.
Patch Changes
Changelog
Minor Changes
-
6b90ef7Thanks @jvgomg! - Add config migration system withpodkit migratecommandConfig files now have a
versionfield. Running any command with an outdated config shows a clear error directing you to runpodkit migrate. The migrate command detects your config version, shows what will change, backs up your original file, and applies updates. Supports--dry-runto preview changes and interactive migrations that can prompt for decisions. Configs without a version field are treated as version 0 and can be migrated withpodkit migrate. -
0019607Thanks @jvgomg! - Add--force-metadataflag to rewrite metadata on all synced tracks without re-transcoding or re-transferring files -
4edaddeThanks @jvgomg! - Add tab completion for option values and dynamic config namesOptions like
--quality,--type,--encoding, and--formatnow offer their known values when pressing tab (e.g.max,high,medium,low). The--deviceand--collectionflags complete with names from your config file. Works in both zsh and bash.
Patch Changes
-
8dddd29Thanks @jvgomg! - Improve iPod eject reliability with automatic retry and filesystem sync- Use
diskutil ejectinstead ofdiskutil unmounton macOS for proper removable-media handling (unmounts + detaches the disk) - Flush filesystem buffers before ejecting to ensure all writes are persisted
- Automatically retry eject up to 3 times when the device is temporarily busy (common on macOS when Finder/Spotlight holds a reference)
- Show progress output during retry so you know what's happening
- On Linux, return busy errors from udisksctl immediately so the retry wrapper can handle them instead of silently falling through
- Use
-
Updated dependencies [
8dddd29,0019607]:- @podkit/core@0.5.0
Checksums (SHA256)
813099baf75a705f07ffe7420ed26523b5c9a0131b4fe9e5b7611dfe03f191e5 podkit-daemon-linux-arm64.tar.gz
491d3c38962959d712e51cac0b63b17a5aa5cdf6a580d10f1b079ef18c573aa6 podkit-daemon-linux-x64.tar.gz
8cb06d23db10d8a725f64de6d1b361695e6082f7950912871aa1ae77c6955957 podkit-darwin-arm64.tar.gz
821885d3226f67c5fdf8bf0521e9084f342ba434c6833581f98b056993045c6b podkit-darwin-x64.tar.gz
c44c855374698ff2a10826dcfb26dc99ef9ec6fb96c68635a8801fb7cd3f6f73 podkit-linux-arm64.tar.gz
b1d517aabff0476eb22a55fc83e10c033aca150bcf9663a0ec3c62b20cfe3f81 podkit-linux-x64.tar.gz