Umlaut- und Deutsch-Titel-Proxy für Sonarr / Radarr / Lidarr / Readarr.
Deutsch · English
# UmlautAdaptarrEX
> **AI Disclaimer:** Das Projekt wurde mit Hilfe von AI erstellt, jedoch nicht "gevibt coded". Ich bin seit über 11 Jahren Software Entwickler und Security hat einen hohen Stellenwert.
Vollständiger Rewrite des ursprünglichen .NET-Tools auf **Next.js + Fastify + Prisma + SQLite**.
UmlautAdaptarrEX gibt sich gegenüber den *arrs als Indexer aus, schaltet sich zwischen *arrs und den echten Indexer und
korrigiert Suchen wie Ergebnisse, damit Releases mit Umlauten oder deutschen Titeln zuverlässig gefunden, geladen und
importiert werden.
## Welche Probleme löst es?
- Releases mit Umlauten werden von den \*arrs sonst oft nicht korrekt gefunden oder importiert (Suche nach `o` statt
`ö`, fehlende Zuordnung am Indexer).
- Sonarr & Radarr erwarten den englischen Titel von TheTVDB / TMDB. Bei deutschen Produktionen oder Übersetzungen
führt das zu Fehlern wie `Found matching series/movie via grab history, but release was matched to series by ID`.
- Schlechtes Release-Naming (z. B. fehlendes `GERMAN`-Tag) wird optional korrigiert, sodass die \*arrs es korrekt
erkennen.
## Features
| Feature | Status |
| -------------------------------------------------------------------------------------------------------------------------------------- | :----: |
|
Sonarr Support | ✓ |
|
Radarr Support (nativ, via `alternateTitles` + optional TMDB) | ✓ |
|
Lidarr Support | ✓ |
|
Readarr Support | ✓ |
|
Prowlarr & NZB Hydra Support | ✓ |
| **Prowlarr-Indexer-Patch-Dialog**: Indexer auswählen, automatisch taggen & von `https` auf `http` umstellen | ✓ |
| Newznab (Usenet) & Torznab (Torrent) Support | ✓ |
| Mehrere Instanzen je \*arr-Typ (z. B. 2× Sonarr) | ✓ |
| Erkennung von Releases mit deutschem Titel & TVDB-Alias | ✓ |
| Korrekte Suche und Erkennung von Titeln mit Umlauten | ✓ |
| Umbenennung von Releases mit schlechtem Naming (optional) | ✓ |
| **Web-UI** (Setup-Wizard, Login, Dashboard, Instanzen, Sync-Runs, Request- & Rename-History) | ✓ |
| **Persistente SQLite-Datenbank**, kein Cache-Verlust nach Neustart | ✓ |
| **Live-Logs** über WebSocket | ✓ |
| **Mehrere Title-Provider** mit konfigurierbarer Reihenfolge: pcjones-API, TVDB, TMDB | ✓ |
| **Sprach-Plugins**: Deutsche Umlaute (default), Schwedische Umlaute, Französische Akzente | ✓ |
| **i18n**: Deutsch + Englisch | ✓ |
> **Hinweis zu Radarr:**
>
> - TMDB / TVDB Key wird benötigt, damit Radarr funktioniert.
> - TMDB / TVDB Key wird benötigt, damit die Plugins funktionieren.
## Sprach-Plugins
Sprach-Plugins steuern, wie Titel normalisiert werden und welche Schreibvarianten gegen den Indexer gefahren werden.
Sie können im Setup-Wizard (Schritt "Plugins") oder
nachträglich unter **Settings → Plugins** einzeln aktiviert werden. Mehrere Plugins lassen sich gleichzeitig betreiben,
z. B. wenn eine Bibliothek deutsche und französische Titel enthält.
| Plugin | Sprache | Default | Verhalten |
| ------------------------ | :-----: | :-----: | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **Deutsche Umlaute** | `de` | ✓ | Latin-Varianten (`ä → ae`, `ö → oe`, `ü → ue`, `ß → ss`) und ohne-Punkte-Varianten (`ä → a`, …); strippt Artikel `Der/Die/Das/The/An/A`. |
| **Schwedische Umlaute** | `sv` | ◯ | Schwedische Romanisierung: `Å → A` oder `AA`, `Ä → A` oder `AE`, `Ö → O` oder `OE` (Groß-/Kleinschreibung bleibt erhalten). |
| **Französische Akzente** | `fr` | ◯ | Entfernt Akzente (`é → e`, `à → a`, `ç → c`, …) und löst Ligaturen auf (`æ → ae`, `œ → oe`); strippt Artikel `Le/La/Les/Un/Une/Des/Du/De`. |
Pro Plugin werden mehrere Variationsmaps generiert, sodass auch Releases mit gemischter Schreibweise (z. B. `Brueckenkopf`
vs. `Brückenkopf` vs. `Brueckenkopf`) zuverlässig erkannt werden. Audio-Bibliotheken (Lidarr) verwenden zusätzlich
einen "Strip-All"-Pfad, der den diakritischen Buchstaben komplett entfernt.
## Installation
Drei Wege, das Image zu starten. Egal welche Variante du wählst: nach dem ersten Start öffnest du
`http://:5007` und der Setup-Wizard führt durch Account-Anlage, Modus, Plugins, Prowlarr- und
Proxy-Konfiguration.
### Variante 1: Docker Compose (empfohlen)
Es liegen zwei Compose-Dateien im Repository:
| Datei | Image-Quelle | Wann nutzen? |
| ---------------------------- | -------------------------------------------- | ------------------------------------------------------------------ |
| `docker-compose.yml` | Lokaler Build (`build: .`) | Du hast das Repository geklont und willst aus dem Quellcode bauen. |
| `docker-compose.release.yml` | `lexfi/umlautadaptarrex:latest` (Docker Hub) | Schnellster Weg, kein Repo-Checkout nötig. |
Hinweis: läuft der Container als root (Standard), korrigiert das Image die Rechte des `/data`-Volumes
beim Start automatisch (Default `PUID=1000`, `PGID=1000`). Ein manueller `chown` ist nicht mehr nötig.
root wird dabei **ausschließlich** für diesen einmaligen `chown` benötigt: der Entrypoint legt die
Rechte zurecht und wechselt dann via `gosu` auf `PUID:PGID`. Der eigentliche App-Prozess
(`node start.mjs`) läuft also nie als root. Wer Files unter `./data` mit einem anderen Host-User
besitzen möchte, setzt `PUID`/`PGID` als Env-Variablen (siehe Kommentare in der jeweiligen
Compose-Datei).
Unprivilegierter Betrieb: das Image kann auch direkt als Nicht-root-User gestartet werden
(`docker run --user 1000:1000`, ein `user:`-Eintrag in der Compose-Datei, Kubernetes `runAsUser` oder
das `run_as`-Feld der TrueNAS-App). In diesem Fall überspringt der Entrypoint `chown`/`gosu` und läuft
direkt unter der vorgegebenen UID/GID, ganz ohne `CHOWN`/`SETUID`/`SETGID`-Capabilities. Voraussetzung:
das `/data`-Volume gehört dieser UID/GID bereits (manuell `chown` oder via TrueNAS-ACL).
1. Container starten. Entweder mit Image vom Docker Hub:
```sh
curl -O https://raw.githubusercontent.com/xpsony/UmlautAdaptarrEX/main/docker-compose.release.yml
docker compose -f docker-compose.release.yml up -d
```
oder als lokaler Build (Repo-Checkout vorausgesetzt):
```sh
docker compose up -d
```
2. Web-UI öffnen: [http://localhost:5007](http://localhost:5007).
Ports anpassen: siehe Abschnitt „Ports" und `.env.example`.
Logs verfolgen: `docker compose -f docker-compose.release.yml logs -f umlautadaptarrex` (bzw. ohne `-f
docker-compose.release.yml` beim lokalen Build). Stop: `docker compose ... down`.
Update vom Docker Hub: `docker compose -f docker-compose.release.yml pull && docker compose -f
docker-compose.release.yml up -d`. Update bei lokalem Build: `docker compose build --pull && docker
compose up -d`.
### Variante 2: `docker run` (ohne Compose)
Reicht, wenn du das Repository nicht klonen möchtest und nur das fertige Image laufen lassen willst:
```sh
docker run -d \
--name umlautadaptarrex \
--restart unless-stopped \
-p 5005:5005 \
-p 5006:5006 \
-p 5007:5007 \
-v /srv/umlautadaptarrex/data:/data \
-e TZ=Europe/Berlin \
lexfi/umlautadaptarrex:latest
```
Das Verzeichnis `/srv/umlautadaptarrex/data` wird beim ersten Start automatisch angelegt und vom
Entrypoint auf `PUID:PGID` (Default `1000:1000`) gesetzt. Ein manueller `chown` ist nicht nötig.
Optional als zusätzliche `-e`-Flags:
- `PUID=1000` / `PGID=1000` (UID und GID, mit denen der App-Prozess läuft. Files unter `./data`
bekommen diese Owner-IDs). Greift nur, wenn der Container als root startet; bei `--user` werden
`PUID`/`PGID` ignoriert und die App läuft direkt unter der angegebenen UID/GID.
- `LOG_LEVEL=info` (Pino-Level: `trace`, `debug`, `info`, `warn`, `error`, `fatal`).
Update: `docker pull lexfi/umlautadaptarrex:latest && docker rm -f umlautadaptarrex` und Befehl oben
erneut ausführen. Das `data/`-Volume bleibt dabei erhalten.
### Variante 3: Unraid Template
Das Unraid-Template für UmlautAdaptarrEX ist jetzt offiziell im Community-Applications-Store (CA)
verfügbar: In Unraid unter **Apps** einfach nach „UmlautAdaptarrEX" suchen und direkt installieren,
ohne Template-URL. Das Template wird im separaten Repository
[xpsony/UmlautAdaptarrEX-Unraid-Template](https://github.com/xpsony/UmlautAdaptarrEX-Unraid-Template) gepflegt.
Installationsanleitung, Template-URL und Feld-Defaults (Ports, PUID/PGID, Appdata-Pfad) stehen
im README des Template-Repos.
### Variante 4: TrueNAS App
UmlautAdaptarrEX ist als Community-App im TrueNAS-App-Katalog verfügbar:
[apps.truenas.com/catalog/umlautadaptarrex_community](https://apps.truenas.com/catalog/umlautadaptarrex_community/).
In der TrueNAS-Oberfläche unter **Apps → Discover Apps** nach „UmlautAdaptarrEX" suchen und installieren.
Die App wird von [xopez](https://github.com/xopez) gepflegt, vielen Dank dafür.
### Variante 5: Bare-Metal / ohne Docker
Funktioniert auf jedem Linux- oder macOS-Host mit Node `>= 24` und `pnpm 11.11.0`. Der Supervisor in
[`start.mjs`](start.mjs) übernimmt Migration, Fastify (Port 5005 + TCP-Proxy 5006) und Next.js (Port
5007), ein Reverse-Proxy ist nicht nötig.
```sh
git clone https://github.com/xpsony/UmlautAdaptarrEX.git
cd UmlautAdaptarrEX
pnpm install --frozen-lockfile
pnpm prod # build:prod -> prisma migrate deploy -> start:prod
```
Die einzelnen Schritte als separate Scripts (z. B. für CI):
| Script | Was passiert |
| -------------------- | ---------------------------------------------------------------------------- |
| `pnpm build:prod` | Baut Next.js (Standalone) + Fastify-Bundle (tsup) mit `NODE_ENV=production`. |
| `pnpm prisma:deploy` | Wendet Migrationen idempotent auf die SQLite-DB an. |
| `pnpm start:prod` | Startet den Supervisor (Migration → Fastify → Next.js-Child) mit Prod-Env. |
Persistenz: der `data/`-Ordner (SQLite) bleibt im Repo-Verzeichnis. Für „läuft nach Reboot" liegt
eine systemd-Unit unter [`deploy/umlautadaptarrex.service`](deploy/umlautadaptarrex.service) bei,
inklusive Beispielen für User, `WorkingDirectory` und Hardening (`ProtectSystem`, `ReadWritePaths`).
Kurzfassung der Installation:
```sh
sudo cp deploy/umlautadaptarrex.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now umlautadaptarrex
journalctl -u umlautadaptarrex -f
```
### Variante 6: Proxmox VE (LXC, Community-Script)
> **Funktioniert, wird derzeit aber nicht bei den Proxmox Helper Scripts aufgenommen.** Das Skript folgt
> dem [community-scripts](https://community-scripts.org/docs/ct/readme)-Format (ProxmoxVED) und ist
> einsatzbereit. Aufgrund der aktuellen Regularien des Projekts kann es derzeit nicht in das offizielle
> Proxmox-Helper-Scripts-Repo aufgenommen werden, daher wird es self-hosted aus diesem Fork bereitgestellt.
Ein einzeiliger Befehl, direkt in der **Shell des Proxmox-VE-Hosts** ausgeführt, legt einen LXC-Container
an und installiert UmlautAdaptarrEX darin (self-hosted aus diesem Fork, kein ProxmoxVED-Clone nötig):
```bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/xpsony/UmlautAdaptarrEX/main/proxmox/community-scripts/ct/umlautadaptarrex.sh)"
```
Was das Skript tut:
- Legt einen Debian-13-LXC an (2 vCPU, 2048 MB RAM für den Build, 6 GB Disk).
- Installiert Node.js 26 + pnpm (via npm), holt das neueste Release von `xpsony/UmlautAdaptarrEX`
und führt `pnpm build:prod` + `pnpm prisma:deploy` aus.
- Fragt während der Installation die drei Service-Ports ab (vorbelegt mit den Defaults, Enter übernimmt):
- **5007** — Web-UI + Setup-Wizard (`http://:5007/setup`)
- **5005** — Public API + Indexer-Routen für die \*arrs
- **5006** — Prowlarr-TCP-Proxy (Basic-Auth, wird im Setup gesetzt)
- Startet die App als systemd-Dienst (`umlautadaptarrex`). Die SQLite-DB liegt unter
`/opt/umlautadaptarrex/data/` und bleibt über Updates erhalten.
Nach dem Lauf das Setup im Browser öffnen: `http://:5007/setup`.
Ports später ändern: `/opt/umlautadaptarrex/.env` bearbeiten (`UMLAUTADAPTARREX_WEBUI_PORT` /
`_LEGACYAPI_PORT` / `_PROXY_PORT`) und `systemctl restart umlautadaptarrex`. Ein LXC hat eine eigene IP,
es gibt also kein Host-seitiges Port-Mapping. Details und Wartungshinweise stehen in
[`proxmox/community-scripts/README.md`](proxmox/community-scripts/README.md).
## Ports
| Port | Dienst | Zweck |
| ---- | -------------- | ------------------------------------------------------------------------------- |
| 5005 | Fastify | Public API, Legacy-Routen (`///api`), WebSocket-Logs (`/ws/logs`) |
| 5006 | TCP HTTP-Proxy | Prowlarr-Indexer-Proxy mit HTTPS-CONNECT-Tunneling |
| 5007 | Next.js | Web-UI |
Die Ports lassen sich per Umgebungsvariable setzen (Priorität: gebrandete Variable > DB > Default):
| Port | Umgebungsvariable | Fallback |
| ---- | --------------------------------- | ------------------------ |
| 5005 | `UMLAUTADAPTARREX_LEGACYAPI_PORT` | `5005` |
| 5006 | `UMLAUTADAPTARREX_PROXY_PORT` | `Setting.proxyPort` (DB) |
| 5007 | `UMLAUTADAPTARREX_WEBUI_PORT` | `5007` |
`UMLAUTADAPTARREX_PROXY_PORT` überschreibt den in der Datenbank gespeicherten Wert bei jedem Start; ist die Variable gesetzt, wird das Proxy-Port-Feld unter Einstellungen → Erweitert schreibgeschützt angezeigt. Jede Variable setzt sowohl den Container-internen Bind-Port als auch den veröffentlichten Host-Port (das Compose-Mapping nutzt auf beiden Seiten denselben Wert). Vorlage siehe `.env.example`.
Die `data/`-DB wird in den Container gemountet und enthält die gesamte Konfiguration.
## Architektur
Wie UmlautAdaptarrEX zwischen den \*arrs, Prowlarr und den Indexern sitzt.
### Modus 1: Prowlarr-Indexer-Proxy (empfohlen, Port 5006)
```
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Sonarr │ │ Radarr │ │ Lidarr │ │ Readarr │
└────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │ │
│ Newznab/Torznab API (mit *arr-API-Key) │
└─────────────┼─────────────┼─────────────┘
▼
┌───────────┐
│ Prowlarr │ Indexer-Manager
└─────┬─────┘
│ HTTP (Schema im Indexer von https → http)
│ HTTP-Proxy: Indexer-Proxies → "UmlautAdaptarrEX"
▼
┌──────────────────────────────────┐
│ UmlautAdaptarrEX │
│ ───────────────────────────── │
│ :5006 TCP-Proxy (Basic-Auth) │◀── HTTP-CONNECT-Tunnel für https-Targets
│ :5005 Fastify-API + Legacy │
│ :5007 Web-UI (Next.js) │
│ │
│ Pipeline pro Request: │
│ 1. URL parsen (t=search/...) │
│ 2. Title-Lookup über Provider │
│ (pcjones │ TVDB │ TMDB │ │
│ db-cache, Reihenfolge │
│ konfigurierbar) │
│ 3. Query um Titelvarianten │
│ erweitern (Umlaute, Aliase, │
│ Sprach-Plugin-Maps) │
│ 4. Request an echten Indexer │
│ 5. XML-Response umschreiben │
│ (Title-Fix, Rename, Tags) │
│ │
│ Persistenz: SQLite (Prisma) │
│ • Settings, Instanzen, ApiKey │
│ • Title-Cache, Sync-Runs │
│ • Request- & Rename-History │
└──────────────┬───────────────────┘
│ HTTPS (ausgehend)
▼
┌────────────┐
│ Indexer │ Newznab/Torznab,
│ (Usenet/ │ NZB Hydra, ...
│ Torrent) │
└────────────┘
```
### Modus 2: Direkt als Indexer (ohne Prowlarr-Proxy, Port 5005)
```
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Sonarr │ │ Radarr │ │ Lidarr │ ...
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
│ Indexer-URL eingetragen als: │
│ http://:5005//
└───────────────┼───────────────┘
▼
┌──────────────────────────────────┐
│ UmlautAdaptarrEX │
│ Legacy-Route │
│ ///api?t=... │
│ (gleiche Pipeline wie oben) │
└──────────────┬───────────────────┘
│ HTTPS
▼
┌────────────┐
│ Indexer │
└────────────┘
```
Kernpunkte:
- **5006** ist der einzige Port, den Prowlarr direkt anspricht (HTTP-Proxy mit Basic-Auth, Default-User `UmlautAdaptarr`).
- **5005** trägt sowohl die Admin-API als auch die Legacy-Route `///api` für den Direktmodus.
- **5007** ist nur die UI; sie reverse-proxyt `/api/*` zur Laufzeit an 5005 (`src/proxy.ts`).
## Konfiguration in Prowlarr (empfohlen)
Empfohlene Methode, da bei mehreren Indexern kein Geschwindigkeitsverlust entsteht.
1. UmlautAdaptarrEX starten und im Web-UI Setup durchlaufen (Sonarr/Radarr/Lidarr/Readarr-Instanzen anlegen).
2. In Prowlarr: **Settings → Indexers → Indexer Proxies → Add (HTTP)**
- Name: `UmlautAdaptarrEX HTTP Proxy`
- Host: Containername (`umlautadaptarrex`) oder Host-IP
- Port: `5006`
- Tag: `umlautadaptarrex`
- Username/Passwort: die im Setup-Wizard (Schritt "Proxy") gesetzten Zugangsdaten eintragen.
Default-User ist `UmlautAdaptarr`, das Passwort wird automatisch generiert. Beide Werte
stehen jederzeit unter **Settings → Proxy** in der Web-UI. Wenn UmlautAdaptarrEX die
Prowlarr-Indexer-Proxy-Konfiguration automatisch anlegt (Setup-Wizard, Schritt
"Prowlarr-Install"), werden die Credentials direkt mit hinterlegt.
3. Bei allen Indexern, die den Proxy nutzen sollen:
- Tag `umlautadaptarrex` hinzufügen
- **URL-Schema von `https` auf `http` ändern**, nur so kann UmlautAdaptarrEX die Anfragen lokal abfangen.
Ausgehende Anfragen an den Indexer bleiben natürlich `https`.
**Schneller geht es über den Indexer-Patch-Dialog:** Statt jeden Indexer in Prowlarr von Hand
anzufassen, listet UmlautAdaptarrEX deine Prowlarr-Indexer auf und übernimmt beide Schritte (Tag
setzen + `https`→`http`) für die ausgewählten Indexer. Der Dialog ist Teil des Setup-Wizards und
jederzeit unter **Settings → Prowlarr → „Indexer patchen"** erreichbar. „Alle auswählen" ist
Default; das Abwählen eines bereits gepatchten Indexers setzt Tag und Schema wieder zurück. Der
Dialog erklärt außerdem, warum die Umstellung nötig ist und dass die Verbindung zum Indexer im
Internet weiterhin `https` bleibt (es verlässt kein unverschlüsselter Datenverkehr dein System).
4. **Test All Indexers** ausführen. Bei verbliebenen `https`-URLs erscheint eine Warnung in den Live-Logs.
## Konfiguration ohne Prowlarr-Proxy
> Anmerkung : Aktuell noch nicht getestet
Bei wenigen Indexern oder ohne Prowlarr direkt in Sonarr/Radarr/Lidarr/Readarr je Indexer als API-URL eintragen:
```
http://:5005//
```
API-Key wird normal gesetzt. Den `apiKey` für UmlautAdaptarrEX erzeugst du im Web-UI.
Die vollständige HTTP-API (Admin, Auth, Legacy, WebSocket, TCP-Proxy) ist in [docs/api.md](docs/api.md) dokumentiert.
Die Release-Rename-Pipeline ist in [docs/renaming.md](docs/renaming.md) beschrieben. Wer das Projekt forken und auf
eigenen GitHub-Owner / Docker-Hub-Namespace umflaggen will, findet die Anleitung in
[docs/forking.md](docs/forking.md) — inkl. `scripts/rebrand.sh` für die statischen Defaults und der drei Runtime-Hebel
(`DOCKERHUB_IMAGE`, `UMLAUTADAPTARREX_IMAGE`, `NEXT_PUBLIC_GITHUB_OWNER` / `NEXT_PUBLIC_GITHUB_REPO`).
## Local Development
```sh
pnpm install
cp .env.example .env
pnpm prisma:migrate
pnpm dev
# Web-UI: http://localhost:5007
# Fastify API: http://localhost:5005
# Prowlarr-Proxy: tcp://localhost:5006
```
### Development Container (VS Code)
Für eine reproduzierbare Dev-Umgebung kannst du den enthaltenen Devcontainer nutzen:
1. Repository in VS Code öffnen.
2. `Dev Containers: Reopen in Container` ausführen.
3. Nach dem Container-Start: `pnpm dev`.
Der Container enthält Node 26 (Dev und Produktions-Image) + pnpm 11.11.0, leitet die Ports `5005/5006/5007` weiter und setzt empfohlene VS Code
Extensions/Settings für TypeScript, Next.js, Prisma, Tailwind, ESLint/Prettier, Vitest und Playwright.
Nach `pnpm dev` erreichst du die UI über Port `5007` und die API über Port `5005` (direkt oder über VS Code Port
Forwarding). Der TCP-Proxy ist auf Port `5006` erreichbar.
### Tests
```sh
pnpm test # vitest (unit + integration)
pnpm test:e2e # playwright (baseURL = http://localhost:5005)
pnpm typecheck
pnpm lint
```
## Projektstruktur
```
src/
├─ app/ # Next.js App Router (Web-UI)
├─ components/ # React + shadcn UI
├─ server/ # Fastify-Gateway, TCP-Proxy, Sync-Worker, Logging
├─ domain/ # Framework-freier Kern
│ ├─ normalization/ # Titelnormalisierung
│ ├─ variations/ # Titelvarianten
│ ├─ matching/ # Release-Matching
│ ├─ plugins/ # Sprach-Plugins (DE-Umlaute, SE-Umlaute, FR-Akzente)
│ └─ xml/ # Newznab/Torznab-XML-Rewriting
├─ providers/ # Externe Title-Provider (pcjones, TVDB, TMDB, db-cache)
├─ arr/ # Sonarr/Radarr/Lidarr/Readarr/Prowlarr-Clients
├─ schemas/ # Zod-Schemas (shared client/server)
├─ messages/ # i18n (de.json, en.json)
└─ lib/ # db, auth, secrets, legacy-env, i18n, utils
```
## Stack
- Node 24+ (Produktions-Image: Node 26) / TypeScript / pnpm 11
- Next.js 16 / React 19 / Tailwind 4 / shadcn (new-york)
- Fastify 5 / Prisma 7 / SQLite (better-sqlite3)
- Zod 4 / next-intl / @tanstack/react-query
- Vitest 4 / Playwright
## Kontakt & Support
- GitHub Issues für Bugreports und Feature-Requests
- [UsenetDE Discord](https://discord.gg/src6zcH4rr) → `#umlautadaptarr`
## Credits
Basiert auf der Idee und Logik von [PCJones/UmlautAdaptarr](https://github.com/PCJones/UmlautAdaptarr).
Danke an [xopez](https://github.com/xopez) für die TrueNAS-Community-App.
## Disclaimer
UmlautAdaptarrEX ist ein technischer Kompatibilitäts-Proxy. Die Software lädt selbst keine Inhalte herunter, umgeht
keine technischen Schutzmaßnahmen (DRM) und stellt keine Verbindung zu Indexern her, die nicht zuvor in den \*arrs oder
in Prowlarr konfiguriert wurden.
Das Projekt ist ausschließlich für die Nutzung mit legalen Quellen gedacht, etwa eigenen Sicherungskopien, regulär
abonnierten Usenet- oder Tracker-Diensten, gemeinfreien Werken sowie Inhalten mit ausdrücklicher Lizenz des
Rechteinhabers. Die Verantwortung für die rechtmäßige Nutzung der \*arrs und der angebundenen Indexer liegt
vollständig beim jeweiligen Betreiber.
Die Autoren übernehmen keine Haftung für eine zweckfremde oder rechtswidrige Verwendung. In Deutschland gilt
insbesondere das Urheberrechtsgesetz (UrhG), vergleichbare Regelungen bestehen in anderen Ländern. Die Software wird
"wie besehen" bereitgestellt, ohne jegliche Gewährleistung (siehe MIT-Lizenz).
## License
MIT