Installation
# Binary download
curl -fsSL https://raw.githubusercontent.com/xdagiz/xytz/main/install.sh | bash
# Homebrew (Cask)
brew tap xdagiz/homebrew-tap
brew install --cask xytz
# Scoop
scoop bucket add xdagiz https://github.com/xdagiz/scoop-bucket.git
scoop install xdagiz/xytz
# Or via Go
go install github.com/xdagiz/xytz@latest
# Arch Linux (AUR)
paru -S xytz # source build
paru -S xytz-bin # prebuilt binaryChangelog
New Features
- 5ccc013: feat(cli): composable search flags (@xdagiz)
- 3ab3eae: feat(queue): skip items, cap retries (@xdagiz)
- fb96afb: feat(spotify): album download (@xdagiz)
- b124675: feat: auto update (@xdagiz)
- d8b0144: feat: friendly yt-dlp error cards (@xdagiz)
- d2415bb: feat: fuzzy history picker on ctrl+r (@xdagiz)
- 334770a: feat: lyrics via .lrc file (@xdagiz)
Bug fixes
- c350fbf: fix(cmd): clearer failure reporting (@xdagiz)
- 42b5072: fix(downloader): drain pipes safely (@xdagiz)
- bc250ee: fix(install): verify checksums (@xdagiz)
- b4c8d81: fix(player): replace running player (@xdagiz)
- 7a5ff5e: fix(process): group-based teardown (@xdagiz)
- 477695a: fix(progress): anchored percent parsing (@xdagiz)
- 8c0cdf8: fix(queue): ignore post-cancel results (@xdagiz)
- 122eb67: fix(search): skip channel results (@xdagiz)
- ec507d4: fix(spotify): guard Begin race (@xdagiz)
- 4debe3d: fix(spotify): own up to tag failures (@xdagiz)
- b9e5454: fix(spotify): safe stem cleanup (@xdagiz)
- ec533f3: fix(store): atomic writes, strict load (@xdagiz)
- c8de765: fix(store): quarantine corrupt files (@xdagiz)
- 9f1e733: fix(thumbnail): env setup at startup (@xdagiz)
- 5bc005f: fix(tui): back-nav and input polish (@xdagiz)
- 1ec530c: fix(tui): correct back navigation (@xdagiz)
- 9a50361: fix(tui): correlate progress via op id (@xdagiz)
- 7307f3c: fix(tui): origin routing, skip guard (@xdagiz)
- 0fd4b69: fix(tui): queue leak, playurl origin (@xdagiz)
- 2dd78b2: fix(tui): spotify done goes home (@xdagiz)
- 4457ab7: fix(ui): rune-safe truncation (@xdagiz)
- d8842dc: fix(ui): truthful help and hints (@xdagiz)
- ea04b01: fix(ytdlp): cancel via per-run context (@xdagiz)
- c75acbd: fix(ytdlp): nil msg on cancel (@xdagiz)
- f42a18f: fix(ytdlp): raw error precedence (@xdagiz)
- a398fd4: fix(ytdlp): reset stale cancel flag (@xdagiz)
- bfd42fb: fix(ytdlp): robust binary probing (@xdagiz)
- 7f9411a: fix(ytdlp): skip live via live_status (@xdagiz)
- 7d48f73: fix(ytdlp): stop silent truncation (@xdagiz)
- 9added5: fix: fetch and cli routing gaps (@xdagiz)
- 3c3dcd4: fix: surface yt-dlp stderr on failure (@xdagiz)
- f5f2d1d: fix: use env based protocol detection (@xdagiz)
- 7316948: fix: use formatOrigin for back nav (@xdagiz)
Other work
- 9981f34: perf(ytdlp): single playlist fetch (@xdagiz)
- 151217d: refactor(search): spec-driven commands (@xdagiz)
- 34ac3e8: refactor(tui): typed cancel flag (@xdagiz)
- eeb5c7a: refactor(ytdlp): one search runner (@xdagiz)
- b390d99: refactor(ytdlp): one video fetcher (@xdagiz)
- c9ba50c: refactor: blocking Run for downloads (@xdagiz)
- e4985a3: refactor: drop var-func seams (@xdagiz)
- 0f13d86: refactor: extract URL classification (@xdagiz)
- 19003f3: refactor: extract keypress dispatch (@xdagiz)
- f690c9e: refactor: extract tui update handlers (@xdagiz)
- 5ee74de: refactor: extract update.go helpers (@xdagiz)
- b15e971: refactor: move msgs to models (@xdagiz)
- 1bfb56b: refactor: move resume/later out to root (@xdagiz)
- 9227ef4: refactor: move tea cmds out of player (@xdagiz)
- ebe77f8: refactor: move tea cmds out of spotify (@xdagiz)
- cdd512c: refactor: move tea cmds out of ytdlp (@xdagiz)
- 9f69c7c: refactor: move theme out of tui (@xdagiz)
- b29355b: refactor: selection into videolist (@xdagiz)
- 9a38e93: refactor: spotify flow through Run core (@xdagiz)
- 4174b76: refactor: typed cancel sentinel (@xdagiz)
- ae12fbf: refactor: typed search result payloads (@xdagiz)
- fec268b: refactor: videolist changes (@xdagiz)
- 75c793a: setup mise (@xdagiz)
- b7b329d: test(ytdlp): fix brace slip (@xdagiz)
- 0d4aade: update readme (@xdagiz)