2026-03-28 11:29:42 +01:00
|
|
|
|
# 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).
|
|
|
|
|
|
|
2026-05-27 11:36:41 +02:00
|
|
|
|
## [0.9.10] - 2026-05-27
|
|
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
|
|
- **HLS segments halved from 4 s to 2 s**. seg-0 now lands in ~half the
|
|
|
|
|
|
cold-cache wait time, so the player paints the first frame ~1-2 s
|
|
|
|
|
|
sooner on software encodes (~0.5 s sooner on HW encoders). Trade-off:
|
|
|
|
|
|
2× more segments per source (a 2 h movie produces ~3600 segments
|
|
|
|
|
|
instead of ~1800), but each is half the size. Well within HLS spec
|
|
|
|
|
|
— Apple recommends 6 s but 2 s is also valid; LL-HLS uses 1-2 s.
|
|
|
|
|
|
Existing 0.9.9 cache entries fail `VerifyComplete` (the new segment
|
|
|
|
|
|
count expects different file names at the boundary) and are
|
|
|
|
|
|
invalidated + re-encoded transparently on next play. Self-healing,
|
|
|
|
|
|
no manual cleanup needed.
|
|
|
|
|
|
- **`OnStreamSession` daemon callback now runs `StartHLSSession` in a
|
|
|
|
|
|
goroutine** instead of blocking the sync HTTP loop on ffprobe
|
|
|
|
|
|
(~0.3-1 s typical). Net: sync responses return immediately, and any
|
|
|
|
|
|
other pending actions in the same response (new tasks, deletes)
|
|
|
|
|
|
no longer wait for ffmpeg to warm up. Browser HEAD probes already
|
|
|
|
|
|
have a 30 s retry budget that absorbs the brief window between
|
|
|
|
|
|
`playerSessionRegistry.add` and `streamSrv.HLS().Register`.
|
|
|
|
|
|
|
2026-05-27 10:09:42 +02:00
|
|
|
|
## [0.9.9] - 2026-05-27
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **per-session encoder log**: every HLS session start now logs
|
|
|
|
|
|
`encoder=… accel=… preset=…` so a "preparando sesión" complaint can
|
|
|
|
|
|
be triaged from the journal alone. Cache-HIT sessions keep the
|
|
|
|
|
|
existing simpler log (no ffmpeg involved).
|
|
|
|
|
|
- **probe cache**: `engine.ProbeFile` is memoised by `(path, mtime, size)`
|
|
|
|
|
|
for 30 minutes. A second play of the same file skips ffprobe
|
|
|
|
|
|
entirely — saves 1-3 s on first-segment latency for 50+ GB MKVs.
|
|
|
|
|
|
Cache key changes immediately on any file rewrite (mtime or size
|
|
|
|
|
|
delta).
|
|
|
|
|
|
- **agents tab transcoder row**: the web profile → agents tab now shows
|
|
|
|
|
|
each agent's selected encoder (`NVIDIA NVENC`, `Intel Quick Sync`,
|
|
|
|
|
|
`VA-API`, `macOS VideoToolbox`, or `Software (libx264)` in amber) plus
|
|
|
|
|
|
the comfortable transcode-resolution cap. Surfaces the same diagnostic
|
|
|
|
|
|
the daemon log carries.
|
|
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
|
|
- **HLS encoder presets biased for first-start latency**:
|
|
|
|
|
|
- **libx264**: default `veryfast` → `superfast` (~15-20% faster encode;
|
|
|
|
|
|
marginal quality loss at 5-25 Mbps target bitrates). Users wanting
|
|
|
|
|
|
the previous quality can set `download.transcode.preset = "veryfast"`
|
|
|
|
|
|
in `config.toml`.
|
|
|
|
|
|
- **NVENC**: `-preset p4 -tune hq` → `-preset p3 -tune ll`. First-segment
|
|
|
|
|
|
encode drops from ~1.5 s to ~0.8 s on RTX-class GPUs.
|
|
|
|
|
|
- **QSV**: `-preset medium` → `-preset veryfast`. Keeps `-look_ahead 0`
|
|
|
|
|
|
for low-latency rate control.
|
|
|
|
|
|
- **VideoToolbox** (macOS): adds `-realtime 1 -q:v 50` (was unset). The
|
|
|
|
|
|
`realtime` flag steers VideoToolbox into the low-latency code path.
|
|
|
|
|
|
- Encoder + preset selection moved into `engine.ResolveEncoderProfile` so
|
|
|
|
|
|
the same logic drives both argv construction and the log line.
|
2026-05-27 10:46:03 +02:00
|
|
|
|
- **`download.transcode.preset` is now libx264-only**. The configured preset
|
|
|
|
|
|
is honoured on software encode (libx264 vocabulary: ultrafast →
|
|
|
|
|
|
veryslow); HW backends ignore it and use vendor-specific defaults
|
|
|
|
|
|
(NVENC p3, QSV veryfast). Passing a libx264 preset to NVENC / QSV was
|
|
|
|
|
|
previously rejected by ffmpeg; the documentation now reflects what was
|
|
|
|
|
|
always the only correct usage.
|
|
|
|
|
|
- Default `download.transcode.preset` is empty (was `"veryfast"`). The
|
|
|
|
|
|
engine fills in `"superfast"` for libx264 — latency-biased. **Users who
|
|
|
|
|
|
want better quality at slower first-play should set it explicitly in
|
|
|
|
|
|
`config.toml`**: `"veryfast"` (previous default) / `"faster"` / `"fast"`
|
|
|
|
|
|
/ `"medium"`. Range documented in the TranscodeConfig struct.
|
2026-05-27 10:09:42 +02:00
|
|
|
|
|
2026-05-27 08:18:33 +02:00
|
|
|
|
## [0.9.8] - 2026-05-27
|
|
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
|
|
- **auto-upgrade restart loop**: when the server signal arrived for a version
|
|
|
|
|
|
the daemon was already running (e.g. flag still set after a previous
|
|
|
|
|
|
upgrade), `applyAutoUpgrade` would call `upgrade.Execute` (which no-ops),
|
|
|
|
|
|
then `os.Exit(0)` anyway — systemd respawned, the flag was still set, the
|
|
|
|
|
|
cycle repeated. Now: no-op case is detected up front, the daemon clears
|
|
|
|
|
|
the server flag via `/api/internal/agent/upgrade-result` and stays alive.
|
|
|
|
|
|
- **upgrade flag stuck after success**: the CLI never reported the upgrade
|
|
|
|
|
|
outcome, so `upgrade_requested` stayed `true` in the DB forever. The
|
|
|
|
|
|
daemon now calls `/api/internal/agent/upgrade-result` on every applyAutoUpgrade
|
|
|
|
|
|
branch (success, failure, no-op) — server clears the flag, restart loops
|
|
|
|
|
|
end.
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- New `Client.ReportUpgradeResult(agentID, success, version, error)` HTTP
|
|
|
|
|
|
method wrapping `POST /api/internal/agent/upgrade-result`.
|
|
|
|
|
|
|
2026-05-26 23:39:02 +02:00
|
|
|
|
## [0.9.7] - 2026-05-26
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **hls cache**: persistent fMP4 segment cache keyed by
|
|
|
|
|
|
`(source, quality, audio_index)`. After a successful encode the segments
|
|
|
|
|
|
+ `init.mp4` are kept under `~/.cache/unarr/hls-cache/{key}/` with a
|
|
|
|
|
|
`.complete` marker. A second play of the same file at the same quality
|
|
|
|
|
|
skips ffmpeg entirely (smoke-tested 23–31× faster than re-encode). LRU
|
|
|
|
|
|
+ size-budget eviction; pinned during active play; per-key writer-lock
|
|
|
|
|
|
prevents two concurrent encodes from corrupting each other. Startup
|
|
|
|
|
|
reaps orphan dirs without `.complete` older than 10 min so a daemon
|
|
|
|
|
|
crash doesn't leak disk indefinitely. New `[downloads.hls_cache]` block
|
|
|
|
|
|
in `config.toml`: `enabled` (default true), `size_gb` (default 5,
|
|
|
|
|
|
min 1), `dir` (default `~/.cache/unarr/hls-cache`).
|
|
|
|
|
|
- **hls cache integrity check**: on HIT, the daemon stats `init.mp4` +
|
|
|
|
|
|
last segment before reporting cache reuse — if a file was externally
|
|
|
|
|
|
deleted, the entry is invalidated and re-encoded transparently.
|
|
|
|
|
|
- **hls cache stats**: hit/miss counters surface via `cache.Stats()`
|
|
|
|
|
|
(`Hits`, `Misses`, `EntryCount`, `TotalBytes`) and the sweeper logs a
|
|
|
|
|
|
daily summary line `[hls_cache] day-stats: hits=N misses=M ratio=X%
|
|
|
|
|
|
entries=Y size=ZMB`.
|
|
|
|
|
|
- **subtitle integrity for cached replay**: `Close` waits up to 15 s for
|
|
|
|
|
|
the subtitle extractor goroutine before sealing `.complete` so a HIT
|
|
|
|
|
|
never serves half-written `.vtt` files. Timeout invalidates instead of
|
|
|
|
|
|
sealing.
|
|
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
|
|
- `[daemon] auto_upgrade` now appears in fresh `config.toml` files as
|
|
|
|
|
|
`true` (it was always the implicit default; this just makes it visible
|
|
|
|
|
|
in default-generated configs).
|
|
|
|
|
|
|
2026-05-26 21:47:04 +02:00
|
|
|
|
## [0.9.6] - 2026-05-26
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **auto-upgrade**: when the web flags the agent for upgrade
|
|
|
|
|
|
(`POST /api/internal/agent/upgrade` or the "Force update now" button),
|
|
|
|
|
|
the daemon now downloads and replaces the binary in-place, then exits so
|
|
|
|
|
|
the service supervisor (`systemd Restart=always` on Linux, the equivalent
|
|
|
|
|
|
on macOS/Windows) respawns on the new version. No `unarr update` step
|
|
|
|
|
|
required from the user. Still opt-in — only fires when the server sends
|
|
|
|
|
|
the upgrade signal.
|
|
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
|
|
- The `OnUpgrade` daemon callback no longer just logs `run unarr self-update`;
|
|
|
|
|
|
it now triggers the actual upgrade in a background goroutine.
|
|
|
|
|
|
|
2026-05-26 20:39:57 +02:00
|
|
|
|
## [0.9.5] - 2026-05-26
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **funnel**: optional CloudFlare Quick Tunnel subprocess. `unarr funnel on`
|
|
|
|
|
|
spawns `cloudflared` as a child process and registers an anonymous
|
|
|
|
|
|
`https://<random>.trycloudflare.com` hostname tunnelled to the daemon's
|
|
|
|
|
|
HLS server. The hostname is reported back to the web on every sync so the
|
|
|
|
|
|
in-browser player picks it up automatically — cross-network playback now
|
|
|
|
|
|
works on torrentclaw.com without Tailscale or port forwarding. Bytes
|
|
|
|
|
|
proxy through CloudFlare; TorrentClaw still doesn't relay content.
|
|
|
|
|
|
- **funnel**: on by default for fresh installs (NAS/Docker get cross-network
|
|
|
|
|
|
HTTPS automatically); existing configs that pre-date the feature stay
|
|
|
|
|
|
off until the operator runs `unarr funnel on`.
|
|
|
|
|
|
- **funnel**: auto-downloads cloudflared to the unarr data dir when not on
|
|
|
|
|
|
PATH (Linux amd64/arm64/armhf/386). ELF magic + size sanity check on the
|
|
|
|
|
|
download; `O_EXCL` partial-write so concurrent daemons don't clobber
|
|
|
|
|
|
each other.
|
|
|
|
|
|
- **funnel**: subprocess supervisor keeps the tunnel up across cloudflared
|
|
|
|
|
|
crashes + CF's ~6h Quick Tunnel rotation. Exponential backoff (2 s → 5 min)
|
|
|
|
|
|
on persistent failures. The web's reported URL is cleared the moment
|
|
|
|
|
|
cloudflared exits so an outdated hostname doesn't keep handing out 502s.
|
|
|
|
|
|
- **funnel**: `unarr funnel status` shows the live URL once registered.
|
|
|
|
|
|
See README §`[downloads.funnel]` for the throughput / latency caveats of
|
|
|
|
|
|
CF's free Quick Tunnels.
|
|
|
|
|
|
- **docker**: the official `torrentclaw/unarr` image now bundles
|
|
|
|
|
|
`cloudflared` so the funnel works the moment the container starts — no
|
|
|
|
|
|
first-run download.
|
|
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
|
|
- **hls/libx264**: bump the H.264 level we hint to libx264 by one tier so
|
|
|
|
|
|
anamorphic (>16:9) sources stop emitting unplayable streams. 720p at
|
|
|
|
|
|
level 3.1 silently rejected 1728×720 cinemascope frames with
|
|
|
|
|
|
`frame MB size > level limit`; 720p now ships at level 4.0, 1080p at 4.1.
|
|
|
|
|
|
Decoder compatibility is unaffected — every device that handles 1080p
|
|
|
|
|
|
already handles ≥ 4.1.
|
|
|
|
|
|
|
2026-05-26 18:04:35 +02:00
|
|
|
|
## [0.9.4] - 2026-05-26
|
|
|
|
|
|
|
|
|
|
|
|
### Removed
|
|
|
|
|
|
|
|
|
|
|
|
- **streaming**: retire the custom WebRTC DataChannel pipeline. The daemon no
|
|
|
|
|
|
longer ships pion/webrtc, the WSS signaling client, or the wire framing
|
|
|
|
|
|
package — every in-browser session now uses HLS over HTTP from the daemon
|
|
|
|
|
|
(Tailscale / LAN / UPnP). Browser P2P (WebTorrent) bytes never re-enabled.
|
|
|
|
|
|
- **config**: `[downloads.webrtc]` block removed from the TOML schema; existing
|
|
|
|
|
|
config files with the section parse cleanly because go-toml ignores unknown
|
|
|
|
|
|
sections.
|
|
|
|
|
|
- **seed_file**: `mode=seed_file` task handler + `engine.SeedFile` helper
|
|
|
|
|
|
dropped — the last in-browser caller was retired with the WebRTC player.
|
|
|
|
|
|
- **wstracker-probe**: standalone probe binary removed.
|
|
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
|
|
|
|
|
- **agent wire**: `SyncResponse.WebRTCSessions` (JSON: `webrtcSessions`) renamed
|
|
|
|
|
|
to `StreamSessions` (JSON: `streamSessions`). The Go type `agent.WebRTCSession`
|
|
|
|
|
|
is now `agent.StreamSession`. Wire-incompatible with web < 2026-05-26.
|
|
|
|
|
|
- **torrent**: `buildMagnet` no longer accepts an `extraTrackers` variadic —
|
|
|
|
|
|
the default tracker list is the only set used.
|
|
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
|
|
- **hls**: clamp the ffmpeg `-b:v` to the bitrate cap derived from the EFFECTIVE
|
|
|
|
|
|
output height instead of the requested quality. Previously asking for "2160p"
|
|
|
|
|
|
on a 1080p source overshot the H.264 level we resolved from the effective
|
|
|
|
|
|
height (4.0, max 20 Mbps) and made libx264 abort with
|
|
|
|
|
|
`VBV bitrate > level limit`.
|
|
|
|
|
|
|
2026-05-22 08:33:02 +02:00
|
|
|
|
## [0.9.2] - 2026-05-21
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **vpn**: `unarr vpn` command (`status`, `enable`, `disable`) to manage the managed
|
|
|
|
|
|
WireGuard split-tunnel, with `vpn status --check` to verify provisioning.
|
|
|
|
|
|
- **vpn**: report split-tunnel state (active, exit server) to the web on register
|
|
|
|
|
|
+ every sync, so the dashboard shows which agent holds the single WireGuard slot.
|
|
|
|
|
|
- **vpn**: send the agent id when fetching the VPN config so the web can arbitrate
|
|
|
|
|
|
the single WireGuard slot — the first agent claims it; the rest are told to run
|
|
|
|
|
|
OpenVPN on their own host (1 agent on WireGuard + up to 9 on OpenVPN).
|
|
|
|
|
|
|
2026-05-21 16:53:40 +02:00
|
|
|
|
## [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
|
2026-05-21 14:56:27 +02:00
|
|
|
|
## [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
|
|
|
|
|
|
|
2026-05-21 16:53:40 +02:00
|
|
|
|
### Documentation
|
|
|
|
|
|
|
|
|
|
|
|
- **docker**: refresh Docker Hub README + sync description in CI
|
|
|
|
|
|
|
2026-05-21 14:56:27 +02:00
|
|
|
|
### 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
|
2026-05-21 16:53:40 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.9.0
|
2026-05-08 17:23:19 +02:00
|
|
|
|
## [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
|
2026-05-21 14:56:27 +02:00
|
|
|
|
- **release**: 0.8.1
|
2026-05-08 11:27:47 +02:00
|
|
|
|
## [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
|
|
|
|
|
|
|
2026-05-08 17:23:19 +02:00
|
|
|
|
- **release**: 0.8.0
|
2026-05-08 11:27:47 +02:00
|
|
|
|
- **streaming**: post-review fixes — race lock, dead branch, stderr cap
|
|
|
|
|
|
- **torrent**: bump anacrolix log level Critical → Warning for visibility
|
2026-04-10 19:18:38 +02:00
|
|
|
|
## [0.7.0] - 2026-04-10
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **daemon**: enhance service management with start, stop, restart, and status commands for Windows
|
2026-05-08 11:27:47 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.7.0
|
2026-04-10 16:36:27 +02:00
|
|
|
|
## [0.6.8] - 2026-04-10
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **library**: add server-driven file deletion with allow_delete config
|
2026-04-10 19:18:38 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.6.8
|
2026-04-10 11:47:58 +02:00
|
|
|
|
## [0.6.7] - 2026-04-10
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **scan**: always scan downloads + organize dirs, deduplicate child paths
|
2026-04-10 16:36:27 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.6.7
|
2026-04-09 18:37:56 +02:00
|
|
|
|
## [0.6.6] - 2026-04-09
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
|
|
2026-04-10 11:47:58 +02:00
|
|
|
|
- **docker**: switch ffprobe download from johnvansickle.com to BtbN/FFmpeg-Builds
|
2026-04-09 18:37:56 +02:00
|
|
|
|
- **stream**: fix black screen on remote/Tailscale streaming
|
2026-04-10 11:47:58 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.6.6
|
2026-04-09 14:16:02 +02:00
|
|
|
|
## [0.6.5] - 2026-04-09
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
|
|
- **upgrade**: retry download on transient network errors with user feedback
|
2026-04-09 18:37:56 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.6.5
|
2026-04-09 10:54:42 +02:00
|
|
|
|
## [0.6.4] - 2026-04-09
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
|
|
- **daemon**: report error status when stream path is rejected
|
2026-04-09 14:16:02 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.6.4
|
2026-04-09 09:26:17 +02:00
|
|
|
|
## [0.6.3] - 2026-04-09
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
|
|
- **library**: use native arm64 ffprobe on Apple Silicon (osx-arm-64)
|
2026-04-09 10:54:42 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.6.3
|
2026-04-09 09:21:00 +02:00
|
|
|
|
## [0.6.2] - 2026-04-09
|
|
|
|
|
|
|
2026-04-09 09:13:38 +02:00
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
2026-04-09 09:21:00 +02:00
|
|
|
|
- **library**: resilient scan for large libraries and better ffprobe errors
|
|
|
|
|
|
|
|
|
|
|
|
### Other
|
2026-04-09 09:13:38 +02:00
|
|
|
|
|
2026-04-09 09:26:17 +02:00
|
|
|
|
- **release**: 0.6.2
|
2026-04-09 09:21:00 +02:00
|
|
|
|
- ignore local config/ directory
|
2026-04-09 00:01:24 +02:00
|
|
|
|
## [0.6.1] - 2026-04-08
|
|
|
|
|
|
|
2026-04-09 09:21:00 +02:00
|
|
|
|
|
2026-04-09 00:01:24 +02:00
|
|
|
|
### Added
|
|
|
|
|
|
|
2026-04-09 09:21:00 +02:00
|
|
|
|
- **wake**: long-poll wake listener for instant CLI sync
|
2026-04-09 00:01:24 +02:00
|
|
|
|
|
2026-04-09 09:21:00 +02:00
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
|
|
- resolve deadlock, data races and path traversal vulnerabilities
|
2026-04-08 18:57:36 +02:00
|
|
|
|
## [0.6.0] - 2026-04-08
|
2026-04-08 18:50:59 +02:00
|
|
|
|
|
|
|
|
|
|
|
2026-04-08 18:57:36 +02:00
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **sync**: replace WS+DO transport with unified HTTP sync
|
|
|
|
|
|
|
2026-04-08 18:50:59 +02:00
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
|
|
- **ws**: add ping/pong keepalive and read deadline to detect zombie connections
|
2026-04-09 09:21:00 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.6.0
|
2026-04-07 23:33:24 +02:00
|
|
|
|
## [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
|
2026-04-08 18:50:59 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.5.5
|
2026-04-07 19:18:41 +02:00
|
|
|
|
## [0.5.4] - 2026-04-07
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
|
|
- **stream**: use platform-specific socket options for Windows cross-compilation
|
2026-04-07 23:33:24 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.5.4
|
2026-04-07 19:08:49 +02:00
|
|
|
|
## [0.5.3] - 2026-04-07
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **stream**: persistent stream server with file swapping
|
2026-04-07 19:18:41 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.5.3
|
2026-04-07 17:06:04 +02:00
|
|
|
|
## [0.5.2] - 2026-04-07
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
|
|
|
|
|
- **stream**: report multi-network URLs for smart resolution
|
2026-04-07 19:08:49 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.5.2
|
2026-04-07 16:19:38 +02:00
|
|
|
|
## [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
|
2026-04-07 17:06:04 +02:00
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
|
|
|
|
|
- **release**: 0.5.1
|
2026-04-06 10:16:57 +02:00
|
|
|
|
## [0.5.0] - 2026-04-06
|
|
|
|
|
|
|
2026-03-28 11:29:42 +01:00
|
|
|
|
|
|
|
|
|
|
### Added
|
2026-04-06 10:16:01 +02:00
|
|
|
|
|
|
|
|
|
|
- **organize**: use server metadata for file organization and subtitle handling
|
|
|
|
|
|
- **stream**: add NAT-PMP port mapping for remote downloads
|
|
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
2026-04-07 16:19:38 +02:00
|
|
|
|
- **release**: 0.5.0
|
2026-04-06 10:16:57 +02:00
|
|
|
|
- **release**: add changelog generation and release automation
|
|
|
|
|
|
## [0.4.1] - 2026-04-01
|
2026-04-06 10:16:01 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Added
|
|
|
|
|
|
|
2026-04-06 10:16:57 +02:00
|
|
|
|
- **cli**: add login command and refactor shared helpers
|
|
|
|
|
|
- **stream**: report watch progress to API via HTTP Range tracking
|
2026-05-21 14:56:27 +02:00
|
|
|
|
|
|
|
|
|
|
### 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
|
|
|
|
|
|
|
2026-04-06 10:16:01 +02:00
|
|
|
|
|
|
|
|
|
|
### 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
|
2026-05-21 14:56:27 +02:00
|
|
|
|
|
|
|
|
|
|
### 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
|
|
|
|
|
|
|
2026-03-28 11:29:42 +01:00
|
|
|
|
|
|
|
|
|
|
### Changed
|
|
|
|
|
|
|
2026-04-06 10:16:01 +02:00
|
|
|
|
- migrate lint config to v2, remove daemon auto-upgrade, add trust badges
|
2026-05-21 14:56:27 +02:00
|
|
|
|
## [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
|
2026-04-06 10:16:01 +02:00
|
|
|
|
|
|
|
|
|
|
### 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
|
|
|
|
|
|
|
2026-04-06 10:16:57 +02:00
|
|
|
|
- re-enable homebrew tap in goreleaser
|
2026-05-21 14:56:27 +02:00
|
|
|
|
## [0.3.1] - 2026-03-30
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Fixed
|
|
|
|
|
|
|
|
|
|
|
|
- **build**: unused variable in Windows process check
|
|
|
|
|
|
- **release**: disable homebrew tap until repo is created
|
|
|
|
|
|
|
|
|
|
|
|
### Other
|
|
|
|
|
|
|
2026-04-06 10:16:01 +02:00
|
|
|
|
- rename module from torrentclaw-cli to unarr
|
|
|
|
|
|
|
|
|
|
|
|
### Build
|
|
|
|
|
|
|
|
|
|
|
|
- remove UPX compression (antivirus false positives, startup penalty)
|
2026-05-21 14:56:27 +02:00
|
|
|
|
## [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
|
|
|
|
|
|
|
2026-04-06 10:16:01 +02:00
|
|
|
|
- add -s -w -trimpath to Makefile, add build-small target with UPX
|
2026-05-21 16:53:40 +02:00
|
|
|
|
[0.9.1]: https://github.com/torrentclaw/unarr/compare/v0.9.0...v0.9.1
|
2026-05-21 14:56:27 +02:00
|
|
|
|
[0.9.0]: https://github.com/torrentclaw/unarr/compare/v0.8.1...v0.9.0
|
2026-05-08 17:23:19 +02:00
|
|
|
|
[0.8.1]: https://github.com/torrentclaw/unarr/compare/v0.8.0...v0.8.1
|
2026-05-08 11:27:47 +02:00
|
|
|
|
[0.8.0]: https://github.com/torrentclaw/unarr/compare/v0.7.0...v0.8.0
|
2026-04-10 19:18:38 +02:00
|
|
|
|
[0.7.0]: https://github.com/torrentclaw/unarr/compare/v0.6.8...v0.7.0
|
2026-04-10 16:36:27 +02:00
|
|
|
|
[0.6.8]: https://github.com/torrentclaw/unarr/compare/v0.6.7...v0.6.8
|
2026-04-10 11:47:58 +02:00
|
|
|
|
[0.6.7]: https://github.com/torrentclaw/unarr/compare/v0.6.6...v0.6.7
|
2026-04-09 18:37:56 +02:00
|
|
|
|
[0.6.6]: https://github.com/torrentclaw/unarr/compare/v0.6.5...v0.6.6
|
2026-04-09 14:16:02 +02:00
|
|
|
|
[0.6.5]: https://github.com/torrentclaw/unarr/compare/v0.6.4...v0.6.5
|
2026-04-09 10:54:42 +02:00
|
|
|
|
[0.6.4]: https://github.com/torrentclaw/unarr/compare/v0.6.3...v0.6.4
|
2026-05-27 11:36:41 +02:00
|
|
|
|
[0.9.10]: https://github.com/torrentclaw/unarr/compare/v0.9.9...v0.9.10
|
2026-05-27 11:15:44 +02:00
|
|
|
|
[0.9.9]: https://github.com/torrentclaw/unarr/compare/v0.9.8...v0.9.9
|
|
|
|
|
|
[0.9.8]: https://github.com/torrentclaw/unarr/compare/v0.9.7...v0.9.8
|
|
|
|
|
|
[0.9.7]: https://github.com/torrentclaw/unarr/compare/v0.9.6...v0.9.7
|
|
|
|
|
|
[0.9.6]: https://github.com/torrentclaw/unarr/compare/v0.9.5...v0.9.6
|
|
|
|
|
|
[0.9.5]: https://github.com/torrentclaw/unarr/compare/v0.9.4...v0.9.5
|
|
|
|
|
|
[0.9.4]: https://github.com/torrentclaw/unarr/compare/v0.9.2...v0.9.4
|
|
|
|
|
|
[0.9.2]: https://github.com/torrentclaw/unarr/compare/v0.9.1...v0.9.2
|
|
|
|
|
|
[0.9.1]: https://github.com/torrentclaw/unarr/compare/v0.9.0...v0.9.1
|
|
|
|
|
|
[0.9.0]: https://github.com/torrentclaw/unarr/compare/v0.8.1...v0.9.0
|
|
|
|
|
|
[0.8.1]: https://github.com/torrentclaw/unarr/compare/v0.8.0...v0.8.1
|
|
|
|
|
|
[0.8.0]: https://github.com/torrentclaw/unarr/compare/v0.7.0...v0.8.0
|
|
|
|
|
|
[0.7.0]: https://github.com/torrentclaw/unarr/compare/v0.6.8...v0.7.0
|
|
|
|
|
|
[0.6.8]: https://github.com/torrentclaw/unarr/compare/v0.6.7...v0.6.8
|
|
|
|
|
|
[0.6.7]: https://github.com/torrentclaw/unarr/compare/v0.6.6...v0.6.7
|
|
|
|
|
|
[0.6.6]: https://github.com/torrentclaw/unarr/compare/v0.6.5...v0.6.6
|
|
|
|
|
|
[0.6.5]: https://github.com/torrentclaw/unarr/compare/v0.6.4...v0.6.5
|
|
|
|
|
|
[0.6.4]: https://github.com/torrentclaw/unarr/compare/v0.6.3...v0.6.4
|
2026-04-09 09:26:17 +02:00
|
|
|
|
[0.6.3]: https://github.com/torrentclaw/unarr/compare/v0.6.2...v0.6.3
|
2026-04-09 09:21:00 +02:00
|
|
|
|
[0.6.2]: https://github.com/torrentclaw/unarr/compare/v0.6.1...v0.6.2
|
|
|
|
|
|
[0.6.1]: https://github.com/torrentclaw/unarr/compare/v0.6.0...v0.6.1
|
2026-04-08 18:57:36 +02:00
|
|
|
|
[0.6.0]: https://github.com/torrentclaw/unarr/compare/v0.5.5...v0.6.0
|
2026-04-07 23:33:24 +02:00
|
|
|
|
[0.5.5]: https://github.com/torrentclaw/unarr/compare/v0.5.4...v0.5.5
|
2026-04-07 19:18:41 +02:00
|
|
|
|
[0.5.4]: https://github.com/torrentclaw/unarr/compare/v0.5.3...v0.5.4
|
2026-04-07 19:08:49 +02:00
|
|
|
|
[0.5.3]: https://github.com/torrentclaw/unarr/compare/v0.5.2...v0.5.3
|
2026-04-07 17:06:04 +02:00
|
|
|
|
[0.5.2]: https://github.com/torrentclaw/unarr/compare/v0.5.1...v0.5.2
|
2026-04-07 16:19:38 +02:00
|
|
|
|
[0.5.1]: https://github.com/torrentclaw/unarr/compare/v0.5.0...v0.5.1
|
2026-04-06 10:16:57 +02:00
|
|
|
|
[0.5.0]: https://github.com/torrentclaw/unarr/compare/v0.4.1...v0.5.0
|
2026-04-06 10:16:01 +02:00
|
|
|
|
[0.4.1]: https://github.com/torrentclaw/unarr/compare/v0.4.0...v0.4.1
|
2026-05-21 14:56:27 +02:00
|
|
|
|
[0.4.0]: https://github.com/torrentclaw/unarr/compare/v0.3.7...v0.4.0
|
|
|
|
|
|
[0.3.7]: https://github.com/torrentclaw/unarr/compare/v0.3.6...v0.3.7
|
|
|
|
|
|
[0.3.6]: https://github.com/torrentclaw/unarr/compare/v0.3.5...v0.3.6
|
|
|
|
|
|
[0.3.5]: https://github.com/torrentclaw/unarr/compare/v0.3.3...v0.3.5
|
|
|
|
|
|
[0.3.3]: https://github.com/torrentclaw/unarr/compare/v0.3.2...v0.3.3
|
|
|
|
|
|
[0.3.2]: https://github.com/torrentclaw/unarr/compare/v0.3.1...v0.3.2
|
|
|
|
|
|
[0.3.1]: https://github.com/torrentclaw/unarr/compare/v0.3.0...v0.3.1
|
|
|
|
|
|
[0.3.0]: https://github.com/torrentclaw/unarr/releases/tag/v0.3.0
|
2026-04-06 10:16:01 +02:00
|
|
|
|
|