Highlights: Long Spotify cooldowns are honored without premature retries, playlists keep repeated tracks, and locale-prefixed Spotify URLs are accepted while malformed URIs are rejected.
- Honor long Spotify cooldowns without premature retries, retain valid tokens on throttling, and keep cookie-token requests from changing shared HTTP clients
- Preserve repeated tracks and their positions when listing Connect playlists while keeping library listings deduplicated
- Preserve literal CLI arguments and pass playback URIs to AppleScript as data; accept locale-prefixed and embedded Spotify URLs
- Compatibility: reject malformed Spotify URIs, missing identifiers, and unrelated URLs instead of silently truncating or misidentifying them
- Let Windows config updates finish after concurrent readers close, including when replacement reports access denied
- Correct command, output, cookie-cache, and automation documentation to match the CLI, including working playlist pipelines and release asset names
- Refresh the SQLite runtime dependency and preferred Go toolchain to 1.27.1 while retaining Go 1.26.7 support; validate macOS, Windows, the Go floor, race coverage, and docs in CI
- Follow, unfollow, and check playlist membership from the terminal with
playlist follow|unfollow|following; verified against a synthetic Spotify server, not a live account, thanks @yashiels
- Refresh Go crypto, system, synchronization, module, analysis, and formatting dependencies while retaining Go 1.26.7 support
- Make the listening-history output test independent of the host timezone and verify local-date rollover, thanks @yashiels
- Add optional, local Spotify OAuth PKCE login for the existing Web API commands while keeping browser cookies as the default; unverified against a live Spotify app, thanks @VACInc
- Preserve cookie authentication failures before remote OAuth fallbacks, and retain local Spotify.app playback recovery
- Keep concurrent cookie and OAuth commands from overwriting newer profile settings or clearing tokens before their config update succeeds
- Refresh the indirect SQLite profiling dependency
- Restore Web API and Connect-fallback search results by decoding Spotify's plural result containers, thanks @VACInc
- Refresh Go dependencies, including Kong, SweetCookie, SQLite, crypto, and formatting tools, and select Go 1.26.8 while retaining Go 1.26.7 support
- Refresh GitHub Actions and CI tool pins, and build documentation with Node.js 26
- Show the album in
spogo statushuman output, omitting it when it only repeats the track name
- Populate artists, release dates, owners, publishers, show names, durations, track/episode counts, and follower counts across Spotify catalog results
- Render readable follower counts and listening timestamps while omitting unknown metadata, empty separators, false zero counts, and trailing device whitespace
- List real library playlists immediately and fetch followed artists through Spotify's internal web-player API instead of rate-limited public endpoints
- Preserve Spotify retry-after cooldown hints across failed engine fallbacks and document commands that still require the public Web API
- Share the configured default HTTP timeout across Spotify Connect clients
- Fall back to the local Spotify.app for playback status and controls on macOS after both remote auto engines fail
- Honor the configured request timeout when opening Spotify Connect dealer WebSocket connections
- Strip every heading anchor safely when generating documentation tables of contents
- Restrict CI workflow permissions to read-only repository contents
- Cache Spotify Connect GraphQL operation hashes on disk, so catalog commands answer in seconds instead of re-downloading the web-player bundle on every run
- Return the entity you actually asked for from
artist info,album info,show info, andepisode info - Show real titles, artists, albums, and durations for every
queue showentry
- Persist Spotify Connect GraphQL operation hashes by web-player build and resolve missing bundle chunks concurrently
- Resolve artist, album, show, and episode metadata from the requested Spotify entity instead of unrelated nested content
- Populate queue tracks from Spotify Connect metadata and concurrently hydrate incomplete entries without using the public Web API
- Redact Spotify access tokens from Connect dealer WebSocket handshake errors
- Bound the cookie-token HTTP client so
--timeoutapplies to token fetches and a stalled endpoint cannot hang the process, thanks @SebTardif
- Make release and Homebrew-installed binaries report their actual tagged version
- Stamp the CLI version from the GoReleaser tag while retaining a
devfallback for every unstamped build - Remove stale hardcoded
0.10.1version labels from the CLI and specification
- Upgrade the unified release caller to
openclaw/release-workflows@v1.0.0-alpha.13, including exact verified asset names and SHA-256 digests in the Homebrew handoff
- Ship the first spogo release through the unified signed pipeline, using the OpenClaw Foundation Developer ID and Apple notarization for every macOS binary
- Replace the tag-triggered release workflow with a thin, manually dispatched caller pinned to
openclaw/release-workflows@v1.0.0-alpha.12 - Bind published release notes byte-for-byte to this dated changelog section and verify immutable artifacts before publication
- Hand verified release metadata to the Homebrew tap updater after publication
- Add native shell completion generation for Bash, Zsh, and Fish
- Make missing browser authentication fail with the documented exit code for reliable automation
- Surface Spotify rate-limit cooldown hints so callers can back off without guessing
- Add Bash, Zsh, and Fish shell completions and show supported shells in command help (
#32, thanks @kk-spartans) - Return exit code
3when browser cookies are unavailable instead of collapsing authentication failures into a generic command error - Surface Spotify
Retry-Afterhints in API errors with bounded seconds and HTTP-date parsing (#41, thanks @clawSean)
- Build CI and release artifacts with Go 1.25.12 so upstream standard-library security fixes are included
- Refresh direct and transitive Go dependencies, including Kong, go-toml, x/crypto, x/sys, and modernc.org/libc
- Refresh GitHub Actions and pinned dead-code, linting, and formatting tools
- Define product direction, compatibility guarantees, security boundaries, and change policy in
VISION.md - Update source-install requirements and command documentation for the refreshed CLI and Go toolchain
- Add user top tracks and retained listening history commands (
#29, thanks @hibachipapi) - Fix Firefox cookie imports when browser expiry values cannot be serialized (
#31, thanks @meoyawn)
- Improve Connect playback latency by caching web auth, client tokens, and the active command route between invocations (
#25, thanks @kk-spartans) - Fix warm Connect commands from cached active routes by persisting the registered spogo sender device.
- Fix Connect device volumes so
device listand status output report0-100percentages instead of Spotify's raw volume scale.
- Fix Connect Pathfinder track metadata extraction for explicit ratings, nested durations, and playability (
#26, thanks @theDimZone) - Add generated
llms.txtdocs index for agent-friendly documentation discovery - Update release automation/docs for the OpenClaw repository move
- Add
auth paste, wire--no-input, and improve cookie diagnostics/cleanup (#5, thanks @im-zayan) - Add
play --shuffle, Connect library/playlist support, and context-aware Connect play payloads (#15, thanks @StandardGage) - Fix Connect track artist extraction for nested artist containers and minimal artist fragments (
#7, thanks @joelbdavies) - Fix silent
auth importfailures by retrying Spotify auth cookie lookup across related hosts and surfacing browser warnings (#13) - Fix
device setwhen Connect state has no origin device by falling back to Web API transfer (#8) - Fix Connect liked-track listing via
fetchLibraryTrackswith Web API fallback on payload drift (#16, thanks @masonc15) - Fix Connect play when no device is active by falling back to Web API playback (
#21, thanks @prashanthbala) - Fix Connect volume changes by sending the volume endpoint as
PUT(#24, thanks @cavit99) - Fix sparse status/search metadata so track artists and albums are populated consistently across engines.
- Fix Connect
--deviceplayback when no device is active without falling back to rate-limited Web API playback. - Fix
auth paste --no-inputby accepting the documented flag order. - Fix playlist add/remove 429s by using Connect playlist mutations with writable-playlist checks and fallback coverage across engines (
#20). - Release prep: bump CLI/spec version to
0.3.0
- Add
applescriptengine for direct Spotify.app control on macOS (thanks @adam91holt) - CI: bump golangci-lint-action to support golangci-lint v2
- Kong-powered CLI with global flags, config profiles, and env overrides
- Auth commands: cookie status/import/clear with browser/profile selection
- Cookie-based auth via steipete/sweetcookie (file cache + browser sources)
- Search tracks/albums/artists/playlists/shows/episodes
- Item info for track/album/artist/playlist/show/episode
- Playback control: play/pause/next/prev/seek/volume/shuffle/repeat/status
- Artist play (top tracks; falls back to search)
- Queue add/show
- Library list/add/remove for tracks/albums; follow/unfollow artists; playlists list
- Playlist management: create/add/remove/track list
- Device list and transfer/set
- Engines: connect (internal), web (Web API), auto (connect → web fallback)
- Rate-limit fallback on 429s where supported
- Output: human color +
--plain+--json(NO_COLOR/TERM aware) - GitHub Actions CI, linting, formatting, and coverage gate