Changelog
1.5.0 - 2026-10-25
The biggest update since 1.4.0. Listenarr joins as a fifth *Arr, so audiobook libraries get the same umlaut and German-title treatment as series, films, music and books. The variation search can now be tuned per media type and per indexer: series, films, music, and books & audiobooks each get their own switch and their own variation cap, and an indexer with tight limits can get its own values or be left out entirely. Plus a round of fixes: saving a Settings tab no longer resets the other tabs, indexers at their daily limit get patched, an indexer error sent as HTTP 200 no longer uses up extra requests, and Lidarr searches for albums with umlauts find them again. Four database migrations run automatically on first start, and existing installations keep their current behaviour. 1.4.1 was never released; its changes are part of this release.
Features
- Listenarr support. Listenarr is an audiobook manager, and it now sits behind the proxy like the other four *Arrs: its library is synced, its searches are fanned out over the spelling variations, and its results are rewritten to
Author - Title. It reuses the existing book media type, so the German umlaut plugin and the renaming options apply unchanged. One database migration runs automatically on first start.- Listenarr instances are added by hand, under Arr instances → Add instance. Prowlarr has no Listenarr application type, so the setup wizard's Prowlarr auto-detection cannot discover one, and the wizard no longer claims otherwise. Beware a trap: Listenarr ships its own Prowlarr-compatible endpoint, so registering it in Prowlarr as a Readarr application makes our detection read it back as
readarr, after which it silently syncs nothing. Both READMEs spell this out. - A search that arrives without a category still resolves. Listenarr's indexer categories are optional, and the category is normally what tells us a query is about a book. When it is missing, Listenarr's own User-Agent is used as the signal instead. Every other caller is unaffected: without that signal the route behaves exactly as before.
- Two internal details worth knowing if you read the code: Listenarr accepts its API key only as an
X-Api-Keyheader, never in the query string, soArrClientgained an overridable transport rather than a special case. And because Listenarr searches withTitle Author Serieswhile Readarr searches withTitle Author, one audiobook is registered under both spellings from a single cache row (new nullableSearchItem.externalIdAliasescolumn), instead of being written twice and showing up twice in the library. - Optional: also search without the author. Some indexers list audiobooks and books under the title alone. A new switch per Readarr or Listenarr instance (Arr instances → edit, "Also search without the author", off by default) adds the spelling variations of the title without the author to the variation search, alternating with the "Author Title" spellings so a low cap still searches both. They count towards the books & audiobooks cap. The original title was already searched on its own before; what is new are its spelling variations. A hit without the author in the release name is found but not renamed, because the rename needs the author to be sure it is the right book.
- Listenarr instances are added by hand, under Arr instances → Add instance. Prowlarr has no Listenarr application type, so the setup wizard's Prowlarr auto-detection cannot discover one, and the wizard no longer claims otherwise. Beware a trap: Listenarr ships its own Prowlarr-compatible endpoint, so registering it in Prowlarr as a Readarr application makes our detection read it back as
- Music and books & audiobooks have their own variation-search switch. Until now both followed the film switch, so switching off the film variations silently switched them off for Lidarr, Readarr and Listenarr too. Settings → Search and the setup wizard now have four switches: series, films, music, and books & audiobooks. Existing installations keep their current behaviour: both new switches start with the value the film switch has.
- The variation search can be set per indexer. Indexers with tight limits, such as free tiers, can now be left out of the variation search per media type, under Settings → Search → Variation search per indexer. The list shows every indexer that was searched through, plus Prowlarr's indexers with their names. Without a custom setting an indexer follows the global switches. With one, a switched-off media type sends only the one original request to that indexer, and each media type has its own variation cap for that indexer. Changes take effect immediately, without a restart.
- The variation cap ("At most variations") is set per media type. Series, films, music, and books & audiobooks each have their own cap next to their switch, in Settings → Search and in the setup wizard. A custom indexer setting starts from these four values and can lower or raise them for that indexer alone. Existing installations keep their current cap: it is copied into all four.
Fixes
- Saving a Settings tab no longer fails with 409 when
UMLAUTADAPTARREX_PROXY_PORTis set to anything but 5006 (#152 - thanks @Blacks-Army for the report). Since Zod 4, the partial update schema still filled in the default for every field the request did not send, so each save carriedproxyPort: 5006and was rejected as a change to the env-managed port. Without the env var, the same bug was silent and worse: saving one tab reset every setting on the other tabs (and the proxy port) to its default. Omitted fields now stay untouched. If settings on other tabs changed back unexpectedly after a save on 1.4.x, check and re-enter them once. - Patching indexers no longer skips an indexer that is at its daily limit. Prowlarr runs a live connection test before it saves an enabled indexer and refuses the save when that test fails, so an indexer that was rate-limited or briefly unreachable kept its old settings. The patch only changes tags and the URL scheme, so it now saves without that test (
forceSave). Thanks luckyaid for the report. - The setup wizard now reports per-indexer patch results. It used to show "Indexers patched." even when some of them had failed. It now shows the same summary as the settings dialog and names every indexer that failed. Thanks luckyaid for the report.
- An indexer error sent as HTTP 200 no longer triggers the variation search. Many indexers report "Request limit reached" or a rejected API key as an
<error>document with status 200. That used to count as a normal answer, so the German variations were searched on top of it and used up even more of the limit. The error now goes back to Prowlarr unchanged and no variations are searched. If the limit is hit partway through the variations, the remaining ones are skipped, and the results collected so far are returned instead of the error document. Thanks luckyaid for the report. - Lidarr text searches find their album again, so the umlaut variations are searched for music too. Lidarr strips accents and punctuation before it searches: an album "Mondfähre" by "Die Bären" goes out as
Die Baren Mondfahre. The key the album was stored under kept the umlauts, so exactly the titles with umlauts were never found, and no variations were searched for them. Albums are now stored under the search Lidarr actually sends. That includes its separate "The" stripping for artist and album, the disambiguation it appends, and the release year it adds to self-titled albums, plus a second key for indexers that make Lidarr send raw names. This affectst=searchwith the music categories, the request Lidarr falls back to when an indexer has no artist/album search or that search found nothing. Thanks luckyaid for the report. - The Search settings tab shows the stored values again. The settings API did not return the search fields, so the tab always showed the defaults: a film variation search that had been switched off looked switched on after a reload, and so did a changed variation cap or sync interval.
Improvements
- The indexer patch list shows indexers that still hang on another proxy. When you switch over from the old UmlautAdaptarr, its tag usually stays on your indexers. Prowlarr routes an indexer through only one HTTP proxy, normally the one created first, so those searches can bypass UmlautAdaptarrEX. Affected rows now show which proxy and tag they also hang on, and a hint above the list explains the problem. Each of these rows has a "remove" checkbox, off by default, that takes the other proxy's tag off that one indexer during the patch. It only works for selected indexers, so no indexer ends up without an umlaut proxy. Without a tick nothing changes, so a step-by-step migration stays possible, and the other proxy itself is never deleted. FlareSolverr does not count, because Prowlarr uses it in addition to the HTTP proxy, and a tag that a FlareSolverr proxy also uses is never removed. Thanks luckyaid for the report and the idea for the checkbox.
- A 403 on the direct indexer URL now says what is wrong. Without Prowlarr, the *arr app calls
http://<host>:5005/<key>/<indexer-host>, and the key in that path is the UmlautAdaptarrEX application API key, not the indexer's. Putting the indexer key there, or keeping the_placeholder from the old UmlautAdaptarr, was rejected with a bareapi key mismatch. That log line now carries ahintfield for both cases, and both READMEs explain which key goes where.
Dependencies & internals
- Dependencies refreshed within their semver ranges and the supply-chain gate (
minimumReleaseAge): Next 16.4.3, React 19.3.1, Fastify 5.12.7, Zod 4.6.7, Prisma 7.10.1, undici 8.12.3, next-intl 4.14.9, TanStack Query 5.104, the Radix UI primitives, typescript-eslint 8.72 and others. Vitest and its coverage provider moved to 5.x (test tooling only, nothing ships in the image). - Two majors with no effect on this project:
@hookform/resolvers6 (the only breaking change is in the Effect resolver; we use the Zod one) andtsup9 (drops Node below 22.18; we require 24 or newer). The server bundle and its runtime dependency list are unchanged. - Prisma 8 is still a release candidate and stays out.
better-sqlite3stays on 12.x andtypescripton 6.x for the reasons inpnpm-workspace.yaml. - CI: the static Docker image labels (title, description, license) are defined once in the
Dockerfileinstead of drifting apart across three workflows, and the description now names Listenarr. Checkouts no longer persist the git credential, workflow permissions are scoped per job, and actionlint noise was silenced.
Upgrade notes
- To use Listenarr, add the instance by hand under Arr instances → Add instance, with type Listenarr. If you registered Listenarr in Prowlarr as a Readarr application and imported it through the setup wizard, that instance was stored as
readarrand syncs nothing: delete it and add it again as Listenarr. - Music albums get new lookup keys, and you do not need to do anything. The next sync rewrites them on its own: the quick sync within 10 minutes, or the next full sync if quick sync is off. Until then, Lidarr text searches behave as before. The Library page now shows these IDs in lower case and without umlauts (e.g.
baren mondfahre). - Four database migrations run automatically on first start. The first adds the nullable
SearchItem.externalIdAliasescolumn for Listenarr; existing rows keepNULL, so no re-sync is needed. The second adds the two new variation switches, pre-set from the film switch, and an empty table for per-indexer settings. The third splits the variation cap into one per media type and copies the current cap into each. The fourth adds the "Also search without the author" switch to the Arr instances, off for every existing instance. - API change for scripts that call the admin API directly:
maxTitleVariationsin/api/admin/settingsand in the setup payload is replaced bytvMaxTitleVariations,movieMaxTitleVariations,audioMaxTitleVariationsandbookMaxTitleVariations. The old field is now ignored. The legacy indexer routes are unchanged.