CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.22.1] - 2026-11-10
### Fixed
- **hls**: tighten the encoder failure report after review
- **hls**: write init.mp4 into the session dir on Windows
## [1.22.0] - 2026-11-04
### Added
- **desktop**: offer to keep sent logs in the user's account
### Fixed
- **engine**: keep tasks without API status out of the sync
### Other
- **release**: 1.22.0
## [1.21.1] - 2026-10-31
### Fixed
- **usenet**: parse NZBs declared as iso-8859-1
### Other
- **release**: 1.21.1
## [1.21.0] - 2026-10-29
### Added
- **desktop**: change download folder from the tray; fix Windows toast body
### Fixed
- **config**: keep comments, order and unknown keys when saving config.toml
- **desktop**: address review of the download-folder change
### Other
- **release**: 1.21.0
## [1.20.4] - 2026-10-28
### Fixed
- **funnel**: bump pinned cloudflared to 2026.10.5 and refresh cached binaries
### Other
- **release**: 1.20.4
## [1.20.3] - 2026-10-28
### Fixed
- **login**: point unarr.app users at the agents tab, not the hidden API-key tab
### Other
- **release**: 1.20.3
## [1.20.2] - 2026-10-27
### Fixed
- **docker**: copy third_party before go mod download
### Other
- **release**: 1.20.2
## [1.20.1] - 2026-10-27
### Fixed
- **daemon**: absorber SIGPIPE desde el PersistentPreRun de start/up
- **daemon**: SIGHUP/SIGPIPE ya no dejan firma de crash falsa
- **torrent**: floor the tracker announce interval to stop the dispatcher spinning
### Other
- **release**: 1.20.1
### Build
- **go**: bump the toolchain directive to 1.26.10
## [1.20.0] - 2026-10-16
### Added
- **agent**: PublishSessions contra POST /api/internal/agent/sessions
- **config**: [metrics] publish, activo por defecto
- **daemon**: publica el snapshot de sesiones a la web
- **metrics**: publisher del snapshot de sesiones hacia la web
- **metrics**: vista unificada de sesiones, salud y endpoint Prometheus
### Documentation
- **metrics**: vida de la sesión mount y snapshot vacío al parar
- **metrics**: sección "Publishing to the web" en README y SCHEMA.md
### Fixed
- **backup**: el archivo sin secretos también vacía [metrics] token
- **backup**: no fiarse de un archivo sin cifrar que trae credenciales
- **backup**: avisar del api_url aunque el config local no parsee
- **config**: config check falla si config.toml no carga
- **engine**: servedWriter conserva io.ReaderFrom
- **metrics**: snapshot vacío final al parar el publisher
- **metrics**: la sesión mount sobrevive 15 s a su última lectura
- **metrics**: Title acotado a 200 runas y comentarios de session.go
- **metrics**: unarr status --json vuelve a dar el texto de siempre
- **metrics**: el reload avisa de que [metrics] necesita reinicio
- **metrics**: timeouts en /metrics y en el control plane
- **metrics**: vpn, states y onStall fuera del lock del hub
- **metrics**: bytes de la sesión, no los acumulados del proceso
- **metrics**: la primera muestra no cuenta como flujo parado
- **metrics**: clave (kind,id) para que download y stream no se pisen
### Other
- **release**: 1.20.0
## [1.19.0] - 2026-10-15
### Added
- **backup**: comando `unarr backup` y backups programados en el daemon
- **backup**: archivo verificado del estado local, sin secretos por defecto
- **config**: tabla [backup] para backups programados del estado
### Documentation
- **backup**: restore todo o nada y salida al merge que falla
### Fixed
- **backup**: rutas absolutas de la plataforma en los tests de config
- **backup**: avisar si las credenciales conservadas irían a otro servidor
- **backup**: restore no anuncia "Backup OK" antes de validar el contenido
- **backup**: validar la cola con el tipo de tarea del daemon
- **backup**: el snapshot pre-restore no aplica el tope por fichero
- **backup**: tope por fichero y validar el contenido antes de restaurar
- **backup**: no emparejar el agent id del archivo con credenciales locales
- **backup**: reintentar la lectura que Windows bloquea un instante
- **backup**: prometer conservar credenciales solo cuando las hay
- **backup**: rechazar miembros del zip que no son ficheros regulares
- **backup**: una sola cota de tamaño para create y restore
- **backup**: retencion de los snapshots pre-restore
- **backup**: conservar el agent id local al restaurar un archivo sin secretos
- **backup**: rechazar un [backup] dir relativo en create/list/prune
### Other
- **release**: 1.19.0
## [1.18.2] - 2026-10-12
### Fixed
- **usenet**: streaming Usenet activado por defecto
### Other
- **release**: 1.18.2
## [1.18.1] - 2026-10-11
### Fixed
- **arr**: saltar ficheros huerfanos y reintentar 429/5xx en arr sync
- **release**: descargar ffmpeg con varias fuentes, backoff y cache
### Other
- **release**: 1.18.1
## [1.18.0] - 2026-10-09
### Added
- **arr**: add `unarr arr sync` to flag TrueSpec-verified imported files
### Other
- **release**: 1.18.0
## [1.17.1] - 2026-10-08
### Fixed
- **release**: prepare 1.17.1 with portable platform test fixtures
## [1.17.0] - 2026-10-08
### Documentation
- **mount**: remove link to unpublished review report
### Fixed
- **agent**: retain HTTP denial after body read failure
- **agent**: allow paced remote mount metadata
- **daemon**: allow safe Windows uninstall without config parent
- **daemon**: wait for Windows mount cleanup before restart
- **mount**: detach owned macOS mounts before stopping rclone
- **mount**: restrict Windows owner rights on remote folders
- **mount**: preserve Linux daemon cleanup during service restart
- **mount**: reconcile disabled live mount sessions
- **mount**: preserve agent identity and activation ownership
- **remotefs**: bound reads and preserve catalog recovery
- **usenet**: bound replies and parse exact yenc fields
- **usenet**: validate and bound article transport
### Other
- **release**: 1.17.0
- merge main into remote mount branch
## [1.16.1] - 2026-10-05
### Other
- **release**: 1.16.1
## [1.16.0] - 2026-10-05
### Added
- **organize**: FileBot-style naming templates for the library layout
### Fixed
- **library**: read 3-4 digit episode numbers and drop {id} tags from titles
### Other
- **release**: 1.16.0
## [1.15.4] - 2026-10-05
### Fixed
- **torrent**: download every episode of a season pack
### Other
- **release**: 1.15.4
## [1.15.3] - 2026-10-05
### Documentation
- **agent**: copyVideoCodecs ships to agents >= 1.15.2
### Fixed
- **torrent**: release a metadata-starved slot after 10 min, not 30
- **vpn**: harden the reconnect-proof tracker socket
- **vpn**: keep UDP tracker sockets alive across a tunnel reconnect
### Other
- **release**: 1.15.3
## [1.15.2] - 2026-09-24
### Fixed
- **srcproxy**: close the single-upstream connection before dialing the next
### Other
- **release**: 1.15.2
## [1.15.1] - 2026-09-23
### Added
- **stream**: play IPTV movies and episodes in the browser over one provider connection
### Other
- **release**: 1.15.1
## [1.15.0] - 2026-09-23
### Added
- **engine**: download IPTV VOD, one at a time, paused while IPTV plays
### Fixed
- **engine**: harden IPTV downloads after review
### Other
- **release**: 1.15.0
## [1.14.11] - 2026-09-23
### Fixed
- **service**: a stopped or removed service is not resumed by a later sign-in
- **service**: park the installed service instead of restart-looping without a credential
### Other
- **release**: 1.14.11
## [1.14.10] - 2026-09-23
### Fixed
- **usenet**: fallback downloads the release the user chose
### Other
- **release**: 1.14.10
## [1.14.9] - 2026-09-23
### Fixed
- **daemon**: download queue never blocks startup or sync
### Other
- **release**: 1.14.9
## [1.14.8] - 2026-09-23
### Fixed
- **transcode**: keep the GPU render group in Docker and fall back to libx264
### Other
- **release**: 1.14.8
## [1.14.7] - 2026-09-22
### Fixed
- **docker**: a dashboard delete survives a container restart
### Other
- **release**: 1.14.7
## [1.14.6] - 2026-09-22
### Fixed
- **docker**: reconnect a revoked agent by restarting the container
### Other
- **release**: 1.14.6
## [1.14.5] - 2026-09-21
### Fixed
- **hls**: subtitle sidecars — delta fetches, truncated reads, 404 for unknown tracks
### Other
- **release**: 1.14.5
## [1.14.4] - 2026-09-21
### Fixed
- **hls**: subtitle windows — seek priority, spaced retries, idle-safe status
### Other
- **release**: 1.14.4
## [1.14.3] - 2026-09-21
### Added
- **hls**: extract remote subtitles in windows, the viewer's position first
- **hls**: expose subtitle extraction status; make bulk yielding process-wide
- **mount**: keep remote folder active
- **mount**: automate dependency setup with informed installation consent
### Fixed
- **downloads**: keep in-flight downloads on reconcile and shutdown
- **hls**: don't log an abandoned segment request as a generation failure
- **hls**: serve subtitle sidecars one-shot again; streaming stalled playback
- **hls**: stream growing subtitle sidecars so tracks never freeze partial
- **hls**: stop remote copy playback stalling on bandwidth-bound links
- **mount**: recover partial NZBs and honor API mirrors
- **mount**: validate native setup and handle legacy dependencies
### Other
- **release**: 1.14.3
### Performance
- **hls**: extract remote subtitles alongside each segment, not the whole file
## [1.14.2] - 2026-09-18
### Added
- **mount**: add optional paid remote folders with web-managed accounts
### Fixed
- **diagnostics**: keep report delivery available
- **hls**: preserve segment continuity for remote copy playback
### Other
- **release**: 1.14.2
## [1.14.1] - 2026-09-18
### Fixed
- **daemon**: recover macOS launchd and add private diagnostic reports
### Other
- **release**: 1.14.1
## [1.14.0] - 2026-09-17
### Added
- **desktop**: record the host going down in crash reports
### Fixed
- **agent**: fail over on the edge's 404 instead of failing the sync
- **library**: skip zero-content stubs instead of indexing them as playable
- **stream**: don't panic when a stream is requested before metadata
### Other
- **release**: 1.14.0
## [1.13.0] - 2026-09-16
### Added
- **agent**: resume debrid downloads across providers
### Fixed
- **stream**: reuse debrid connections across seeks
### Other
- **release**: 1.13.0
## [1.12.1] - 2026-09-15
### Fixed
- **engine**: keep storage Close out of guarded writes already in flight
- **release**: use the first GOPATH entry when looking for golangci-lint
- **release**: find golangci-lint before bumping the version
### Other
- **release**: 1.12.1
## [1.12.0] - 2026-09-15
### Fixed
- **usenet**: recognise RAR volumes that roll over past .r99 and .s99
- **usenet**: keep a dead NNTP pool unless its credentials changed
- **usenet**: treat missing articles as final and keep the NNTP pool healthy
- **usenet**: fall back to host on TLS name mismatch and recover dead NNTP pools
- **usenet**: reuse offset index and decoded articles across stream requests
### Other
- **release**: 1.12.0
### Performance
- **usenet**: serve an article's bytes while it downloads
- **usenet**: race a second fetch when a seek's article is slow
- **usenet**: read ahead from where a seek lands, not after it
- **usenet**: keep decoded articles off the Go heap
- **usenet**: share eight read-ahead slots across every reader
- **usenet**: keep the connection pool busy for fast consumers
- **usenet**: cut streaming memory for small hosts
## [1.11.11] - 2026-09-14
### Fixed
- **docker**: build with Go 1.26 to match go.mod
### Other
- **release**: 1.11.11
- **release**: name the remote main tracks in the push hint
## [1.11.10] - 2026-09-14
### Added
- **desktop**: add the Windows event log's side of a daemon death to reports
### CI/CD
- keep the Windows harness scripts ASCII, and enforce it
- shellcheck scripts/release.sh in CI and pre-commit
### Fixed
- **daemon**: answer a Resume while the Windows shim waits to relaunch
- **daemon**: consume the stop intent only once the instance lock is held
- **desktop**: show the schtasks error instead of a bare exit status
- **desktop**: do not report a Windows sign-out as a daemon crash
- **torrent**: walk past a listen port Windows has reserved instead of failing
### Other
- **release**: 1.11.10
### Build
- silence git-cliff parse-error warning for merge commits
- allow parallel golangci-lint runners in hook and make
## [1.11.9] - 2026-09-14
### Added
- **desktop**: open support reports with the daemon run and log freshness
### Fixed
- **daemon**: treat a boot log held by the task's shim as a daemon already owned
- **daemon**: fall back to a detached daemon when the Windows task will not run
- **desktop**: judge log staleness from the run start, mark crashes only when sent
- **desktop**: run one tray at a time and report each crash once
- **desktop**: start the supervised daemon on Windows Resume
### Other
- **release**: 1.11.9
## [1.11.8] - 2026-09-07
### Documentation
- **windows**: record the final piece-completion harness run
### Fixed
- **torrent**: harden the piece-completion pre-flight after review
- **torrent**: check, salvage or quarantine the piece-completion db before opening it
- **torrent**: own bolt piece-completion backend, synced and freelist-less
### Other
- **release**: 1.11.8
## [1.11.7] - 2026-09-07
### Fixed
- **stream**: probe only accepts 206, and HEAD no longer eats the budget
- **stream**: stop aborting a debrid stream when HEAD reveals no size
- **torrent**: put the completion test on the same scale as the guard
- **torrent**: measure the completion guard against the selected files
### Other
- **release**: 1.11.7
## [1.11.6] - 2026-09-03
### Fixed
- **windows**: scope the firewall rule to the program, drop the DHT probe
- **windows**: open the peer port and report DHT reachability at startup
### Other
- **release**: 1.11.6
## [1.11.5] - 2026-08-26
### Fixed
- **agent**: serialise every daemon-state write behind a mutex
- **config**: reject malformed paths instead of filing them as permission errors
- **crash-report**: stop reporting a Windows shutdown as an agent crash
### Other
- **release**: 1.11.5
## [1.11.4] - 2026-08-26
### Fixed
- **desktop**: read logs off disk when the CLI cannot be exec'd
- **mediainfo**: wait out a blocked rename on Windows instead of failing
- **mediainfo**: install downloaded tools atomically; accept newer ass-muxer wording
- **torrent**: refuse chunk writes after storage close instead of panicking
### Other
- **release**: 1.11.4
## [1.11.3] - 2026-08-25
### Fixed
- **funnel**: detect and restart a tunnel that died at the edge
### Other
- **release**: 1.11.3
## [1.11.2] - 2026-08-19
### Added
- **engine**: verify debrid downloads against the server-resolved file size
### Fixed
- **engine**: cancel must never delete another task's files
- **engine**: reap orphaned sidecars for real, and stop trusting a bare validator
- **engine**: close the gaps the download-integrity review found
- **engine**: make downloads corruption-proof (torrent stale-completion + debrid resume splicing)
### Other
- **release**: 1.11.2
## [1.11.1] - 2026-08-19
### Fixed
- **subs**: restrict tag stripping to the WebVTT tag vocabulary
- **subs**: drop drawing cues that ffmpeg wrapped in inline markup
### Other
- **release**: 1.11.1
## [1.11.0] - 2026-08-19
### Added
- **subs**: serve raw .ass + embedded fonts, and filter drawing cues from WebVTT
### Fixed
- **subs**: survive slow remuxes, aborted dumps and non-ass sources honestly
- **subs**: harden the ASS/fonts endpoints and the drawing filter after review
### Other
- **release**: 1.11.0
## [1.10.4] - 2026-08-14
### Added
- **hls**: clear the segment cache on a config change, and expose it to clean
### Fixed
- **hls**: key the sealing guard on what this session encoded, not where it is
- **hls**: finish the cache reuse that left playback stalled at the splice
- **hls**: reportar las sesiones que morían en silencio
### Other
- **release**: v1.10.4
## [1.10.3] - 2026-08-12
### CI/CD
- refuse to publish a release whose CI is not green
### Fixed
- **torrent**: make the busy-port walk work on Windows, and stop leaking the DB on failure
- **upgrade**: wait out a Windows holder instead of failing the install
### Other
- **release**: 1.10.3
## [1.10.2] - 2026-08-11
### CI/CD
- let CI be dispatched, because a missed push cannot be replayed
- run the architectural gate, which CI never did
### Documentation
- **logs**: say that log_max_size_mb bounds nothing under systemd
### Fixed
- **arch**: run the gate once per GOOS, so platform code stops slipping through
- **config**: treat an explicit empty api_url as unset
- **desktop**: stop crash reports describing an agent that is not the one that died
- **doctor**: keep the closing tip inside 60 columns
- **logs**: keep every log line ASCII, and guard the rule mechanically
- **upgrade**: install the binary atomically, so nothing ever execs a prefix
- **vpn**: say WHICH server disabled the VPN, and stop blaming the account
### Other
- **release**: 1.10.2
- untrack docs/ — notas internas fuera de un repo publico
## [1.10.1] - 2026-08-06
### Added
- **doctor**: check for an archive extractor, and stop gating the warning on usenet
- **postprocess**: unpack archives in-process, no unrar/7z required
### Fixed
- **engine**: reap stale ".tmp" unpack holders on every path, not only seeding
- **engine**: make an unpack visible only once it has finished
- **engine**: unpack a seeding release to a sibling, never inside the torrent
- **engine**: keep archive parts while the torrent is seeding
- **engine**: extract packed releases on the torrent path
- **hls**: honour the resume position when COPY-VOD is unavailable
- **postprocess**: match each volume family on its own, not via an optional group
- **postprocess**: key archive volumes by set identity, not just base name
- **postprocess**: stop archiveStem from eating a segment of the release name
- **postprocess**: delete only the volumes we unpacked, never the user's files
### Other
- **release**: 1.10.1
## [1.10.0] - 2026-08-06
### Added
- **bench**: expose the transcode ceiling the code already measures, plus disk and net
- **config**: report unknown and out-of-range keys instead of dropping them
- **docker**: add a HEALTHCHECK, and `unarr doctor --quick` to drive it
- **doctor**: probe the download methods that are actually in use (A1.6)
- **doctor**: check the library directories and the streaming ports (A1.3, A1.5)
- **doctor**: add a Media group, because a host with no ffmpeg passed every check
- **funnel**: download cloudflared on Windows, and fix what the CI was hiding
- **logs**: give the daemon ownership of its log, add `unarr logs`, make rotation opt-in
- **support**: add `unarr support-bundle`, allowlist-redacted and never uploaded
### Changed
- **doctor**: make the checks data, and add `unarr doctor --json`
### Fixed
- **ci**: make the windows and macos jobs pass, and fix the bug they were hiding
- **daemon**: write the service file atomically so a reinstall cannot destroy a working install
- **desktop**: make a crash report carry the crash, and stop calling a reboot one
- **doctor**: par2 said "not needed" on a machine that downloads usenet
- **doctor**: a wildcard bind is not proof a port is free on Windows
- **doctor**: three defects the review of A1.6 found in its own code
- **doctor**: report out-of-range config values, not just misspelled keys
- **doctor**: spell out the pass case so exhaustive keeps guarding the switch
- **engine**: a cross-device move that cannot delete its source is a duplication, not a move
- **engine**: serialise every Task field access behind its mutex
- **funnel**: stop retrying a download the code knows can never succeed
- **logs**: keep every log line ASCII, so every reader can read it
- **status**: reject a state file written before this host booted
- **support**: stop the bundle publishing the user's name, and publish the agent ID instead
### Other
- **release**: 1.10.0
## [1.9.0] - 2026-08-04
### Added
- **downloads**: local control plane, `unarr downloads`, and a way out of a stuck download
### Fixed
- **usenet-stream**: bound the header probe and reserve budget before the wire
- **usenet-stream**: make the cost guards hold what their comments promise
- **usenet-stream**: keep each segment's own size estimate in the offset index
- **usenet-stream**: stop the stream path overfetching hundreds of MB
### Other
- **release**: 1.9.0
## [1.8.2] - 2026-08-03
### CI/CD
- **deps**: bump actions/upload-artifact from 4 to 7 (#27)
### Fixed
- **docs**: update development status from "Beta" to "Active development" in README
- **portability**: repair the macOS/Windows bugs the new CI matrix exposed
- **windows**: do not let a shutting-down daemon stop its own replacement
- **windows**: stop the daemon that is RUNNING, not the one the state file names
- **windows**: supervise the daemon in the shim, and check process liveness for real
- **windows**: make the daemon survivable — respawn on death, and stop faking crashes
### Other
- **release**: 1.8.2
## [1.8.1] - 2026-07-29
### Fixed
- **windows**: re-register the autostart task on update so it adopts the new launcher
### Other
- **release**: 1.8.1
## [1.8.0] - 2026-07-28
### Added
- **library**: detect zero-content corrupt videos (opt-in)
- **library**: add `unarr library stats` — health, composition, quality
- **library**: native hygiene sweep + fix content-management leaks
### Other
- **release**: 1.8.0
## [1.7.7] - 2026-07-28
### Fixed
- **windows**: stop console window flashing at boot via wscript VBS launcher
### Other
- **release**: 1.7.7
## [1.7.6] - 2026-07-27
### Fixed
- **windows**: address code-review findings + fix task-XML encoding regression
- **windows**: stop console windows flashing on spawned children + harden autostart
### Other
- **release**: 1.7.6
## [1.7.5] - 2026-07-25
### Other
- **release**: 1.7.5
### Build
- **packages**: publish signed .deb and .rpm for amd64 and arm64
## [1.7.4] - 2026-07-25
### Other
- **release**: 1.7.4
### Build
- **desktop**: publish the tray for linux/arm64 and windows/arm64
## [1.7.3] - 2026-07-25
### Fixed
- **onboarding**: make install/start failures honest and stop leaving root behind
- **onboarding**: stop pointing container users at the interactive wizard
- **onboarding**: remove install and first-run dead ends
### Other
- **release**: 1.7.3
## [1.7.2] - 2026-07-24
### Added
- **telemetry**: agent lifecycle events + telemetry opt-out
### Other
- **release**: 1.7.2
## [1.7.1] - 2026-07-24
### Added
- **agent**: report install_type on register (cli/desktop/docker)
- **desktop**: play served sting+feature .m3u via playlist= deep-link param
### Fixed
- **engine**: classify storage faults distinctly to stop the re-download loop
### Other
- **release**: 1.7.1
## [1.7.0] - 2026-07-23
### Added
- **desktop**: accept sub= in the play deeplink and pass it to the player
### Other
- **release**: 1.7.0
## [1.6.2] - 2026-07-22
### Fixed
- **stream**: unbreak QSV transcodes that produced zero bytes
### Other
- **release**: 1.6.2
## [1.6.1] - 2026-07-21
### Added
- **desktop**: deep-link "Configure agent" to this machine's card
- **desktop**: stop making the player list a requirement
### Documentation
- **scan**: plan for a resumable, storage-aware library scan
- stop offering the browser as a selectable player
- document the [desktop] player settings
### Fixed
- **desktop**: drop the web player as a selectable choice
- **desktop**: honor the configured player, and offer the web one
- **desktop**: make "Pause agent" actually stop the agent
- **scan**: check the files whose integrity probe runs out of time
- **scan**: stop a partial scan from erasing other roots' cached work
- **scan**: never report an inconclusive probe as a damaged file
### Other
- **release**: 1.6.1
## [1.6.0] - 2026-07-21
### Added
- **agent**: coexist multiple downloaded versions instead of overwriting
- **desktop**: sign in from the tray, without a terminal
- **desktop**: show a dialog when a control the user asked for fails
- **desktop**: open the web app on a left click of the tray icon
- **desktop**: per-item icons for the tray menu
- **desktop**: adaptive player-only tray menu
- **desktop**: activity badge, player picker, and trial countdown
- **desktop**: surface downloads in the tray
- **desktop**: unarr:// protocol handler + signed self-update channel
- **desktop**: account, plan and version rows with an upgrade CTA
- **desktop**: "Start at login" autostart backends
- **stream**: keep the HTTPS port published so remote playback has a stable host
- **stream**: fMP4-only cast flag + copy→transcode fallback (#23)
- **usenet**: stream web-dispatched tasks via the on-the-fly usenet streamer
### CI/CD
- **deps**: bump actions/checkout from 4 to 7 (#19)
- **deps**: bump actions/download-artifact from 4 to 8 (#18)
- **deps**: bump actions/setup-go from 5 to 7 (#17)
- **deps**: bump golangci/golangci-lint-action from 7 to 9 (#13)
- **deps**: bump docker/login-action from 3 to 4 (#11)
### Changed
- **agent**: give the daemon's credential a single owner
- **agent**: drop unused LocalState disk persistence
- **desktop**: make the modeTray case explicit in main's switch
- **desktop,upgrade**: clear the pre-existing arch-gate debt
- gofmt sync.go and daemon.go
### Fixed
- **agent**: surface the three failures that still rendered as a healthy agent
- **agent**: close the gaps a review found in the parking path
- **agent**: keep wiping a tombstoned credential when the daemon parks
- **agent**: treat terminal failures as questions for the user, not crashes
- **agent**: report the HTTPS port the listener actually bound (#25)
- **arch**: resolve the gate's base rev instead of hardcoding origin/main (#24)
- **ci**: sign and attach the desktop manifest on the dispatch path
- **ci**: chain the desktop tray build into the release pipeline
- **desktop**: keep the tray usable when a daemon control fails
- **desktop**: report a restart loop once, and name it as one
- **desktop**: offer sign-in from the account row, whenever there is no account
- **desktop**: fail sign-in fast, and offer to report every failure
- **desktop**: translate an outdated agent's flag error into what to do
- **desktop**: report why a daemon control failed instead of nothing
- **desktop**: close player-only mode races from code review
- **engine**: clear a task's stale error when it recovers into a live state
- **usenet**: assemble segments at their real yEnc offsets
- **usenet**: displace a still-probing prior stream on a new claim
- **usenet**: serialize progress flushes and reap them on Remove
- **webdav**: serve the library mount to the local network only
### Other
- **release**: 1.6.0
### Performance
- **usenet**: probe rar-store volume headers concurrently
## [1.5.2] - 2026-07-18
### Added
- **desktop**: stateful tray icon, pause marker, and support/crash reporting
### Changed
- **notify**: move desktop notifications to shared internal/notify
### Fixed
- **ci**: darwin/amd64 desktop build on macos-15-intel
- **daemon**: unarr stop cleans up the stale state a dead daemon left
- **daemon**: reap orphaned state file after stop
- **desktop**: reap tray-initiated stop orphans regardless of CLI version
- **desktop**: build the Windows tray with the GUI subsystem
### Other
- **release**: 1.5.2
## [1.5.1] - 2026-07-17
### Fixed
- **agent**: report config the server can act on, and reload for real
### Other
- **release**: 1.5.1
## [1.5.0] - 2026-07-17
### Added
- **usenet**: direct streaming from Usenet with resilient fallback
- **usenet**: activate par2 verify/repair + de-obfuscation on the usenet path
- **vpn**: optional P2P kill-switch (downloads.vpn.required)
- **webdav**: read-only WebDAV export of the agent library
### Fixed
- **vpn**: show exit server after a fail-closed tunnel heals
- **webdav**: symlink-safe root check, season-pack grouping, UPnP warning
- **webdav**: deterministic collision suffix + drop redundant nolint
### Other
- **release**: 1.5.0
### Merge
- read-only WebDAV library export (feat/webdav-readonly)
- VPN P2P kill-switch (feat/vpn-killswitch)
## [1.4.0] - 2026-07-16
### Added
- **stream**: auto-pause P2P background download when the stream goes idle
### Other
- **release**: 1.4.0
## [1.3.9-beta] - 2026-07-15
### Added
- **search**: interactive picker + --stream/--no-interactive
### Other
- **release**: 1.3.9-beta
## [1.3.8-beta] - 2026-07-15
### Added
- **doctor**: add --fix self-repair for common misconfigurations
### Fixed
- **discovery**: route search/stats to TorrentClaw hosts, not unarr.app
### Other
- **release**: 1.3.8-beta
## [1.3.7-beta] - 2026-07-12
### Documentation
- /version + /releases/download kept as GitHub redirects, not removed
### Fixed
- **hls**: report source_unreachable for remote probe failures + explicit ffprobe timeout
### Other
- **release**: 1.3.7-beta
- **release**: remove self-hosted ship pipeline; GitHub Actions is the only path
## [1.3.6-beta] - 2026-07-09
### Fixed
- **hls**: wait for subtitle sidecar first byte instead of instant 404
### Other
- **release**: 1.3.6-beta
## [1.3.5-beta] - 2026-07-09
### Fixed
- **hls**: harden copy-vod pass — stat-guard fallback + honor prewarm index budget
- **hls**: reset copy-vod watermark on pass restart + dedup codec check
- **hls**: kill copy-vod echo via segment-muxer pass + mp4 annexb bsf
### Other
- **release**: 1.3.5-beta
- **release**: deprecate make ship — releases run on GitHub Actions
### Performance
- **hls**: cache copy-vod keyframe index as a scan-time sidecar
## [1.3.4-beta] - 2026-07-07
### Changed
- **library**: gofmt integrity + types doc comments
### Fixed
- **docker**: bundle Intel QSV runtime so h264_qsv doesn't core-dump
### Other
- **release**: 1.3.4-beta
## [1.3.3-beta] - 2026-07-03
### Added
- **library**: flag truncated/damaged files at scan time
### Other
- **release**: 1.3.3-beta
## [1.3.2-beta] - 2026-07-02
### Fixed
- **acme**: re-issue direct-TLS cert when agent_hash no longer matches
- **daemon**: harden cert re-issue gate + funnel backoff reset (review findings)
- **ship**: define HOMEBREW_TAP_TOKEN for local goreleaser runs
### Other
- **release**: 1.3.2-beta
## [1.3.1-beta] - 2026-06-29
### Added
- **config**: default to unarr.app primary, TorrentClaw as failover
- **release**: auto-publish Homebrew formula in CI; drop dead Forgejo prune
- **stream**: allow Google Cast receiver + wildcard CORS
### Changed
- **release**: migrate Homebrew brews → homebrew_casks
### Documentation
- **dockerhub**: rewrite for unarr brand + GitHub-native releases
### Fixed
- **ci**: check out the dispatched tag in the release workflow
- **ship**: run buildx on a host-network builder for CDN egress
### Other
- **brew**: prep goreleaser tap block for Unarr-app/homebrew-tap
- **release**: 1.3.1-beta
## [1.3.0-beta] - 2026-06-26
### Added
- **agent**: `unarr up --auth-key` redeems a short-lived key for a durable credential
- **hls**: remote COPY-VOD — full duration + seek-anywhere for connector/IPTV
### CI/CD
- **deps**: bump goreleaser/goreleaser-action from 6 to 7 (#5)
- **deps**: bump docker/build-push-action from 6 to 7 (#4)
- **deps**: bump actions/checkout from 4 to 7 (#3)
- **deps**: bump docker/setup-qemu-action from 3 to 4 (#2)
- **deps**: bump docker/setup-buildx-action from 3 to 4 (#1)
### Changed
- **engine**: extract COPY-VOD segment generation into its own file
- **upgrade**: extract verifyArchive to flatten checksum nesting
### Fixed
- **cmd**: make merged up.go build & pass the gate after rebrand
### Other
- **release**: 1.3.0-beta
## [1.2.4-beta] - 2026-06-25
### Documentation
- **release**: mirrors are independent, not byte-identical
### Other
- **rebrand**: migrate to Unarr-app/unarr-cli + unarr Docker org
- **release**: 1.2.4-beta
## [1.2.3-beta] - 2026-06-25
### Documentation
- **readme**: point repo references at Unarr-app/unarr-cli
### Fixed
- **upgrade**: pin one mirror per update, never mix checksums across hosts
### Other
- **release**: 1.2.3-beta
### Build
- reproducible release builds (trimpath + mod_timestamp + pinned toolchain)
## [1.2.2-beta] - 2026-06-25
### Added
- **desktop**: real unarr logo icon + logs via `unarr daemon logs`
- **desktop**: agent control + manage/config/logs/docs in the tray menu
- **desktop**: minimal system-tray companion (unarr-desktop) — spike
- **upgrade**: fail over to the web origin (Hetzner) when GitHub is unreachable
- **upgrade**: pull self-update releases directly from GitHub
### CI/CD
- **desktop**: GitHub Actions matrix to build unarr-desktop on linux/macOS/windows
- **github**: bump golangci-lint-action to v7 for golangci-lint v2
- **github**: migrate release + CI from forgejo/Hetzner to GitHub Actions
### Documentation
- **release**: document GitHub-primary + Hetzner-backup dual-publish ritual
### Fixed
- **changelog**: point cliff remote_url at Unarr-app/unarr-cli
- **desktop**: label 'Open unarr.app' (clearer than 'Open unarr')
- **desktop**: run click loop in a goroutine so onReady returns (empty-menu bug)
- **engine**: guard task.ResolvedMethod with the task mutex (data race)
- **upgrade**: pick latest release by max semver, not the API's first
### Other
- **lint**: clear pre-existing golangci v2.11.4 findings for CI green
- **release**: 1.2.2-beta
## [1.2.1-beta] - 2026-06-23
### Added
- **hls**: emit WebVTT subtitle sidecars in the EVENT-copy pass (remote sources)
### Other
- **release**: 1.2.1-beta
## [1.2.0-beta] - 2026-06-18
### Added
- **agent**: report max_stream_sessions in the register payload
- **hls**: seek-anywhere copy-vod via on-demand MPEG-TS segments
- **stream**: configurable max concurrent HLS sessions (max_stream_sessions)
### Fixed
- **stream**: evict the same-content predecessor before unrelated viewers
- **stream**: trust unarr dev origin :3029 in default CORS allowlist
### Other
- **release**: 1.2.0-beta
- ignore graphify-out/
### Build
- **lint**: add SOLID/complexity gate for new Go code
## [1.1.7-beta] - 2026-06-17
### Fixed
- **engine**: cross-backend integrity guard with retry-then-damaged
- **usenet**: fsync delivered files before reporting complete
### Other
- **release**: 1.1.7-beta
## [1.1.6-beta] - 2026-06-15
### Documentation
- **install**: point install one-liners at unarr.app
- clarify auto mode prefers cached debrid when configured
- document preferred_methods ordered download-method list
### Fixed
- **debrid**: fsync before verify to stop NFS write-back truncation
### Other
- **release**: 1.1.6-beta
## [1.1.5-beta] - 2026-06-14
### Added
- **downloads**: ordered preferred_methods list honored for web tasks
### Other
- **release**: 1.1.5-beta
## [1.1.4-beta] - 2026-06-12
### Added
- **agent**: el auto-update difiere hasta que no haya stream activo
- **library**: detección de intro/créditos post-scan (skip segments)
### Other
- **release**: 1.1.4-beta
## [1.1.3-beta] - 2026-06-11
### Added
- **daemon**: telemetría de salud continua + heartbeat de sesiones copy
- **daemon**: lock de instancia única por config dir (flock)
### Other
- **release**: 1.1.3-beta
## [1.1.2-beta] - 2026-06-11
### Added
- **stream**: HLS-copy — reemplazo resiliente del remux progresivo
### Fixed
- **stream**: hallazgos de la revisión crítica del modo copy
- **stream**: no copiar AAC multicanal en modo copy (WebKit lo rechaza igual)
- **stream**: downmix estéreo en el audio re-encodeado del modo copy
- **stream**: EXT-X-START=0 en el playlist copy mientras crece
- **stream**: el modo copy ignora StartSec (offset EVENT rompe iOS nativo)
### Other
- **release**: 1.1.2-beta
## [1.1.1-beta] - 2026-06-10
### Added
- **stream**: UPnP-map the HTTPS port for remote direct-TLS (best-effort)
### Fixed
- **stream**: iOS exige total concreto en el Content-Range del remux
### Other
- **release**: 1.1.1-beta
## [1.1.0-beta] - 2026-06-10
### Added
- **hls**: full-GPU scale_cuda for NVENC SDR downscales
### Fixed
- **stream**: delay_moov en el remux para audio AAC con dts negativo
- **stream**: no anunciar un total falso mientras el remux crece (loop de re-seek)
### Other
- **release**: 1.1.0-beta
## [1.0.9-beta] - 2026-06-10
### Changed
- **daemon**: revisión crítica del reporte de errores de sesión
### Fixed
- **daemon**: reportar fallos de arranque de sesión a la web + scan en sesión única
### Other
- **release**: 1.0.9-beta
## [1.0.8-beta] - 2026-06-10
### Added
- **hls**: resume-aware first spawn + capped-CRF/CQ rate control
- **subtitles**: subtitle-fetch jobs vía sync + auto-fetch opcional en scan
### Fixed
- **hls**: forced-idr en NVENC/QSV — los segmentos ignoraban force_key_frames
- **hls**: los prewarms ya no desalojan la sesión del espectador + trickplay 12x
### Other
- **release**: 1.0.8-beta
## [1.0.7-beta] - 2026-06-08
### Added
- **subs**: resilient subtitle extraction — sidecars, charset, torrent/debrid
### Other
- **release**: 1.0.7-beta
## [1.0.6-beta] - 2026-06-07
### Added
- **agent**: per-machine key handoff + revocation handling
### Fixed
- **agent**: only treat explicit 410/403 as revocation; honour --config
### Other
- **release**: 1.0.6-beta
## [1.0.5-beta] - 2026-06-07
### Added
- **agent**: per-agent direct-TLS cert client + HTTPS listener wiring
- **stream**: live transcode telemetry from ffmpeg speed=
### Documentation
- **docker**: explain why GPU Vulkan tonemap can't init in-container
### Fixed
- **docker**: derive bundled dep arch from dpkg, not TARGETARCH default
- **torrent**: suppress noisy UPnP AddPortMapping warnings
### Other
- **release**: 1.0.5-beta
## [1.0.4-beta] - 2026-06-04
### Fixed
- **stream**: self-heal host→container path skew in HLS + sidecar handlers
### Other
- **release**: 1.0.4-beta
## [1.0.3-beta] - 2026-06-04
### Fixed
- **trickplay**: stop scan-time sprite generation from saturating the host
### Other
- **release**: 1.0.3-beta
## [1.0.2-beta] - 2026-06-03
### Added
- **stream**: debrid passthrough for mode=stream tasks (external players)
- **trickplay**: scan-time montage sprite for the web scrubber
### Fixed
- **release**: keep prerelease suffix in docker smoke-check version compare
## [1.0.1-beta] - 2026-06-03
### Added
- **agent**: report isDocker so the web shows a docker pull command
- **release**: sign release checksums (ed25519), enforce + bake pubkey
### Fixed
- **stream**: retry thumbnail extraction with output-seek on seek-index failure
- **stream**: clamp out-of-range audio-track index to 0:a:0
### Other
- **release**: 1.0.1-beta
## [1.0.0-beta] - 2026-06-03
### Added
- **agent**: event-driven uplink — sync on every state transition
- **agent**: hybrid SSE downlink with long-poll fallback
- **agent**: give the public API client mirror failover
- **agent**: auto-resume interrupted downloads after a daemon restart
- **docker**: glibc base with nvenc ffmpeg + par2/7z extractors
- **downloads**: pre-flight free-disk guard before each download (hueco medio)
- **library**: content fingerprint + path-resilient sync + stream self-heal
- **library**: detect corrupt/incomplete files during scan
- **seeding**: wire seed ratio/time lifecycle into the torrent daemon
- **stream**: enable GPU libplacebo in prod image + gate to real GPU
- **stream**: benchmark software encode ceiling at startup
- **stream**: GPU HDR tonemap via libplacebo
- **stream**: /speedtest endpoint for agent-path bandwidth probing
- **stream**: cache scan-time thumbnail frames to the .unarr sidecar
- **stream**: cache extracted subtitles to a hidden .unarr sidecar
- **stream**: serve embedded text subtitles as on-demand WebVTT
- **stream**: optional per-agent HTTPS listener with hot-reloadable cert
- **stream**: burn bitmap (PGS/DVB) subtitles into the video via overlay
- **stream**: bitrate-sized readahead for play-while-download
- **stream**: on-demand frame thumbnails via /thumbnail (hueco medio)
- **stream**: refresh expired debrid links mid-stream (hueco #2/2c)
- **stream**: transcode debrid sources to HLS from a URL (hueco #2/2b)
- **stream**: serve /stream from a debrid HTTPS link (hueco #2/2a)
- **stream**: device-aware remux (HEVC/AV1 + non-aac audio) + TTFF timers
- **stream**: progressive fMP4 remux source for /stream (hueco #3 / 3b-i)
- **stream**: direct-play passthrough for browser-native files
- **stream**: authenticate /stream and /hls with signed tokens
- **transcode**: tonemap HDR sources to SDR (zscale-gated)
### Documentation
- **docker**: add docker-compose.yml for one-command setup
- **roadmap**: close the realtime hueco + mark Tailscale-Funnel note stale
- **roadmap**: mark unarr localized-route 404 fixed
- **roadmap**: mark hueco #2 closed (2a+2b+2c)
- **roadmap**: mark hueco #2/2b (HLS-from-URL) closed
- **roadmap**: hueco #3 fully closed — 3d resolved as 3d-lite auto-downshift
- **roadmap**: hueco #3 3c closed (capability negotiation) + TTFF diagnosis
- **roadmap**: hueco #3 phase 3b closed (progressive fMP4 remux) + smoke
- **roadmap**: 3b approach = progressive fMP4 remux via /stream
- **roadmap**: hueco #3 3a smoke e2e passed + brand-isolation fix noted
- **roadmap**: add hueco #4 (pre-transcode on download) design
- **roadmap**: hueco #3 phase 3a closed (direct-play)
- **roadmap**: design hueco #3 (device-profile + direct-play + ABR)
- **roadmap**: design hueco #2 (debrid in the streaming path)
### Fixed
- **agent**: surface par2/install/NFS failures instead of degrading silently
- **stream**: don't cache transient libplacebo probe timeouts
- **stream**: functional libplacebo probe + benchmark hardening
- **stream**: clean HLS segments — no B-frames, no scene-cut, CFR
- **stream**: report stream failures via StreamError + retry transient stat
- **stream**: honor client network-caching in the M3U playlist
- **stream**: /critico review fixes for the sidecar cache
- **stream**: derive H.264 level from frame macroblocks, not height
- **stream**: derive H.264 level from frame macroblocks, not height
- **stream**: allow unarr.app origins for /stream + /hls CORS
### Other
- **release**: 1.0.0-beta
- **release**: 1.0.0-beta
- bump version to 0.10.0 (direct-play floor; local build only, no publish)
### Performance
- **stream**: run the subtitle/thumbnail prewarm at idle I/O priority
- **stream**: extract all text subtitles of a file in one ffmpeg pass
## [0.9.19] - 2026-05-30
### Fixed
- **docker**: three streaming/reliability bugs found in live docker test
### Other
- **release**: 0.9.19
## [0.9.18] - 2026-05-29
### Fixed
- **stream**: make completed torrent files readable (mmap creates 0000)
### Other
- **release**: 0.9.18
## [0.9.17] - 2026-05-27
### Added
- **scripts**: prune Forgejo releases >90 days in ship.sh
### Fixed
- **hls**: drop nvenc -tune ll — kills hls segmentation, bump 0.9.17
### Other
- **release**: 0.9.17
## [0.9.15] - 2026-05-27
### Added
- **sentry**: enhance error handling by skipping user input errors in CaptureError
### Changed
- **ci**: point Forgejo URLs at torrentclaw org (post-transfer)
- **sentry**: decouple agent import via string-match, rename predicate
### Documentation
- **positioning**: reframe unarr around download/stream/transcode, drop misleading search-first wording
### Fixed
- **ci**: unset GITHUB_TOKEN so goreleaser uses GITEA_TOKEN
- **sentry**: skip "daemon not running" stop/reload errors
### Other
- **release**: 0.9.15
- **scripts**: harden release.sh against double-release and inline version bumps
- untrack .claude/ (private local config)
## [0.9.14] - 2026-05-27
### Added
- **vaapi**: hybrid CPU-scale + hwupload encode path (QW2, 0.9.14)
### CI/CD
- port workflows from .github/ to .forgejo/ (Forgejo Actions)
### Fixed
- **daemon**: defensive IsClosed check in watchSessionReady poll loop
- **daemon**: use parent ctx for MarkSessionReady so cancel propagates
- **release**: move gitea_urls to top-level (goreleaser v2 schema)
## [0.9.13] - 2026-05-27
### Added
- **agent**: session-ready webhook for SSE-driven player handshake (0.9.13)
- **agent**: send full transcoder diagnostic in register payload (0.9.12)
### Fixed
- **daemon**: defer probeCancel so a panic mid-diagnostic still releases ctx
### Other
- **release**: add ship.sh end-to-end pipeline as GH Actions backup
- **skills**: add /publish slash command + allow .claude/ in git
## [0.9.11] - 2026-05-27
### Added
- **hls**: pre-segmentación delantada — 2 s segments + async session start (0.9.10)
- **hls**: faster first-start — probe cache + tighter encoder presets (0.9.9)
### Changed
- **hls**: critico-driven hardening of fase 3.2
### Fixed
- **cors**: allow play from .to / staging / onion mirrors
- **library**: classify resolution by width + height, not height alone
- **transcode**: make preset libx264-only + restore quality opt-in
### Other
- **release**: 0.9.11
## [0.9.8] - 2026-05-27
### Fixed
- **upgrade**: break auto-apply restart loop (0.9.8)
## [0.9.7] - 2026-05-26
### Added
- **hls**: persistent fMP4 segment cache + integrity + stats (0.9.7)
## [0.9.6] - 2026-05-26
### Added
- **daemon**: auto-apply upgrades when server signals (0.9.6)
## [0.9.5] - 2026-05-26
### Added
- **funnel**: cloudflare quick tunnel embedded subprocess (0.9.5)
## [0.9.4] - 2026-05-26
### Added
- **stream**: retire WebRTC, HLS-only, bump 0.9.4 (**BREAKING**)
## [0.9.3] - 2026-05-26
### Added
- **usenet**: warn at startup when par2 or extractor is missing
### Fixed
- **engine**: truncate errorMessage before reporting status
- **hls**: clamp ffmpeg bitrate to the level we derive from outputHeight
## [0.9.2] - 2026-05-22
### Added
- **vpn**: unarr vpn command + report/arbitrate the WireGuard slot
## [0.9.1] - 2026-05-21
### Added
- **mirror**: update fallback URLs to use IPFS and remove GitHub Pages
### Fixed
- **security**: bump golang.org/x deps and add container CVE scan gate
### Other
- **release**: 0.9.1
## [0.9.0] - 2026-05-21
### Added
- **agent**: add mirror failover, agent client refactor, status 401 detection
- **vpn**: local config_file for self-hosted/personal VPN testing
- **vpn**: split-tunnel torrent traffic through managed WireGuard
### CI/CD
- deploy install scripts to GitHub Pages
### Documentation
- **docker**: refresh Docker Hub README + sync description in CI
### Fixed
- **security**: CORS allowlist, URL scheme guard, state perms, ZIP slip, mirror docs
- **security**: UPnP opt-in, bounded SSE reader, signed self-update
- **security**: harden HLS session IDs, /health disclosure, archive password handling
- **upgrade**: fetch releases from TorrentClaw app, not GitHub
### Other
- **pages**: add .nojekyll to disable Jekyll processing
- **pages**: set custom domain unarr.torrentclaw.com
- **release**: 0.9.0
## [0.8.1] - 2026-05-08
### Added
- **config**: set default values for WebRTC and transcoding in minimal TOML config
- **transcode**: dynamic H.264 level + HW probe + capability reporting
### Changed
- **streaming**: improve signal handling and remove unused components
### Fixed
- **self-update**: auto-restart live daemon after upgrade
- **streaming**: allow HLS sessions when webrtc disabled
### Other
- **gitignore**: add dist-ffbinaries to ignored files
- **release**: 0.8.1
## [0.8.0] - 2026-05-08
### Added
- **mediainfo**: ResolveFFmpeg + DownloadFFmpeg mirroring ffprobe pattern
- **release**: bundle ffmpeg + ffprobe in tarballs and Docker image
- **seed-file**: unarr-side handler for browser-on-demand seeding (Fase 4.7.c)
- **stream**: per-session quality cap from web
- **stream**: real-time transcoding for non-browser-decodable codecs
- **stream**: pion-based WebRTC byte streamer for browser playback
- **streaming**: seek-restart, single-session, idle sweeper, probe.json
- **streaming**: add HLS transport pipeline (daemon side)
- **streaming**: ffmpeg transcoding pipeline (direct play / fMP4 / HW accel)
- **torrent**: act as WebTorrent peer for browser ↔ unarr P2P streaming
- **wstracker-probe**: -seed FILE mode for browser ↔ unarr e2e validation
### Fixed
- **streaming**: bounded ffmpeg auto-restart + tmpdir gc + probe/stderr safety
- **transcoder**: force aac stereo 48khz + frag_duration for mse compat
- **transcoder**: force main profile + setparams Rec.709 + serveRange wait
- **transcoder**: correct scale filter + always force yuv420p
### Other
- **release**: 0.8.0
- **streaming**: post-review fixes — race lock, dead branch, stderr cap
- **torrent**: bump anacrolix log level Critical → Warning for visibility
## [0.7.0] - 2026-04-10
### Added
- **daemon**: enhance service management with start, stop, restart, and status commands for Windows
### Other
- **release**: 0.7.0
## [0.6.8] - 2026-04-10
### Added
- **library**: add server-driven file deletion with allow_delete config
### Other
- **release**: 0.6.8
## [0.6.7] - 2026-04-10
### Added
- **scan**: always scan downloads + organize dirs, deduplicate child paths
### Other
- **release**: 0.6.7
## [0.6.6] - 2026-04-09
### Fixed
- **docker**: switch ffprobe download from johnvansickle.com to BtbN/FFmpeg-Builds
- **stream**: fix black screen on remote/Tailscale streaming
### Other
- **release**: 0.6.6
## [0.6.5] - 2026-04-09
### Fixed
- **upgrade**: retry download on transient network errors with user feedback
### Other
- **release**: 0.6.5
## [0.6.4] - 2026-04-09
### Fixed
- **daemon**: report error status when stream path is rejected
### Other
- **release**: 0.6.4
## [0.6.3] - 2026-04-09
### Fixed
- **library**: use native arm64 ffprobe on Apple Silicon (osx-arm-64)
### Other
- **release**: 0.6.3
## [0.6.2] - 2026-04-09
### Added
- **library**: resilient scan for large libraries and better ffprobe errors
### Other
- **release**: 0.6.2
- ignore local config/ directory
## [0.6.1] - 2026-04-08
### Added
- **wake**: long-poll wake listener for instant CLI sync
### Fixed
- resolve deadlock, data races and path traversal vulnerabilities
## [0.6.0] - 2026-04-08
### Added
- **sync**: replace WS+DO transport with unified HTTP sync
### Fixed
- **ws**: add ping/pong keepalive and read deadline to detect zombie connections
### Other
- **release**: 0.6.0
## [0.5.5] - 2026-04-07
### Added
- **agent**: send stream port and IPs in register request
- **stream**: report duration and position in watch progress
- **stream**: trackingReader with byte-based progress and rate limiting
### Fixed
- **daemon**: cancel watch reporter on stream switch and re-notify ready
### Other
- **release**: 0.5.5
## [0.5.4] - 2026-04-07
### Fixed
- **stream**: use platform-specific socket options for Windows cross-compilation
### Other
- **release**: 0.5.4
## [0.5.3] - 2026-04-07
### Added
- **stream**: persistent stream server with file swapping
### Other
- **release**: 0.5.3
## [0.5.2] - 2026-04-07
### Added
- **stream**: report multi-network URLs for smart resolution
### Other
- **release**: 0.5.2
## [0.5.1] - 2026-04-07
### Added
- **daemon**: add on-demand library scan via heartbeat and WebSocket
### Fixed
- **agent**: add retry with backoff and WebSocket connect for daemon registration
- **daemon**: report failed status on stream request errors
- **daemon**: use correct systemd user target and isolate test cache
- **stream**: prevent duplicate events from killing active stream server
### Other
- **release**: 0.5.1
## [0.5.0] - 2026-04-06
### Added
- **organize**: use server metadata for file organization and subtitle handling
- **stream**: add NAT-PMP port mapping for remote downloads
### Other
- **release**: 0.5.0
- **release**: add changelog generation and release automation
## [0.4.1] - 2026-04-01
### Added
- **cli**: add login command and refactor shared helpers
- **stream**: report watch progress to API via HTTP Range tracking
### Fixed
- **ci**: fix lint errors and pin CI to Go 1.25
- **lint**: remove unused newStubCmd function
### Other
- **cli**: remove moreseed stub command
- **cli**: remove redundant stub commands (monitor, open, add, compare)
## [0.4.0] - 2026-03-31
### Added
- **cli**: upgrade command, rich status, and version cache
### Fixed
- **progress**: always report status transitions and poll for control signals
## [0.3.7] - 2026-03-31
### CI/CD
- **docker**: remove dockerhub-description sync step
## [0.3.6] - 2026-03-31
### CI/CD
- **deps**: bump docker/metadata-action from 5 to 6
- **deps**: bump docker/setup-qemu-action from 3 to 4
- **deps**: bump docker/login-action from 3 to 4
- **deps**: bump docker/build-push-action from 6 to 7
- **deps**: bump codecov/codecov-action from 5 to 6
- **docker**: add Docker Hub description sync and DOCKERHUB.md
### Fixed
- **ci**: upgrade golangci-lint to v2.11.3 for Go 1.25 support
- **docker**: upgrade alpine packages to patch CVE-2025-60876 and CVE-2026-27171
- **lint**: use default:none to disable errcheck, fix all gofmt and exhaustive
- **lint**: disable errcheck, tune gosec/exclusions for codebase state
- **lint**: configure linters for codebase maturity, fix gofmt and ineffassign
- **lint**: exclude common fire-and-forget patterns from errcheck
- **lint**: resolve errcheck and bodyclose warnings for golangci-lint v2
## [0.3.5] - 2026-03-30
### Changed
- migrate lint config to v2, remove daemon auto-upgrade, add trust badges
## [0.3.3] - 2026-03-30
### Fixed
- **ci**: remove go-client checkout steps
## [0.3.2] - 2026-03-30
### Added
- **init**: add 60s countdown, skip key, and cancel detection to browser auth
### CI/CD
- **release**: add Docker Hub publish and VirusTotal scan jobs
### Documentation
- add beta notice, fix install URLs to get.torrentclaw.com
### Fixed
- **ci**: fix virustotal job condition syntax
- **docker**: simplify Dockerfile for CI builds (no local go-client)
- **release**: disable homebrew tap (needs PAT, not GITHUB_TOKEN)
### Other
- re-enable homebrew tap in goreleaser
## [0.3.1] - 2026-03-30
### Fixed
- **build**: unused variable in Windows process check
- **release**: disable homebrew tap until repo is created
### Other
- rename module from torrentclaw-cli to unarr
### Build
- remove UPX compression (antivirus false positives, startup penalty)
## [0.3.0] - 2026-03-29
### Added
- **agent**: add WebSocket transport with HTTP fallback
- **auth**: browser-based CLI authentication (like Claude Code)
- **daemon**: add auto-scan, force start, and stall timeout default
- **debrid**: add HTTPS downloader for debrid direct URLs
- **stream**: UPnP port forwarding for remote video playback
- **usenet**: implement full NNTP download pipeline
- add migrate command, media server detection, and debrid auto-config
- replace setup with init wizard + interactive config menu
- add clean command to remove temp files, logs, and cached data
- add Sentry error reporting
- improve daemon resilience, streaming, and usenet downloads
- initial commit — unarr CLI
### Changed
- extract BuildSyncItems to library package, remove duplication
### Documentation
- improve CLI help, shell completion, and README
### Fixed
- **torrent**: expand tracker list, add DHT persistence and configurable timeouts
- force-start tasks bypass HasCapacity check in dispatch loop
- add panic recovery to auto-scan, cap DHT nodes at 200
- harden usenet/debrid downloaders from critico review
### Build
- add -s -w -trimpath to Makefile, add build-small target with UPX
[1.22.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.22.0...v1.22.1
[1.22.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.21.1...v1.22.0
[1.21.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.21.0...v1.21.1
[1.21.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.20.4...v1.21.0
[1.20.4]: https://github.com/Unarr-app/unarr-cli/compare/v1.20.3...v1.20.4
[1.20.3]: https://github.com/Unarr-app/unarr-cli/compare/v1.20.2...v1.20.3
[1.20.2]: https://github.com/Unarr-app/unarr-cli/compare/v1.20.1...v1.20.2
[1.20.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.20.0...v1.20.1
[1.20.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.19.0...v1.20.0
[1.19.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.18.2...v1.19.0
[1.18.2]: https://github.com/Unarr-app/unarr-cli/compare/v1.18.1...v1.18.2
[1.18.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.18.0...v1.18.1
[1.18.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.17.1...v1.18.0
[1.17.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.17.0...v1.17.1
[1.17.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.16.1...v1.17.0
[1.16.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.16.0...v1.16.1
[1.16.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.15.4...v1.16.0
[1.15.4]: https://github.com/Unarr-app/unarr-cli/compare/v1.15.3...v1.15.4
[1.15.3]: https://github.com/Unarr-app/unarr-cli/compare/v1.15.2...v1.15.3
[1.15.2]: https://github.com/Unarr-app/unarr-cli/compare/v1.15.1...v1.15.2
[1.15.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.15.0...v1.15.1
[1.15.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.11...v1.15.0
[1.14.11]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.10...v1.14.11
[1.14.10]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.9...v1.14.10
[1.14.9]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.8...v1.14.9
[1.14.8]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.7...v1.14.8
[1.14.7]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.6...v1.14.7
[1.14.6]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.5...v1.14.6
[1.14.5]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.4...v1.14.5
[1.14.4]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.3...v1.14.4
[1.14.3]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.2...v1.14.3
[1.14.2]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.1...v1.14.2
[1.14.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.14.0...v1.14.1
[1.14.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.13.0...v1.14.0
[1.13.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.12.1...v1.13.0
[1.12.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.12.0...v1.12.1
[1.12.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.11...v1.12.0
[1.11.11]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.10...v1.11.11
[1.11.10]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.9...v1.11.10
[1.11.9]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.8...v1.11.9
[1.11.8]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.7...v1.11.8
[1.11.7]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.6...v1.11.7
[1.11.6]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.5...v1.11.6
[1.11.5]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.4...v1.11.5
[1.11.4]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.3...v1.11.4
[1.11.3]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.2...v1.11.3
[1.11.2]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.1...v1.11.2
[1.11.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.11.0...v1.11.1
[1.11.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.10.4...v1.11.0
[1.10.4]: https://github.com/Unarr-app/unarr-cli/compare/v1.10.3...v1.10.4
[1.10.3]: https://github.com/Unarr-app/unarr-cli/compare/v1.10.2...v1.10.3
[1.10.2]: https://github.com/Unarr-app/unarr-cli/compare/v1.10.1...v1.10.2
[1.10.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.10.0...v1.10.1
[1.10.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.9.0...v1.10.0
[1.9.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.8.2...v1.9.0
[1.8.2]: https://github.com/Unarr-app/unarr-cli/compare/v1.8.1...v1.8.2
[1.8.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.8.0...v1.8.1
[1.8.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.7.7...v1.8.0
[1.7.7]: https://github.com/Unarr-app/unarr-cli/compare/v1.7.6...v1.7.7
[1.7.6]: https://github.com/Unarr-app/unarr-cli/compare/v1.7.5...v1.7.6
[1.7.5]: https://github.com/Unarr-app/unarr-cli/compare/v1.7.4...v1.7.5
[1.7.4]: https://github.com/Unarr-app/unarr-cli/compare/v1.7.3...v1.7.4
[1.7.3]: https://github.com/Unarr-app/unarr-cli/compare/v1.7.2...v1.7.3
[1.7.2]: https://github.com/Unarr-app/unarr-cli/compare/v1.7.1...v1.7.2
[1.7.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.7.0...v1.7.1
[1.7.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.6.2...v1.7.0
[1.6.2]: https://github.com/Unarr-app/unarr-cli/compare/v1.6.1...v1.6.2
[1.6.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.6.0...v1.6.1
[1.6.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.5.2...v1.6.0
[1.5.2]: https://github.com/Unarr-app/unarr-cli/compare/v1.5.1...v1.5.2
[1.5.1]: https://github.com/Unarr-app/unarr-cli/compare/v1.5.0...v1.5.1
[1.5.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.4.0...v1.5.0
[1.4.0]: https://github.com/Unarr-app/unarr-cli/compare/v1.3.9-beta...v1.4.0
[1.3.9-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.3.8-beta...v1.3.9-beta
[1.3.8-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.3.7-beta...v1.3.8-beta
[1.3.7-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.3.6-beta...v1.3.7-beta
[1.3.6-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.3.5-beta...v1.3.6-beta
[1.3.5-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.3.4-beta...v1.3.5-beta
[1.3.4-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.3.3-beta...v1.3.4-beta
[1.3.3-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.3.2-beta...v1.3.3-beta
[1.3.2-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.3.1-beta...v1.3.2-beta
[1.3.1-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.3.0-beta...v1.3.1-beta
[1.3.0-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.2.4-beta...v1.3.0-beta
[1.2.4-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.2.3-beta...v1.2.4-beta
[1.2.3-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.2.2-beta...v1.2.3-beta
[1.2.2-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.2.1-beta...v1.2.2-beta
[1.2.1-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.2.0-beta...v1.2.1-beta
[1.2.0-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.1.7-beta...v1.2.0-beta
[1.1.7-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.1.6-beta...v1.1.7-beta
[1.1.6-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.1.5-beta...v1.1.6-beta
[1.1.5-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.1.4-beta...v1.1.5-beta
[1.1.4-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.1.3-beta...v1.1.4-beta
[1.1.3-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.1.2-beta...v1.1.3-beta
[1.1.2-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.1.1-beta...v1.1.2-beta
[1.1.1-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.1.0-beta...v1.1.1-beta
[1.1.0-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.0.9-beta...v1.1.0-beta
[1.0.9-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.0.8-beta...v1.0.9-beta
[1.0.8-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.0.7-beta...v1.0.8-beta
[1.0.7-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.0.6-beta...v1.0.7-beta
[1.0.6-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.0.5-beta...v1.0.6-beta
[1.0.5-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.0.4-beta...v1.0.5-beta
[1.0.4-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.0.3-beta...v1.0.4-beta
[1.0.3-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.0.2-beta...v1.0.3-beta
[1.0.2-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.0.1-beta...v1.0.2-beta
[1.0.1-beta]: https://github.com/Unarr-app/unarr-cli/compare/v1.0.0-beta...v1.0.1-beta
[1.0.0-beta]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.19...v1.0.0-beta
[0.9.19]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.18...v0.9.19
[0.9.18]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.17...v0.9.18
[0.9.17]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.15...v0.9.17
[0.9.15]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.14...v0.9.15
[0.9.14]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.13...v0.9.14
[0.9.13]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.11...v0.9.13
[0.9.11]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.8...v0.9.11
[0.9.8]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.7...v0.9.8
[0.9.7]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.6...v0.9.7
[0.9.6]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.5...v0.9.6
[0.9.5]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.4...v0.9.5
[0.9.4]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.3...v0.9.4
[0.9.3]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.2...v0.9.3
[0.9.2]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.1...v0.9.2
[0.9.1]: https://github.com/Unarr-app/unarr-cli/compare/v0.9.0...v0.9.1
[0.9.0]: https://github.com/Unarr-app/unarr-cli/compare/v0.8.1...v0.9.0
[0.8.1]: https://github.com/Unarr-app/unarr-cli/compare/v0.8.0...v0.8.1
[0.8.0]: https://github.com/Unarr-app/unarr-cli/compare/v0.7.0...v0.8.0
[0.7.0]: https://github.com/Unarr-app/unarr-cli/compare/v0.6.8...v0.7.0
[0.6.8]: https://github.com/Unarr-app/unarr-cli/compare/v0.6.7...v0.6.8
[0.6.7]: https://github.com/Unarr-app/unarr-cli/compare/v0.6.6...v0.6.7
[0.6.6]: https://github.com/Unarr-app/unarr-cli/compare/v0.6.5...v0.6.6
[0.6.5]: https://github.com/Unarr-app/unarr-cli/compare/v0.6.4...v0.6.5
[0.6.4]: https://github.com/Unarr-app/unarr-cli/compare/v0.6.3...v0.6.4
[0.6.3]: https://github.com/Unarr-app/unarr-cli/compare/v0.6.2...v0.6.3
[0.6.2]: https://github.com/Unarr-app/unarr-cli/compare/v0.6.1...v0.6.2
[0.6.1]: https://github.com/Unarr-app/unarr-cli/compare/v0.6.0...v0.6.1
[0.6.0]: https://github.com/Unarr-app/unarr-cli/compare/v0.5.5...v0.6.0
[0.5.5]: https://github.com/Unarr-app/unarr-cli/compare/v0.5.4...v0.5.5
[0.5.4]: https://github.com/Unarr-app/unarr-cli/compare/v0.5.3...v0.5.4
[0.5.3]: https://github.com/Unarr-app/unarr-cli/compare/v0.5.2...v0.5.3
[0.5.2]: https://github.com/Unarr-app/unarr-cli/compare/v0.5.1...v0.5.2
[0.5.1]: https://github.com/Unarr-app/unarr-cli/compare/v0.5.0...v0.5.1
[0.5.0]: https://github.com/Unarr-app/unarr-cli/compare/v0.4.1...v0.5.0
[0.4.1]: https://github.com/Unarr-app/unarr-cli/compare/v0.4.0...v0.4.1
[0.4.0]: https://github.com/Unarr-app/unarr-cli/compare/v0.3.7...v0.4.0
[0.3.7]: https://github.com/Unarr-app/unarr-cli/compare/v0.3.6...v0.3.7
[0.3.6]: https://github.com/Unarr-app/unarr-cli/compare/v0.3.5...v0.3.6
[0.3.5]: https://github.com/Unarr-app/unarr-cli/compare/v0.3.3...v0.3.5
[0.3.3]: https://github.com/Unarr-app/unarr-cli/compare/v0.3.2...v0.3.3
[0.3.2]: https://github.com/Unarr-app/unarr-cli/compare/v0.3.1...v0.3.2
[0.3.1]: https://github.com/Unarr-app/unarr-cli/compare/v0.3.0...v0.3.1
[0.3.0]: https://github.com/Unarr-app/unarr-cli/releases/tag/v0.3.0