@@ -4,6 +4,85 @@ All notable changes to Programmarr are documented here. This project follows
44[ Semantic Versioning] ( https://semver.org/ ) and the spirit of
55[ Keep a Changelog] ( https://keepachangelog.com/ ) .
66
7+ ## [ 0.8.0] — 2026-08-19
8+
9+ Hardening release ahead of going public. Programmarr had only ever run against its
10+ author's Plex and Tunarr; this release is the result of auditing it for everything that
11+ breaks, misleads, or silently does nothing on * somebody else's* setup.
12+
13+ ### Added
14+
15+ - ** Tunarr basic auth support.** Tunarr gained optional HTTP basic auth on its API;
16+ Programmarr sent no credentials at all, so a locked-down Tunarr failed everywhere.
17+ New ` tunarr_username ` / ` tunarr_password ` config keys, editable in
18+ Settings → Connections (and in onboarding). Every Tunarr call in every module now
19+ goes through one shared header builder, so enabling auth can't half-work.
20+ - ** Test connections in onboarding** (` POST /api/test-connection ` ). Saving config never
21+ contacted Tunarr or Plex, so a typo'd URL produced a green "Setup complete" and a
22+ broken install. The wizard now validates what you typed * before* writing it. A failed
23+ test warns but still lets you continue — it informs, it doesn't gatekeep.
24+ - ** Pre-delete lineup backups.** Deploy can delete Tunarr channels, which is
25+ irreversible. Programmarr now writes a gzipped snapshot of everything it's about to
26+ remove — each channel plus its full programming — to ` tunarr_backup_*.json.gz ` in your
27+ data directory before the first delete. The 3 most recent are kept; dry runs write
28+ nothing. See the new ** Backups** section in the README.
29+ - ** Tunarr version reporting.** The Dashboard's connection status now includes Tunarr's
30+ self-reported version, so bug reports can state it without digging.
31+ - ** Issue templates and Discussions** , so bug reports arrive with the version and log
32+ information needed to actually act on them.
33+
34+ ### Fixed
35+
36+ - ** Channel numbering order was ignored by the AI path.** ` PROMPT.md ` had been rewritten
37+ to a numbered list while the code still matched the old wording, so the function that
38+ rewrites the numbering scheme was silently doing nothing — the LLM always received the
39+ * default* category order regardless of Settings → Channel Numbering. A non-match now
40+ warns loudly instead of passing the content through unchanged.
41+ - ** Pre-1970 films were invisible to the decade facet.** Decade buckets started at 1970,
42+ so a classic-film collection contributed nothing at all. Buckets now run from the
43+ 1920s. (On the author's library this made 132 previously-unreachable films eligible for
44+ decade channels.) New labels are spelled in full — "1950s", not "50s", which would be
45+ ambiguous beside "2020s". Existing 70s/80s/90s labels are unchanged, so current channel
46+ names and saved planner state keep matching.
47+ - ** A failed library fetch looked like an empty library.** Every API error collapsed to
48+ "no results", so an outage reported "Indexed 0 movies" and would deploy channels with
49+ nothing on them. Failures are now distinguished from genuinely empty libraries: all
50+ libraries failing raises, a partial failure warns and continues.
51+ - ** Misleading errors for unsupported setups.** "No Plex source found in Tunarr" covered
52+ four unrelated situations and sent Jellyfin users off debugging Plex. Now each is named
53+ specifically: an unreachable Tunarr, a Tunarr with no media sources, a non-Plex source
54+ ("Found: jellyfin"), a Tunarr too old to have the required endpoint, and — separately —
55+ credentials that are missing versus credentials that are wrong.
56+ - ** A broken pipeline run hung the UI forever.** The progress stream ends on a completion
57+ event; anything failing after the response started (a subprocess that won't launch, a
58+ dead pipe, an unwritable log) killed the stream with no error and no exit code, leaving
59+ a spinner. Every failure path now terminates properly.
60+ - ** An empty library picker with no explanation.** A Plex failure while listing libraries
61+ was swallowed by a comment claiming the UI showed the error elsewhere. It didn't.
62+ - ** A wrong Plex token could pass the connection test.** Many self-hosted Plex servers
63+ allow unauthenticated access on the local network, so * every* local request succeeds —
64+ even with no token. That result is now flagged as unverified rather than reported as a
65+ validated token.
66+ - ** Empty Planner sections now say why.** "No TV channels available — run Export" was
67+ shown for three different situations, including to users who had already exported. A
68+ movies-only library is now told plainly there are no TV channels to build; a library
69+ with shows that don't qualify gets the actual thresholds named.
70+
71+ ### Changed
72+
73+ - Deploy-time backups are gzipped and retention is 3 rather than 10. Measured on a real
74+ 156-channel server: 151 MB raw, 12 MB compressed — at the old retention that was 1.5 GB
75+ quietly accumulating in a data directory.
76+ - README quick start now includes the compose file inline; previously only the TrueNAS
77+ section had one, so anyone who hadn't cloned the repo had nothing to run. Requirements
78+ now state Tunarr 1.x + Plex explicitly, and that Jellyfin/Emby are not supported.
79+
80+ ### Notes
81+
82+ Plex remains required. If you'd like Jellyfin or Emby support, add a reaction to
83+ [ #36 ] ( https://github.com/AlpineArchitecture/programmarr/issues/36 ) — demand decides
84+ priority.
85+
786## [ 0.7.1] — 2026-06-20
887
988### Fixed
0 commit comments