Skip to content

podkit 0.5.0

Choose a tag to compare

@github-actions github-actions released this 19 Mar 18:19
· 878 commits to main since this release
b16ee0d

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-health for 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

  • 6b90ef7 Thanks @jvgomg! - Add config migration system with podkit migrate command

    Config files now have a version field. Running any command with an outdated config shows a clear error directing you to run podkit migrate. The migrate command detects your config version, shows what will change, backs up your original file, and applies updates. Supports --dry-run to preview changes and interactive migrations that can prompt for decisions. Configs without a version field are treated as version 0 and can be migrated with podkit migrate.

  • 0019607 Thanks @jvgomg! - Add --force-metadata flag to rewrite metadata on all synced tracks without re-transcoding or re-transferring files

  • 4edadde Thanks @jvgomg! - Add tab completion for option values and dynamic config names

    Options like --quality, --type, --encoding, and --format now offer their known values when pressing tab (e.g. max, high, medium, low). The --device and --collection flags complete with names from your config file. Works in both zsh and bash.

Patch Changes

  • 8dddd29 Thanks @jvgomg! - Improve iPod eject reliability with automatic retry and filesystem sync

    • Use diskutil eject instead of diskutil unmount on 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
  • Updated dependencies [8dddd29, 0019607]:

    • @podkit/core@0.5.0

@podkit/core@0.5.0

Minor Changes

  • 0019607 Thanks @jvgomg! - Add --force-metadata flag to rewrite metadata on all synced tracks without re-transcoding or re-transferring files

Patch Changes

  • 8dddd29 Thanks @jvgomg! - Improve iPod eject reliability with automatic retry and filesystem sync
    • Use diskutil eject instead of diskutil unmount on 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

@podkit/daemon@0.2.0

Minor Changes

  • 0aed896 Thanks @jvgomg! - Initial release of @podkit/docker and @podkit/daemon as versioned packages.

    @podkit/daemon is 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/docker is the Docker distribution of podkit, published as a multi-arch image (linux/amd64, linux/arm64) to ghcr.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, run sync on 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

  • 0aed896 Thanks @jvgomg! - Initial release of @podkit/docker and @podkit/daemon as versioned packages.

    @podkit/daemon is 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/docker is the Docker distribution of podkit, published as a multi-arch image (linux/amd64, linux/arm64) to ghcr.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, run sync on 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

  • 6b90ef7 Thanks @jvgomg! - Add config migration system with podkit migrate command

    Config files now have a version field. Running any command with an outdated config shows a clear error directing you to run podkit migrate. The migrate command detects your config version, shows what will change, backs up your original file, and applies updates. Supports --dry-run to preview changes and interactive migrations that can prompt for decisions. Configs without a version field are treated as version 0 and can be migrated with podkit migrate.

  • 0019607 Thanks @jvgomg! - Add --force-metadata flag to rewrite metadata on all synced tracks without re-transcoding or re-transferring files

  • 4edadde Thanks @jvgomg! - Add tab completion for option values and dynamic config names

    Options like --quality, --type, --encoding, and --format now offer their known values when pressing tab (e.g. max, high, medium, low). The --device and --collection flags complete with names from your config file. Works in both zsh and bash.

Patch Changes

  • 8dddd29 Thanks @jvgomg! - Improve iPod eject reliability with automatic retry and filesystem sync

    • Use diskutil eject instead of diskutil unmount on 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
  • 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